機器學習十大算法總覽(含Python3.X和R語言代碼)


    • 引言
    • 一監督學習
    • 二無監督學習
    • 三強化學習
    • 四通用機器學習算法列表
      • 線性回歸Linear Regression
      • 邏輯回歸Logistic Regression
      • 決策樹Decision Tree
      • 支持向量機SVM Support Vector Machine
      • 朴素貝葉斯Naive Bayes
      • K近鄰KNN K- Nearest Neighbors
      • K均值K-Means
        • K-means如何形成群類
      • 隨機森林Random Forest
      • 降維算法Dimensionality Reduction Algorithms
      • 梯度提升算法Gradient Boosting Algorithms
        • 1 GBM
        • 2 XGBoost
        • 3 LightGBM
        • 4 Catboost
    • 總結

 

引言

這里寫圖片描述

整體來說,機器學習算法可以分為3大類

一、監督學習:

工作原理:該算法由自變量(協變量、預測變量)和因變量(結果變量)組成,由一組自變量對因變量進行預測。通過這些變量集合,我們生成一個將輸入映射到輸出的函數。 訓練過程達到我們設定的損失閾值停止訓練,也就是使模型達到我們需要的准確度等水平。

監督學習的例子:回歸,決策樹,隨機森林,KNN,邏輯回歸等

二、無監督學習:

工作原理:在無監督學習算法中,我們沒有目標或結果變量來預測。 通常用於不同群體的群體聚類。

無監督學習的例子:Apriori算法,K-means。

三、強化學習:

工作原理: 強化學習(reinforcement learning),又稱再勵學習、評價學習,學習不是單一方法,而是一種機器學習方式,在智能控制機器人及分析預測等領域有許多應用。

強化學習例子:馬爾可夫決策過程

四、通用機器學習算法列表

此處列舉常用的機器學習算法, 這些算法幾乎可以應用於所有的數據問題:

  1. 線性回歸
  2. Logistic回歸
  3. 決策樹
  4. SVM
  5. 朴素貝葉斯
  6. KNN
  7. K均值
  8. 隨機森林
  9. 降維算法
  10. 梯度提升算法 
    1.GBM 
    2.XGBoost 
    3.LightGBM 
    4.CatBoost

1.線性回歸(Linear Regression)

它用於連續變量的估計(比如說房屋成本,總銷售額等)。 此處,我們通過擬合自變量和因變量之間的最佳擬合直線來建立它們之間的關系。 這條線就被叫做回歸線,由線性方程表示為:y=aX+b

在上述等式中,各自代表意義如下:

  • Y - 因變量
  • a - 斜率,坡度
  • X - 自變量
  • b - 截距項

系數a和b是基於數據點與回歸線之間的距離的差的平方之和最小化而得出的。

看下面的例子。 這里我們已經確定了具有線性方程y = 0.2811x + 13.9的最佳擬合線。 現在使用這個等式,可以由一個人的重量,知道一個人的大體身高:

這里寫圖片描述

線性回歸主要有兩種類型:簡單線性回歸和多元線性回歸:

  • 簡單線性回歸的特征是一個自變量。
  • 多元線性回歸(顧名思義)是以多個(多於一個)自變量為特征的。

Python 代碼

#Import Library #Import other necessary libraries like pandas, numpy... from sklearn import linear_model #Load Train and Test datasets #Identify feature and response variable(s) and values must be numeric and numpy arrays x_train=input_variables_values_training_datasets y_train=target_variables_values_training_datasets x_test=input_variables_values_test_datasets # Create linear regression object linear = linear_model.LinearRegression() # Train the model using the training sets and check score linear.fit(x_train, y_train) linear.score(x_train, y_train) #Equation coefficient and Intercept print('Coefficient: \n', linear.coef_) print('Intercept: \n', linear.intercept_) #Predict Output predicted= linear.predict(x_test)

R 語言代碼

#Load Train and Test datasets #Identify feature and response variable(s) and values must be numeric and numpy arrays x_train <- input_variables_values_training_datasets y_train <- target_variables_values_training_datasets x_test <- input_variables_values_test_datasets x <- cbind(x_train,y_train) # Train the model using the training sets and check score linear <- lm(y_train ~ ., data = x) summary(linear) #Predict Output predicted= predict(linear,x_test) 

2. 邏輯回歸(Logistic Regression)

