——谷歌董事長埃里克·施密特(Eric Schmidt)
我們或許生活在一個人類歷史上最具決定性的時期:從大型計算機到個人電腦,再到云計算時代。重要的不是過去已經(jīng)發(fā)生了什么,而是未來將會發(fā)生什么。
數(shù)據(jù)科學導論:
https://courses.analyticsvidhya.com/courses/introduction-to-data-science-2/?utm_source=blog&utm_medium=essentialMLalgorithmsarticle
認證計劃:面向數(shù)據(jù)科學初學者:
https://courses.analyticsvidhya.com/bundles/data-science-beginners-with-interview
本文主要圍繞常用的機器學習算法:算法覆蓋——線性回歸、邏輯回歸、樸素貝葉斯(Naive Bayes)、kNN、隨即森林,等等。主要學習在R語言和Python中這些算法的理論和實現(xiàn)應用。
誰能從這篇指南中獲益最多?
本文要講的內容,可能是作者寫過的最有價值的指南了。
寫這篇指南的主要目的是幫助世界上那些有抱負的數(shù)據(jù)科學家和機器學習愛好者們簡化他們的學習旅程。
本指南會幫助你解決機器學習問題,并獲得一些實踐經(jīng)驗。我將提供對于多個機器學習算法的高水平理解,以及運行這些算法的 R語言代碼和Python代碼。這些應該足夠讓你親自動手試一試了。
我特地跳過了這些技術背后的統(tǒng)計數(shù)據(jù),因為一開始你還不需要了解這些東西。因此,如果你想要從統(tǒng)計數(shù)據(jù)層面理解這些算法的話,那你可以去別的地方找找。但是,如果你想要為構建機器學習項目做好準備的話,那你應該會收獲頗豐。
廣義上來說,有3種機器學習算法
1. 監(jiān)督式學習(Supervised Learning)
工作機制:該算法由一個目標/結果變量(或因變量)組成,該變量由已知的一系列預測變量(自變量)計算而來。利用這一系列變量,我們生成一個將輸入值映射到所需輸出值的函數(shù)。該訓練過程會持續(xù)進行,直到模型在訓練數(shù)據(jù)上達到預期精確度。監(jiān)督式學習的例子有:回歸(Regression)、決策樹(Decision Tree)、隨機森林(Random Forest)、K最近鄰(KNN)、邏輯回歸(Logistic Regression)等等。
決策樹:
https://www.analyticsvidhya.com/blog/2015/01/decision-tree-simplified/)
隨機森林:
https://www.analyticsvidhya.com/blog/2014/06/introduction-random-forest-simplified/)
2. 非監(jiān)督式學習(Unsupervised Learning)
工作機制:在該算法中,我們不預測或估計任何目標變量或結果變量。此算法用于不同組內的聚類分析,被廣泛用于對不同群體的客戶進行細分,從而進行特定的干預。非監(jiān)督式學習的例子有:Apriori算法、K–均值算法。
3. 強化學習(Reinforcement Learning)
工作機制:該算法能夠訓練機器進行決策。其工作原理為:讓機器處于一個能夠通過反復試錯來訓練自己的環(huán)境中。機器從過去的經(jīng)驗中進行學習,并試圖通過學習最合適的知識來作出精準的商業(yè)判斷。強化學習的例子有:馬爾可夫決策過程(Markov Decision Process)。
常見機器學習算法列表
下面是一些常用的機器學習算法。這些算法幾乎可以應用于所有數(shù)據(jù)問題:
1. 線性回歸(Linear Regression)
2. 邏輯回歸(Logistic Regression)
3. 決策樹(Decision Tree)
4. SVM
5. 樸素貝葉斯(Naive Bayes)
6. K最近鄰(kNN)
7. K均值算法(K-Means)
8. 隨機森林(Random Forest)
9. 降維算法(Dimensionality Reduction Algorithms)
10. 梯度提升算法(Gradient Boosting algorithms)
[1] GBM
[2] XGBoost
[3] LightGBM
[4] CatBoost
1. 線性回歸(Linear Regression)
線性回歸常用于根據(jù)連續(xù)變量估計實際數(shù)值(房屋成本、電話呼叫次數(shù)、總銷售額等)。在此,我們通過擬合一條最佳直線來建立自變量和因變量之間的關系。這條最佳擬合直線被稱為回歸線,用線性方程Y= a *X + b 來表示。
回顧童年經(jīng)歷能幫你更好地理解線性回歸。假設讓一個五年級的孩子在不問對方體重的情況下,將班上的同學按體重從輕到重進行排序,你覺得他(她)會怎么做?他(她)很可能會觀察同學們的身高和體型,通過綜合這些可見的參數(shù)來進行排序。這就是線性回歸在實際生活中應用的例子。這個孩子實際上已經(jīng)發(fā)現(xiàn)了身高、體型與體重之間有一定的關系,此關系類似于上面的等式。
在這個等式中:
· Y – 因變量
· a – 斜率
· X – 自變量
· b – 截距
系數(shù)a、b是通過最小化數(shù)據(jù)點與回歸線之間距離的平方差之和而得到的。
在下面這個例子中,我們確定了最佳擬合線 y=0.2811x+13.9。已知人的身高,我們可以通過這個方程來求出其體重。
線性回歸主要有一元線性回歸和多元線性回歸兩種。一元線性回歸的特點是只有一個自變量。多元線性回歸的特點,顧名思義,存在多個自變量。在尋找最佳擬合直線時,可以擬合到多項或曲線回歸。這就被稱為多項或曲線回歸。
現(xiàn)在,你可以試著通過以下鏈接中的編碼窗口用Python來構建自己的線性回歸模型了:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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)
不要被它的名字迷惑了!這不是一個回歸算法,而是一個分類算法。該算法能根據(jù)已知的一系列因變量來估計離散值(比如二進制數(shù)值0或/1 ,是/否,真/假)。簡單來說,它通過將數(shù)據(jù)擬合到一個邏輯函數(shù)來預測一件事發(fā)生的概率。
因此,它也被叫做邏輯回歸(logit function)。因為它預測的是概率,所以其輸出值(和預期一樣)位于0 和 1 之間。
邏輯回歸:
https://en.wikipedia.org/wiki/Logistic_function
讓我們再次通過一個簡單的例子來理解以下這個算法。
如果你的朋友給你出了一道難題。只有兩種結果:要么你解開了,要么沒解開?,F(xiàn)在想象一下,假設你需要解答很多道題來找出你所擅長的主題,那么該研究的結果會像是這樣:如果題目是一道十年級的三角函數(shù)題,那么你有 70%的可能會解開這道題。然而,如果題目是一道五年級的歷史題,你只有30%的可能性會回答正確。這就是邏輯回歸能提供給你的。
從數(shù)學上看,結果中機率的對數(shù)使用的是預測變量的線性組合模型。
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
p是興趣特征出現(xiàn)的概率。它選擇了使觀察樣本值的可能性最大化的值作為參數(shù),而沒有(像一般的回歸分析用到的一樣)選使誤差平方和最小化的值。
現(xiàn)在,你或許要問,為什么要求出對數(shù)呢?簡而言之,這種方法是復制階梯函數(shù)的最佳數(shù)學方法之一。我也可以講得更詳細一些,但那就違背本篇指南的主旨了。
請在以下鏈接中用Python構建自己的邏輯回歸模型并檢查其準確性:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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)
此外……
你還可以嘗試不同的方法來改進該模型:
· 加入交互項
· 精簡模型特征
· 正規(guī)化方法
· 使用非線性模型
正規(guī)化方法:
https://www.analyticsvidhya.com/blog/2015/02/avoid-over-fitting-regularization/
這是我最喜歡也是使用最頻繁的算法之一。該監(jiān)督式學習算法常被用于分類問題。它,出人意料地,同時適用于分類因變量和連續(xù)因變量。在這個算法中,我們將總體分為兩個或更多的同類群?;谧钪匾膶傩?自變量來分成盡可能不同的組別。
要想了解更多相關信息,你可以閱讀以下文章:
Decision Tree Simplified 簡化決策樹
圖源: statsexchange
如上圖所示,根據(jù)多個屬性,人群被分為四個不同的小組,從而確定他們“會不會去玩”。為了將總人群分成不同的組別,需要用到很多技術,如基尼系數(shù)(Gini)、信息增益(Information Gain)、卡方(Chi-square)、熵(entropy)。
了解決策樹工作機制的最好方式是玩Jezzball,這是一款來自于微軟的經(jīng)典游戲(見下圖)。游戲的玩法是:在一個可以移動墻壁的房間里,你需要通過創(chuàng)建墻壁來分割出沒有小球的最大空間。
因此,當你每次用墻壁來分隔房間時,都是試圖在同一間房里創(chuàng)建兩個不同的部分。決策樹以非常相似的機制工作,即把總體盡可能地分割到不同的組里去。
更多信息參見: Simplified Version of Decision Tree Algorithms 決策樹算法簡化版
下面親自動手用Python編寫自己的決策樹吧:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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)
SVM是一種分類方法。在此算法中,我們將每個數(shù)據(jù)繪制為N維空間中的一個點(其中N是你所有的特征總數(shù)),每個特征的值對應一個坐標值。
例如,假設我們只有身高和頭發(fā)長度兩個特征,那么我們就在二維空間中標出這兩個變量,其中每個點都有兩個坐標,這些坐標被稱為支持向量(Support Vectors)。
現(xiàn)在,我們要找到一些能夠將兩組不同數(shù)據(jù)分開的直線。找到符合要求的最優(yōu)線:兩個分組中距離該線最近的點到這條線的距離最遠。
上圖中,中間黑線將所有數(shù)據(jù)分為兩組,兩組中距離線最近的點(圖中A、B點)到達黑線的距離滿足最優(yōu)條件(距離該線最遠)。因此,這條直線就是我們的分類器。接下來,只要測試數(shù)據(jù)落到直線的哪一邊,就將其分為哪一類。
更多信息參見: Simplified Version of Support Vector Machine支持向量機的簡化
將這個算法想像成是在N維空間里玩JezzBall游戲,那么要調整的是:
· 現(xiàn)在你可以以任意角度畫線/平面(而不是像經(jīng)典游戲中那樣只能在水平或者豎直方向畫線)。
· 游戲的目的變成了把不同顏色的球分割在不同的空間里。
· 球的位置不會改變。
現(xiàn)在試著動手在以下窗口中用Python來設計一個SVM模型吧:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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英寸,那么這個水果可能會是蘋果。即便這些特征互相依賴,或者依賴于其他特征的存在,樸素貝葉斯分類器還是會假設這些特征分別獨立,暗示這個水果是蘋果。
樸素貝葉斯模型易于構建,且對于大型數(shù)據(jù)集尤其有用。除了簡單之外,樸素貝葉斯的表現(xiàn)甚至超過了非常復雜的分類方法。
貝葉斯定理提供了一種從P(c)、P(x)和P(x|c) 計算后驗概率 P(c|x) 的方法??匆幌乱韵碌仁剑?/span>
這里,
· P(c|x) 是已知預測變量(屬性)的前提下,類(目標)的后驗概率
· P(c) 是類的先驗概率
· P(x|c) 是可能性,即已知類的前提下,預測變量的概率
· P(x) 是預測變量的先驗概率
例子:讓我們用一個例子來理解一下這個概念。下面有一個天氣的訓練數(shù)據(jù)集和對應的目標變量“玩”?,F(xiàn)在,我們需要根據(jù)天氣情況,將“玩”和“不玩”的參與者進行分類。我們可以按照以下步驟來執(zhí)行:
第1步:把數(shù)據(jù)集轉換成頻率表。
第2步:利用概率(如當Overcast可能性=0.29時,玩耍的可能性為0.64),創(chuàng)建Likelihood表格。
第3步:現(xiàn)在,使用樸素貝葉斯方程來計算每一類的后驗概率。后驗概率最高的一類就是預測結果。
問題:如果天氣晴朗,參與者就能玩。該陳述正確嗎?
這個問題可以用上面討論的方法求解,所以 P(玩 | 晴朗)= P(晴朗 | 玩)* P(玩)/ P (晴朗)
我們有 P (晴朗 |玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(玩)= 9/14 = 0.64
現(xiàn)在,P(玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,這可能性更大。
樸素貝葉斯使用相似的方法來預測不同屬性的不同類的概率。該算法多用于文本分類,和涉及多個類的問題。
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. kNN K-最近鄰算法(k- Nearest Neighbors)
kNN算法可用于分類和回歸問題。然而,K–最近鄰算法更常用于行業(yè)中的分類問題。K–最近鄰算法是一個簡單的算法,它存儲所有可用的案例,并通過k個案例中的大多數(shù)情況給新案例分類。根據(jù)一個距離函數(shù),新案例會被分配到通過距離函數(shù)測得的K個近鄰中最常見的類中去。
這些距離函數(shù)可以是歐幾里得距離(Euclidean)、曼哈頓距離(Manhattan)、閔可夫斯基距離(Minkowski)和漢明距離(Hamming)。前三個函數(shù)用于連續(xù)函數(shù),第四個函數(shù)(漢明)被用于分類變量。如果 K=1,則該案例就直接被分配給離它最近的案例的類。有時,執(zhí)行KNN建模時,選擇 K 的大小確實是一個挑戰(zhàn)。
我們的現(xiàn)實生活中常常會應用到KNN。如果你想要了解一個陌生人,你或許會想去找他的好朋友或所處的圈子來獲取信息。
選擇kNN前需要考慮的事情:
· KNN的計算成本很高。
· 變量應該統(tǒng)一化,否則范圍較大的變量可能會造成偏差。
· 在進行kNN處理之前,要在處理階段的離群點、噪音去除等方面多下功夫。
Python 代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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)
這是一種能解決聚類問題的非監(jiān)督式學習算法。其過程簡單易行,將給定數(shù)據(jù)分類到一定數(shù)量的集群中去(假設有 k 個集群)。一個集群內的數(shù)據(jù)點對于對等集群來說是同質,且異構的。
還記得從墨跡中找出形狀的方法嗎?從某種程度上來說,K-均值算法與此有點類似。觀察形狀及延伸方式來辨認有多少種集群。
K-均值怎樣形成集群:
1. K-均值為每個集群選擇k個點,稱為質心(centroid)。
2. 每個數(shù)據(jù)點與最近的質心形成一個集群,即k個集群。
3. 根據(jù)現(xiàn)有的集群成員查找每個集群的質心,然后就有了新的質心。
4. 當有了新的質心后,重復步驟2和3。找到每個數(shù)據(jù)點距離新質心的最近距離,然后與新的k-集群相關聯(lián)。重復這個過程直至匯聚,即質心不再改變。
如何確定K值:
在K–均值算法中,我們有集群,每個集群有自己的質心。一個集群內的質心和各數(shù)據(jù)點之間距離的平方和形成了這個集群的平方值之和。此外,當所有集群的平方值之和相加,就組成了集群方案的平方值之和。
我們知道,隨著集群數(shù)量的增加,K值會不斷下降。但是,如果將結果繪制成圖表,就會發(fā)現(xiàn)距離的平方和在急劇減少。到達某一K值后,減少的速度會大幅放緩。我們可以在此找到集群數(shù)量的最優(yōu)值。
Python 代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
R 語言代碼:
library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution
8. 隨機森林(Random Forest)
隨機森林是決策樹的總體專有名詞。在隨機森林算法中,我們有一系列決策樹(因此,被稱為“森林”)。為了根據(jù)屬性將新對象進行分類,每一棵決策樹都給出一個分類,稱之為該決策樹為該分類“投票”。森林選擇(在所有樹中)獲得票數(shù)最多的分類。
每棵樹的種植&培育過程:
1. 假設訓練集中的案例數(shù)為N,則使用重置抽樣法在N個案例中隨機抽取樣本。該樣本將作為此樹生長的訓練集。
2. 假設有M個輸入變量,則定義數(shù)字m<<M。m表示從M中隨機選擇m個變量,該m中最好的切分將被用來切分該節(jié)點。M值在森林生長過程中保持不變。
3. 每棵樹都盡可能地生長,不進行任何修剪。
如果你想了解更多關于此算法的詳細信息,比較決策樹和優(yōu)化模型參數(shù),可以閱讀以下文章:
1. Introduction to Random forest – Simplified 隨機森林簡介-簡化版
2. Comparing a CART model to Random Forest (Part 1) 比較CART模型與隨機森林(上)
3. Comparing a Random Forest to a CART model (Part 2) 比較隨機森林與CART模型(下)
4. Tuning the parameters of your Random Forest model 調節(jié)隨機森林模型參數(shù)
Python代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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年里,在很多階段,信息都呈指數(shù)級增長。企業(yè)/政府機構/研究組織不僅帶來了新資源,還捕捉著詳盡的數(shù)據(jù)。
例如,電子商務公司正在獲取更為詳細的顧客的資料:人口統(tǒng)計信息、網(wǎng)頁瀏覽記錄、個人喜惡、購買記錄、反饋,以及其他多種信息,比你附近雜貨店的售貨員更加關注你。
作為數(shù)據(jù)科學家,我們提供的數(shù)據(jù)也包含許多特點,聽起來很適合構建良好且健壯的模型,但仍存在挑戰(zhàn):如何從 1000 或者 2000 個變量中里識別出最重要的變量呢?在這種情況下,降維算法和其他各算法(如決策樹、隨機森林、PCA、因子分析、給予相關矩陣的識別、缺失值比等)能夠一起為我們提供幫助。
要想了解有關此算法的更多信息,可以閱讀“Beginners Guide To Learn Dimension Reduction Techniques 降維技術初學者指南”。
Python 代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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
當我們要利用大量數(shù)據(jù)進行有高預測力的預測時,會使用到GBM這種提升算法。提升算法(boosting)是多種學習算法的集成,它結合了建立在多個基礎估計值基礎上的預測結果,從而提高單一估計值的可靠性。這些提升算法通常在Kaggl、AV Hackathon、CrowdAnalytix等數(shù)據(jù)科學比賽中表現(xiàn)出色。
更多信息詳見: Know about Boosting algorithms in detail 詳細了解提升算法
Python 代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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]
10.2. XGBoost
這在某些Kaggle競賽中,決定勝負的另一種經(jīng)典梯度提升算法。
XGBoost具有極高的預測能力,這使其成為預測事件準確性的最佳選擇。它同時具有線性模型和樹學習算法的優(yōu)點,這使得該算法比現(xiàn)有的梯度提升技術快了近10倍。
此算法支持包括回歸、分類和排序在內的多種目標函數(shù)。
有關XGBoost的最有趣的事情之一是,它也被稱為正則化增強技術(regularized boosting technique)。這有助于減少模型過擬合,并為Scala、Java、R、Python、Julia 和C++等語言提供了大量支持。
算法支持在GCE、AWS、Azure 和Yarn clusters等許多計算機上進行訓練。
想要了解更多關于XGBoost和參數(shù)調整的信息,可以訪問:
https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/
Python 代碼:
https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/?&utm_source=coding-window-blog&source=coding-window-blog
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
訓練速度更快且效率更高
降低內存使用量
精準度更高
支持并行和GPU學習
能夠處理大規(guī)模數(shù)據(jù)
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 語言代碼:
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語言中的Caret包的話,以下是實現(xiàn)LightGBM的快速方法。
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最近發(fā)布的一款開源機器學習算法。它可以輕松地與深度學習框架(如Google的TensorFlow和Apple的Core ML)集成。
CatBoost最大的優(yōu)點在于,它不需要像其他ML模型那樣進行大量的數(shù)據(jù)訓練,并且可以處理多種數(shù)據(jù)格式,不會破壞其穩(wěn)健性。
Catboost可以自動處理分類變量,而不會顯示類型轉換錯誤,這有助于你更好地專注于模型調整,而不是解決各種瑣碎的錯誤。
要想了解更多關于Catboost的信息,可以參考本文:
https://www.analyticsvidhya.com/blog/2017/08/catboost-automated-categorical-data/
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)
結語
至此,我敢肯定你已經(jīng)對常用的機器學習算法有了一定的了解了。作者寫這篇文章并提供相應的R語言代碼和Python代碼的唯一目的就是幫助你找到起點。如果你想要完全掌握機器學習算法的話,那就馬上開始吧。著手解決問題,加深對過程的理解,將這些代碼用起來并從中發(fā)現(xiàn)樂趣!
這篇文章對你來說有幫助嗎?請在下面評論區(qū)分享你的觀點和想法。
【end】
◆