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