這個算法的名字具有迷惑性,從建模任務的角度來看,這是一種分類而不是回歸算法。 它用於基於給定的一組自變量估計因變量(離散值(二進制值,如0/1,是/否,真/假)),當然也用於多分類的任務。 簡而言之,它通過將數據擬合到logit函數來預測事件發生的可能性。 因此,它也被稱為logit回歸。 因為它預測了概率,其輸出值在0和1之間:

從統計學的角度來看就是自變量的線性組合建模得出因變量y的結果,然后,這個線性組合被表示成分類事件發生概率與不發生概率的對數函數,具體公式如下:

odds=p1p=

ln(odds)=ln(p1p)=b0+b1X1+b2X2+b3X3....+bkXk

以上,p是存在的我們感興趣的特征預測發生的概率。

Python代碼

#Import Library from sklearn.linear_model import LogisticRegression #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create logistic regression object model = LogisticRegression() # Train the model using the training sets and check score model.fit(X, y) model.score(X, y) #Equation coefficient and Intercept print('Coefficient: \n', model.coef_) print('Intercept: \n', model.intercept_) #Predict Output predicted= model.predict(x_test)

R 語言代碼

x <- cbind(x_train,y_train) # Train the model using the training sets and check score logistic <- glm(y_train ~ ., data = x,family='binomial') summary(logistic) #Predict Output predicted= predict(logistic,x_test)

3.決策樹(Decision Tree)

決策樹算法 是一種主要用於分類問題的監督學習算法。 但是它是個兩面身吆,既適用於分類也適用於連續因變量的預測也就是回歸,所以通常會說回歸樹或者分類樹。 下面是一棵樹的簡化版:

這里寫圖片描述

在上面的圖片中,可以看到根據多個屬性最終將人口分為四個不同的組,以識別“他們是否會玩”。 這其中根據不同的決策樹算法又會使用基尼指數,信息增益,卡方,熵等多種不同的技術。

Python代碼

#Import Library #Import other necessary libraries like pandas, numpy... from sklearn import tree #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create tree object model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini # model = tree.DecisionTreeRegressor() for regression # Train the model using the training sets and check score model.fit(X, y) model.score(X, y) #Predict Output predicted= model.predict(x_test)

R 語言代碼

library(rpart) x <- cbind(x_train,y_train) # grow tree fit <- rpart(y_train ~ ., data = x,method="class") summary(fit) #Predict Output predicted= predict(fit,x_test)

4. 支持向量機(SVM –Support Vector Machine)

支持向量機是一種分類和回歸算法。 在這個算法中,我們將每個數據項繪制為n維空間中的一個點(其中n是您擁有的特征的數量),每個特征的值是特定坐標的值。也就是將數據映射到高維空間。

例如,如果我們只有一個人的身高和頭發長度兩個特征,我們首先將這兩個變量繪制在二維空間中,每個點有兩個坐標(這些坐標被稱為支持向量)

這里寫圖片描述

現在,我們將找到一些將兩個不同分類的數據分割的線。 我們真正要找的是這樣一條線,兩個組中離這條線各自最近的的點,整體上相對於所有線來說這兩個點到此線的距離最大。

這里寫圖片描述

在上面所示的例子中,將數據分成兩個不同分類組的線是黑線,因為兩個最近的點離線距離和最遠。 這條線就是我們的分類器。 然后,根據測試數據在線兩側的位置,可以將新數據分類到相應的類別。

Python代碼

#Import Library from sklearn import svm #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create SVM classification object model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. # Train the model using the training sets and check score model.fit(X, y) model.score(X, y) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(e1071) x <- cbind(x_train,y_train) # Fitting model fit <-svm(y_train ~ ., data = x) summary(fit) #Predict Output predicted= predict(fit,x_test)

5. 朴素貝葉斯(Naive Bayes)

朴素貝葉斯是一種基於貝葉斯定理的分類算法,假設條件時預測變量之間是相互獨立的。 簡而言之,朴素貝葉斯分類器假設類中特定特征的存在與任何其他特征的存在無關。 例如,如果水果是紅色的,圓形的,並且直徑約3英寸,則水果可以被認為是蘋果。 即使這些特征彼此依賴或者依賴於其他特征的存在,朴素貝葉斯分類器也會考慮所有這些特性來獨立地貢獻這個果實是蘋果的可能性。

朴素貝葉斯模型易於構建,特別適用於非常大的數據集。

貝葉斯定理提供了一種從PcPxPx|c計算后驗概率Pc|x的方法。 看下面的公式:

這里寫圖片描述

這里:

  • Pc|x是給定預測器(屬性)的類(目標)的后驗概率。
  • Pc是判斷為此類的先驗概率。
  • Px|c是預測器給定類的概率的可能性。
  • Px是自變量X發生的先驗概率。

例子:讓我們用一個例子來理解它。 下面我有一個天氣為自變量及相應的目標變量“Play”組成的訓練數據集。 現在,我們需要根據天氣狀況來分類玩家是否玩游戲。 讓我們按照下面的步驟來執行它。

步驟1:將數據集轉換為頻率表

步驟2:從表中可以創建右側似然表格,可以計算出Overcast的比例=0.29,Play的頻率 = 0.64。

這里寫圖片描述

步驟3:現在,使用朴素貝葉斯公式來計算每個類別的后驗概率。 后驗概率最高的是預測相應類的結果。

問題:如果天氣晴朗,玩家會出去玩,這個說法是否正確?

我們可以用上面討論的方法來解決這個問題, 
PYes|SunnyPSunny|YesPYes/PSunny

這里我們有PSunny|Yes= 3/9 = 0.33,PSunny= 5/14 = 0.36,PYes= 9/14 = 0.64

現在,PYes|Sunny= 0.33 * 0.64 / 0.36 = 0.60,其概率較高,因此我們就認為晴天出去玩的可能性大。

Python代碼

#Import Library from sklearn.naive_bayes import GaussianNB #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link # Train the model using the training sets and check score model.fit(X, y) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(e1071) x <- cbind(x_train,y_train) # Fitting model fit <-naiveBayes(y_train ~ ., data = x) summary(fit) #Predict Output predicted= predict(fit,x_test)

6. K近鄰(KNN –K- Nearest Neighbors)

K近鄰算法可以用於分類和回歸問題。 但是,它在業內在分類問題上用的比較廣泛。 K個最近鄰居是對這個算法的簡單的描述,通過其k個鄰居的多數投票來分類。 某數據被分配到某一類是由距離函數測量的K個最近的鄰居中是最常出現的類別為它相應的類。

這些距離函數可以是歐幾里得,曼哈頓,閔可夫斯基和海明距離等。 前三個函數用於連續函數,第四個函數(Hamming)用於分類變量。 有時候,在執行KNN建模時選擇K是一個挑戰。

這里寫圖片描述

KNN可以很容易地映射到我們的真實生活中。 如果你想了解一個你沒有任何信息的人,你可能想知道他的密友和他的圈子,並因此獲得他/她的信息,類似六度空間理論!

Python代碼

#Import Library from sklearn.neighbors import KNeighborsClassifier #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create KNeighbors classifier object model KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5 # Train the model using the training sets and check score model.fit(X, y) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(knn) x <- cbind(x_train,y_train) # Fitting model fit <-knn(y_train ~ ., data = x,k=5) summary(fit) #Predict Output predicted= predict(fit,x_test)

7. K均值(K-Means)

K均值是一種解決聚類問題的無監督算法。通過一定數量的聚類(假設k個聚類)對給定的數據集進行分類。 集群內的數據點對同組來說是同質且異構的,就是類里盡量距離最近類間盡量最大距離。

K-means如何形成群類:

1.K-means為每個簇選取k個點,稱為質心。 
2.每個數據點形成具有最接近的質心(即k個聚類)的聚類。 
3.根據現有集群成員查找每個集群的質心。 這里我們有新的質心。 
4.由於我們有新的質心,請重復步驟2和3.從新質心找到每個數據點的最近距離,並與新的k-簇進行關聯。 重復這個過程直到收斂發生,即質心不變。

Python代碼

#Import Library from sklearn.cluster import KMeans #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset # Create KNeighbors classifier object model k_means = KMeans(n_clusters=3, random_state=0) # Train the model using the training sets and check score model.fit(X) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(cluster) fit <- kmeans(X, 3) # 5 cluster solution

8. 隨機森林(Random Forest)

隨機森林是決策樹的融合。 在隨機森林中,我們收集了決策樹(所謂的“森林”)。 為了根據屬性對一個新進來的數據進行分類,每棵樹都給出了該數據的一個分類,這些棵樹對類別進行“投票”。 森林選擇票數最多的分類為此新數據的類。

每棵樹按如下方式生長:

1.如果訓練集中的樣本數為N,從這N個樣本中有放回隨機抽取樣本,這些個樣本用來訓練生成樹。 
2.如果有M個輸入變量,則指定一個數m << M,使得在每個節點處,從M中隨機選擇m個變量,並且使用這些m上的最佳分割來分割節點。 在森林生長期間,m的值保持不變。 
3.每棵樹都盡可能地長大。 不給修剪。

Python代碼

#Import Library from sklearn.ensemble import RandomForestClassifier #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create Random Forest object model= RandomForestClassifier() # Train the model using the training sets and check score model.fit(X, y) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(randomForest) x <- cbind(x_train,y_train) # Fitting model fit <- randomForest(Species ~ ., x,ntree=500) summary(fit) #Predict Output predicted= predict(fit,x_test)

9. 降維算法(Dimensionality Reduction Algorithms)

在過去的4-5年里,采集的數據呈指數級增長。

例如:電子商務公司正在抓住更多關於客戶的細節,例如他們的上網歷史,他們喜歡什么或不喜歡什么,購買歷史等,使他們比雜貨店店主更注重客戶個性化推薦。

降維算法可以幫助我們連同決策樹,隨機森林,主成分分析,因子分析等進行數據分析。

Python代碼

#Import Library from sklearn import decomposition #Assumed you have training and test data set as train and test # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) # For Factor analysis #fa= decomposition.FactorAnalysis() # Reduced the dimension of training dataset using PCA train_reduced = pca.fit_transform(train) #Reduced the dimension of test dataset test_reduced = pca.transform(test)

R語言代碼

library(stats) pca <- princomp(train, cor = TRUE) train_reduced <- predict(pca,train) test_reduced <- predict(pca,test)

10. 梯度提升算法(Gradient Boosting Algorithms)

10.1 GBM

GBM是一種提升算法,處理大量的數據提高預測性能。 Boosting實際上是一些弱學習算法的集合,它結合了幾個弱算法估計量的預測,以提高預測的魯棒性。 它將多個弱預測指標或平均預測指標組合成一個強預測指標。 這些提升算法在Kaggle,AV Hackathon,CrowdAnalytix等數據科學競賽中表現突出。

Python代碼

#Import Library from sklearn.ensemble import GradientBoostingClassifier #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create Gradient Boosting Classifier object model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0) # Train the model using the training sets and check score model.fit(X, y) #Predict Output predicted= model.predict(x_test)

R語言代碼

library(caret) x <- cbind(x_train,y_train) # Fitting model fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4) fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE) predicted= predict(fit,x_test,type= "prob")[,2] 

GradientBoostingClassifier和Random Forest是兩個不同的提升樹分類器。

10.2 XGBoost

另一個經典的增強算法,被稱為Kaggle神器。因為使用這個算法得當,往往會取得較好的名次。

XGBoost具有非常好的預測能力,它有線性模型和樹模型算法,該算法比現有GBM快近10倍。

支持包括各種目標函數,包括回歸,分類和排序。

XGBoost也被叫做正則化的提升算法,因為它可以使用正則化減少模型的過擬合。Scala,Java,R,Python,Julia和C ++等一系列語言支持XGBoost。

關於XGBoost的參數和調參指南,請參考這篇文章,給出了參數詳解以及調參步驟以及實例分析。

Python代碼

from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X = dataset[:,0:10] Y = dataset[:,10:] seed = 1 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) model = XGBClassifier() model.fit(X_train, y_train) #Make predictions for test data y_pred = model.predict(X_test)

R語言代碼

require(caret) x <- cbind(x_train,y_train) # Fitting model TrainControl <- trainControl( method = "repeatedcv", number = 10, repeats = 4) model<- train(y ~ ., data = x, method = "xgbLinear", trControl = TrainControl,verbose = FALSE) #OR model<- train(y ~ ., data = x, method = "xgbTree", trControl = TrainControl,verbose = FALSE) predicted <- predict(model, x_test)

10.3 LightGBM

LightGBM是一個梯度提升框架,使用基於樹的學習算法。 它被設計成分布式,具有以下優點:

  • 更快的訓練速度和更高的效率
  • 降低內存使用量
  • 更好的准確性
  • 支持並行和GPU學習
  • 能夠處理大規模的數據

該框架是一種基於決策樹算法的快速高性能梯度提升算法,用於排序,分類等多種機器學習任務。 它是在Microsoft的分布式機器學習工具包項目下開發的。

Python代碼

data = np.random.rand(500, 10) # 500 entities, each contains 10 features label = np.random.randint(2, size=500) # binary target train_data = lgb.Dataset(data, label=label) test_data = train_data.create_valid('test.svm') param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'} param['metric'] = 'auc' num_round = 10 bst = lgb.train(param, train_data, num_round, valid_sets=[test_data]) bst.save_model('model.txt') # 7 entities, each contains 10 features data = np.random.rand(7, 10) ypred = bst.predict(data)

R語言代碼1

library(RLightGBM)
data(example.binary) #Parameters num_iterations <- 100 config <- list(objective = "binary", metric="binary_logloss,auc", learning_rate = 0.1, num_leaves = 63, tree_learner = "serial", feature_fraction = 0.8, bagging_freq = 5, bagging_fraction = 0.8, min_data_in_leaf = 50, min_sum_hessian_in_leaf = 5.0) #Create data handle and booster handle.data <- lgbm.data.create(x) lgbm.data.setField(handle.data, "label", y) handle.booster <- lgbm.booster.create(handle.data, lapply(config, as.character)) #Train for num_iterations iterations and eval every 5 steps lgbm.booster.train(handle.booster, num_iterations, 5) #Predict pred <- lgbm.booster.predict(handle.booster, x.test) #Test accuracy sum(y.test == (y.pred > 0.5)) / length(y.test) #Save model (can be loaded again via lgbm.booster.load(filename)) lgbm.booster.save(handle.booster, filename = "/tmp/model.txt")

R語言代碼2

require(caret) require(RLightGBM) data(iris) model <-caretModel.LGBM() fit <- train(Species ~ ., data = iris, method=model, verbosity = 0) print(fit) y.pred <- predict(fit, iris[,1:4]) library(Matrix) model.sparse <- caretModel.LGBM.sparse() #Generate a sparse matrix mat <- Matrix(as.matrix(iris[,1:4]), sparse = T) fit <- train(data.frame(idx = 1:nrow(iris)), iris$Species, method = model.sparse, matrix = mat, verbosity = 0) print(fit)

10.4. Catboost

CatBoost是Yandex最近開源的機器學習算法。 它可以很容易地與谷歌的TensorFlow和蘋果公司的核心ML等深度學習框架相結合。

CatBoost最棒的地方在於它不需要像其他ML模型那樣要大量數據訓練,對於不同的數據格式它也可以應付自如。

Python代碼

import pandas as pd import numpy as np from catboost import CatBoostRegressor #Read training and testing files train = pd.read_csv("train.csv") test = pd.read_csv("test.csv") #Imputing missing values for both train and test train.fillna(-999, inplace=True) test.fillna(-999,inplace=True) #Creating a training set for modeling and validation set to check model performance X = train.drop(['Item_Outlet_Sales'], axis=1) y = train.Item_Outlet_Sales from sklearn.model_selection import train_test_split X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234) categorical_features_indices = np.where(X.dtypes != np.float)[0] #importing library and building model from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE') model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True) submission = pd.DataFrame() submission['Item_Identifier'] = test['Item_Identifier'] submission['Outlet_Identifier'] = test['Outlet_Identifier'] submission['Item_Outlet_Sales'] = model.predict(test)

R語言代碼

set.seed(1) require(titanic) require(caret) require(catboost) tt <- titanic::titanic_train[complete.cases(titanic::titanic_train),] data <- as.data.frame(as.matrix(tt), stringsAsFactors = TRUE) drop_columns = c("PassengerId", "Survived", "Name", "Ticket", "Cabin") x <- data[,!(names(data) %in% drop_columns)]y <- data[,c("Survived")] fit_control <- trainControl(method = "cv", number = 4,classProbs = TRUE) grid <- expand.grid(depth = c(4, 6, 8),learning_rate = 0.1,iterations = 100, l2_leaf_reg = 1e-3, rsm = 0.95, border_count = 64) report <- train(x, as.factor(make.names(y)),method = catboost.caret,verbose = TRUE, preProc = NULL,tuneGrid = grid, trControl = fit_control) print(report) importance <- varImp(report, scale = FALSE) print(importance)

總結:

到目前為止,我相信,你會對常用的機器學習算法在腦袋中形成一個大體的框架。 那就馬上開始,如果你熱衷於掌握機器學習,拿起問題,應用這些代碼,享受建模的樂趣!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM