來源| analyticsvidhya
編譯| 火火醬,責編| Carol
出品 | AI科技大本營(ID:rgznai100)
谷歌的自動駕駛汽車和機器人得到了媒體的廣泛關注,但是公司真正的未來是在機器學習領域,這一技術會使計算機變得更加智能、更個性化。——谷歌董事長埃裡克·施密特(Eric Schmidt)
我們或許生活在一個人類歷史上最具決定性的時期:從大型計算機到個人電腦,再到雲計算時代。重要的不是過去已經發生了什麼,而是未來將會發生什麼。
對於我這類人來說,這個時代致命的吸引力來源於工具和技術的民主化,以及隨之而來的計算機的蓬勃發展。歡迎來到數據科學的世界!
如今,作為一名數據科學家,我用複雜算法建立的數據處理機器每小時能賺好幾美金。但是要做到這個程度是非常不容易的!我曾經歷過無數黑暗的日日夜夜。
如果你是一名正準備開始自己數據科學之旅的初學者。以下是兩門有關數據科學的全面課程,或許能夠幫助你(使用Python)從零開始了解這個領域:
數據科學導論:
https://courses.analyticsvidhya.com/courses/introduction-to-data-science-2/?utm_source=blog&utm_medium=essentialMLalgorithmsarticle
認證計劃:面向數據科學初學者:
https://courses.analyticsvidhya.com/bundles/data-science-beginners-with-interview
本文主要圍繞常用的機器學習算法:算法覆蓋——線性回歸、邏輯回歸、樸素貝葉斯(Naive Bayes)、kNN、隨即森林,等等。主要學習在R語言和Python中這些算法的理論和實現應用。
誰能從這篇指南中獲益最多?
本文要講的內容,可能是作者寫過的最有價值的指南了。
寫這篇指南的主要目的是幫助世界上那些有抱負的數據科學家和機器學習愛好者們簡化他們的學習旅程。
本指南會幫助你解決機器學習問題,並獲得一些實踐經驗。我將提供對於多個機器學習算法的高水平理解,以及運行這些算法的 R語言代碼和Python代碼。這些應該足夠讓你親自動手試一試了。
用R語言和Python實現機器學習算法的要點
我特地跳過了這些技術背後的統計數據,因為一開始你還不需要了解這些東西。因此,如果你想要從統計數據層面理解這些算法的話,那你可以去別的地方找找。但是,如果你想要為構建機器學習項目做好準備的話,那你應該會收穫頗豐。
廣義上來說,有3種機器學習算法
1. 監督式學習(Supervised Learning)
工作機制:該算法由一個目標/結果變量(或因變量)組成,該變量由已知的一系列預測變量(自變量)計算而來。利用這一系列變量,我們生成一個將輸入值映射到所需輸出值的函數。該訓練過程會持續進行,直到模型在訓練數據上達到預期精確度。監督式學習的例子有:回歸(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. 非監督式學習(Unsupervised Learning)
工作機制:在該算法中,我們不預測或估計任何目標變量或結果變量。此算法用於不同組內的聚類分析,被廣泛用於對不同群體的客戶進行細分,從而進行特定的幹預。非監督式學習的例子有:Apriori算法、K–均值算法。
3. 強化學習(Reinforcement Learning)
工作機制:該算法能夠訓練機器進行決策。其工作原理為:讓機器處於一個能夠通過反覆試錯來訓練自己的環境中。機器從過去的經驗中進行學習,並試圖通過學習最合適的知識來作出精準的商業判斷。強化學習的例子有:馬爾可夫決策過程(Markov Decision Process)。
常見機器學習算法列表
下面是一些常用的機器學習算法。這些算法幾乎可以應用於所有數據問題:
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)
線性回歸常用於根據連續變量估計實際數值(房屋成本、電話呼叫次數、總銷售額等)。在此,我們通過擬合一條最佳直線來建立自變量和因變量之間的關係。這條最佳擬合直線被稱為回歸線,用線性方程Y= a *X + b 來表示。
回顧童年經歷能幫你更好地理解線性回歸。假設讓一個五年級的孩子在不問對方體重的情況下,將班上的同學按體重從輕到重進行排序,你覺得他(她)會怎麼做?他(她)很可能會觀察同學們的身高和體型,通過綜合這些可見的參數來進行排序。這就是線性回歸在實際生活中應用的例子。這個孩子實際上已經發現了身高、體型與體重之間有一定的關係,此關係類似於上面的等式。
在這個等式中:
· Y – 因變量
· a – 斜率
· X – 自變量
· b – 截距
係數a、b是通過最小化數據點與回歸線之間距離的平方差之和而得到的。
在下面這個例子中,我們確定了最佳擬合線y=0.2811x+13.9。已知人的身高,我們可以通過這個方程來求出其體重。
線性回歸主要有一元線性回歸和多元線性回歸兩種。一元線性回歸的特點是只有一個自變量。多元線性回歸的特點,顧名思義,存在多個自變量。在尋找最佳擬合直線時,可以擬合到多項或曲線回歸。這就被稱為多項或曲線回歸。
現在,你可以試著通過以下連結中的編碼窗口用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 arraysx_train <- input_variables_values_training_datasetsy_train <- target_variables_values_training_datasetsx_test <- input_variables_values_test_datasetsx <- cbind(x_train,y_train)# Train the model using the training sets and check scorelinear <- lm(y_train ~ ., data = x)summary(linear)#Predict Outputpredicted= predict(linear,x_test)
2. 邏輯回歸(Logistic Regression)
不要被它的名字迷惑了!這不是一個回歸算法,而是一個分類算法。該算法能根據已知的一系列因變量來估計離散值(比如二進位數值0或/1 ,是/否,真/假)。簡單來說,它通過將數據擬合到一個邏輯函數來預測一件事發生的概率。
因此,它也被叫做邏輯回歸(logit function)。因為它預測的是概率,所以其輸出值(和預期一樣)位於0 和 1 之間。
邏輯回歸:
https://en.wikipedia.org/wiki/Logistic_function
讓我們再次通過一個簡單的例子來理解以下這個算法。
如果你的朋友給你出了一道難題。只有兩種結果:要麼你解開了,要麼沒解開。現在想像一下,假設你需要解答很多道題來找出你所擅長的主題,那麼該研究的結果會像是這樣:如果題目是一道十年級的三角函數題,那麼你有 70%的可能會解開這道題。然而,如果題目是一道五年級的歷史題,你只有30%的可能性會回答正確。這就是邏輯回歸能提供給你的。
從數學上看,結果中機率的對數使用的是預測變量的線性組合模型。
odds= p/ (1-p) = probability of event occurrence / probability of not event occurrenceln(odds) = ln(p/(1-p))logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXkp是興趣特徵出現的概率。它選擇了使觀察樣本值的可能性最大化的值作為參數,而沒有(像一般的回歸分析用到的一樣)選使誤差平方和最小化的值。
現在,你或許要問,為什麼要求出對數呢?簡而言之,這種方法是複製階梯函數的最佳數學方法之一。我也可以講得更詳細一些,但那就違背本篇指南的主旨了。
請在以下連結中用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 scorelogistic <- glm(y_train ~ ., data = x,family='binomial')summary(logistic)#Predict Outputpredicted= predict(logistic,x_test)此外……
你還可以嘗試不同的方法來改進該模型:
· 加入交互項
· 精簡模型特徵
· 正規化方法
· 使用非線性模型
正規化方法:
https://www.analyticsvidhya.com/blog/2015/02/avoid-over-fitting-regularization/
3. 決策樹(Decision Tree)
這是我最喜歡也是使用最頻繁的算法之一。該監督式學習算法常被用於分類問題。它,出人意料地,同時適用於分類因變量和連續因變量。在這個算法中,我們將總體分為兩個或更多的同類群。基於最重要的屬性/自變量來分成儘可能不同的組別。
要想了解更多相關信息,你可以閱讀以下文章:
Decision Tree Simplified 簡化決策樹
圖源: statsexchange
如上圖所示,根據多個屬性,人群被分為四個不同的小組,從而確定他們「會不會去玩」。為了將總人群分成不同的組別,需要用到很多技術,如基尼係數(Gini)、信息增益(Information Gain)、卡方(Chi-square)、熵(entropy)。
了解決策樹工作機制的最好方式是玩Jezzball,這是一款來自於微軟的經典遊戲(見下圖)。遊戲的玩法是:在一個可以移動牆壁的房間裡,你需要通過創建牆壁來分割出沒有小球的最大空間。
因此,當你每次用牆壁來分隔房間時,都是試圖在同一間房裡創建兩個不同的部分。決策樹以非常相似的機制工作,即把總體儘可能地分割到不同的組裡去。
更多信息參見: 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 treefit <- rpart(y_train ~ ., data = x,method="class")summary(fit)#Predict Outputpredicted= predict(fit,x_test)4. SVM 支持向量機(Support Vector Machine)
SVM是一種分類方法。在此算法中,我們將每個數據繪製為N維空間中的一個點(其中N是你所有的特徵總數),每個特徵的值對應一個坐標值。
例如,假設我們只有身高和頭髮長度兩個特徵,那麼我們就在二維空間中標出這兩個變量,其中每個點都有兩個坐標,這些坐標被稱為支持向量(Support Vectors)。
現在,我們要找到一些能夠將兩組不同數據分開的直線。找到符合要求的最優線:兩個分組中距離該線最近的點到這條線的距離最遠。
上圖中,中間黑線將所有數據分為兩組,兩組中距離線最近的點(圖中A、B點)到達黑線的距離滿足最優條件(距離該線最遠)。因此,這條直線就是我們的分類器。接下來,只要測試數據落到直線的哪一邊,就將其分為哪一類。
更多信息參見: Simplified Version of Support Vector Machine支持向量機的簡化
將這個算法想像成是在N維空間裡玩JezzBall遊戲,那麼要調整的是:
· 現在你可以以任意角度畫線/平面(而不是像經典遊戲中那樣只能在水平或者豎直方向畫線)。
· 遊戲的目的變成了把不同顏色的球分割在不同的空間裡。
· 球的位置不會改變。
現在試著動手在以下窗口中用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 modelfit <-svm(y_train ~ ., data = x)summary(fit)#Predict Outputpredicted= predict(fit,x_test)
5. 樸素貝葉斯(Naive Bayes)
這是一種以貝葉斯定理為基礎的分類技術,假設預測變量間相互獨立。簡單來講,樸素貝葉斯分類器假設一個分類的特性與該分類的其它特性無關。例如,如果一個水果又紅又圓,且直徑約為3英寸,那麼這個水果可能會是蘋果。即便這些特徵互相依賴,或者依賴於其他特徵的存在,樸素貝葉斯分類器還是會假設這些特徵分別獨立,暗示這個水果是蘋果。
樸素貝葉斯模型易於構建,且對於大型數據集尤其有用。除了簡單之外,樸素貝葉斯的表現甚至超過了非常複雜的分類方法。
貝葉斯定理提供了一種從P(c)、P(x)和P(x|c) 計算後驗概率 P(c|x) 的方法。看一下以下等式:
這裡,
· P(c|x) 是已知預測變量(屬性)的前提下,類(目標)的後驗概率
· P(c) 是類的先驗概率
· P(x|c) 是可能性,即已知類的前提下,預測變量的概率
· P(x) 是預測變量的先驗概率
例子:讓我們用一個例子來理解一下這個概念。下面有一個天氣的訓練數據集和對應的目標變量「玩」。現在,我們需要根據天氣情況,將「玩」和「不玩」的參與者進行分類。我們可以按照以下步驟來執行:
第1步:把數據集轉換成頻率表。
第2步:利用概率(如當Overcast可能性=0.29時,玩耍的可能性為0.64),創建Likelihood表格。
第3步:現在,使用樸素貝葉斯方程來計算每一類的後驗概率。後驗概率最高的一類就是預測結果。
問題:如果天氣晴朗,參與者就能玩。該陳述正確嗎?
這個問題可以用上面討論的方法求解,所以 P(玩 | 晴朗)= P(晴朗 | 玩)* P(玩)/ P (晴朗)
我們有 P (晴朗 |玩)= 3/9 = 0.33,P(晴朗) = 5/14 = 0.36, P(玩)= 9/14 = 0.64
現在,P(玩 | 晴朗)= 0.33 * 0.64 / 0.36 = 0.60,這可能性更大。
樸素貝葉斯使用相似的方法來預測不同屬性的不同類的概率。該算法多用於文本分類,和涉及多個類的問題。
R 語言代碼:
library(e1071)x <- cbind(x_train,y_train)# Fitting modelfit <-naiveBayes(y_train ~ ., data = x)summary(fit)#Predict Outputpredicted= predict(fit,x_test)6. kNN K-最近鄰算法(k- Nearest Neighbors)
kNN算法可用於分類和回歸問題。然而,K–最近鄰算法更常用於行業中的分類問題。K–最近鄰算法是一個簡單的算法,它存儲所有可用的案例,並通過k個案例中的大多數情況給新案例分類。根據一個距離函數,新案例會被分配到通過距離函數測得的K個近鄰中最常見的類中去。
這些距離函數可以是歐幾裡得距離(Euclidean)、曼哈頓距離(Manhattan)、閔可夫斯基距離(Minkowski)和漢明距離(Hamming)。前三個函數用於連續函數,第四個函數(漢明)被用於分類變量。如果 K=1,則該案例就直接被分配給離它最近的案例的類。有時,執行KNN建模時,選擇 K 的大小確實是一個挑戰。
我們的現實生活中常常會應用到KNN。如果你想要了解一個陌生人,你或許會想去找他的好朋友或所處的圈子來獲取信息。
選擇kNN前需要考慮的事情:
· KNN的計算成本很高。
· 變量應該統一化,否則範圍較大的變量可能會造成偏差。
· 在進行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 modelfit <-knn(y_train ~ ., data = x,k=5)summary(fit)#Predict Outputpredicted= predict(fit,x_test)
7. K均值算法(K-Means)
這是一種能解決聚類問題的非監督式學習算法。其過程簡單易行,將給定數據分類到一定數量的集群中去(假設有 k 個集群)。一個集群內的數據點對於對等集群來說是同質,且異構的。
還記得從墨跡中找出形狀的方法嗎?從某種程度上來說,K-均值算法與此有點類似。觀察形狀及延伸方式來辨認有多少種集群。
K-均值怎樣形成集群:
1. K-均值為每個集群選擇k個點,稱為質心(centroid)。
2. 每個數據點與最近的質心形成一個集群,即k個集群。
3. 根據現有的集群成員查找每個集群的質心,然後就有了新的質心。
4. 當有了新的質心後,重複步驟2和3。找到每個數據點距離新質心的最近距離,然後與新的k-集群相關聯。重複這個過程直至匯聚,即質心不再改變。
如何確定K值:
在K–均值算法中,我們有集群,每個集群有自己的質心。一個集群內的質心和各數據點之間距離的平方和形成了這個集群的平方值之和。此外,當所有集群的平方值之和相加,就組成了集群方案的平方值之和。
我們知道,隨著集群數量的增加,K值會不斷下降。但是,如果將結果繪製成圖表,就會發現距離的平方和在急劇減少。到達某一K值後,減少的速度會大幅放緩。我們可以在此找到集群數量的最優值。
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)
隨機森林是決策樹的總體專有名詞。在隨機森林算法中,我們有一系列決策樹(因此,被稱為「森林」)。為了根據屬性將新對象進行分類,每一棵決策樹都給出一個分類,稱之為該決策樹為該分類「投票」。森林選擇(在所有樹中)獲得票數最多的分類。
每棵樹的種植&培育過程:
1. 假設訓練集中的案例數為N,則使用重置抽樣法在N個案例中隨機抽取樣本。該樣本將作為此樹生長的訓練集。
2. 假設有M個輸入變量,則定義數字m<<M。m表示從M中隨機選擇m個變量,該m中最好的切分將被用來切分該節點。M值在森林生長過程中保持不變。
3. 每棵樹都儘可能地生長,不進行任何修剪。
如果你想了解更多關於此算法的詳細信息,比較決策樹和優化模型參數,可以閱讀以下文章:
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 調節隨機森林模型參數
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 modelfit <- randomForest(Species ~ ., x,ntree=500)summary(fit)#Predict Outputpredicted= predict(fit,x_test)9. 降維算法(Dimensionality Reduction Algorithms)
在過去的4-5年裡,在很多階段,信息都呈指數級增長。企業/政府機構/研究組織不僅帶來了新資源,還捕捉著詳盡的數據。
例如,電子商務公司正在獲取更為詳細的顧客的資料:人口統計信息、網頁瀏覽記錄、個人喜惡、購買記錄、反饋,以及其他多種信息,比你附近雜貨店的售貨員更加關注你。
作為數據科學家,我們提供的數據也包含許多特點,聽起來很適合構建良好且健壯的模型,但仍存在挑戰:如何從 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
當我們要利用大量數據進行有高預測力的預測時,會使用到GBM這種提升算法。提升算法(boosting)是多種學習算法的集成,它結合了建立在多個基礎估計值基礎上的預測結果,從而提高單一估計值的可靠性。這些提升算法通常在Kaggl、AV Hackathon、CrowdAnalytix等數據科學比賽中表現出色。
更多信息詳見: 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 modelfitControl <- 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競賽中,決定勝負的另一種經典梯度提升算法。
XGBoost具有極高的預測能力,這使其成為預測事件準確性的最佳選擇。它同時具有線性模型和樹學習算法的優點,這使得該算法比現有的梯度提升技術快了近10倍。
此算法支持包括回歸、分類和排序在內的多種目標函數。
有關XGBoost的最有趣的事情之一是,它也被稱為正則化增強技術(regularized boosting technique)。這有助於減少模型過擬合,並為Scala、Java、R、Python、Julia 和C++等語言提供了大量支持。
算法支持在GCE、AWS、Azure 和Yarn clusters等許多計算機上進行訓練。
想要了解更多關於XGBoost和參數調整的信息,可以訪問:
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 modelTrainControl <- trainControl( method = "repeatedcv", number = 10, repeats = 4)model<- train(y ~ ., data = x, method = "xgbLinear", trControl = TrainControl,verbose = FALSE)ORmodel<- train(y ~ ., data = x, method = "xgbTree", trControl = TrainControl,verbose = FALSE)predicted <- predict(model, x_test)10.3. LightGBM
LightGBM是一個使用以樹為基礎的學習算法的梯度增強框架,採用分布式且高效的設計,具有以下優點:
訓練速度更快且效率更高降低內存使用量精準度更高支持並行和GPU學習能夠處理大規模數據該框架是一種基於決策樹算法的快速、高性能的梯度提升算法,被用於處理排名、分類以及許多其他機器學習任務。它是在微軟的分布式機器學習工具包項目(Distributed Machine Learning Toolkit Project)下開發的。
由於LightGBM是以決策樹算法為基礎的,因此它以最佳擬合的方式對樹葉進行切分,而其他提升算法則對樹的深度或層次進行拆分,而不是對葉進行拆分。因此,當在Light GBM中的同一葉上生長時,與逐層算法相比,逐葉算法可以減少更多的損失,從而獲得更好的精準度,而現有的任何提升算法都難以達到這種精準度。
此外,其速度快得驚人,因此其名字中「Light」這一詞。
要想了解更多有關LightGBM的信息,請參考:
https://www.analyticsvidhya.com/blog/2017/06/which-algorithm-takes-the-crown-light-gbm-vs-xgboost/
Python 代碼:
data = np.random.rand(500, 10) # 500 entities, each contains 10 featureslabel = np.random.randint(2, size=500) # binary targettrain_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 = 10bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])bst.save_model('model.txt')# 7 entities, each contains 10 featuresdata = np.random.rand(7, 10)ypred = bst.predict(data)R 語言代碼:
library(RLightGBM)data(example.binary)#Parametersnum_iterations <- 100config <- 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 boosterhandle.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 stepslgbm.booster.train(handle.booster, num_iterations, 5)#Predictpred <- lgbm.booster.predict(handle.booster, x.test)#Test accuracysum(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包的話,以下是實現LightGBM的快速方法。
require(caret)require(RLightGBM)data(iris)model <-caretModel.LGBMfit <- 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 matrixmat <- 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最近發布的一款開源機器學習算法。它可以輕鬆地與深度學習框架(如Google的TensorFlow和Apple的Core ML)集成。
CatBoost最大的優點在於,它不需要像其他ML模型那樣進行大量的數據訓練,並且可以處理多種數據格式,不會破壞其穩健性。
Catboost可以自動處理分類變量,而不會顯示類型轉換錯誤,這有助於你更好地專注於模型調整,而不是解決各種瑣碎的錯誤。
https://www.analyticsvidhya.com/blog/2017/08/catboost-automated-categorical-data/
Python 代碼:
import pandas as pdimport numpy as npfrom catboost import CatBoostRegressor#Read training and testing filestrain = pd.read_csv("train.csv")test = pd.read_csv("test.csv")#Imputing missing values for both train and testtrain.fillna(-999, inplace=True)test.fillna(-999,inplace=True)#Creating a training set for modeling and validation set to check model performanceX = train.drop(['Item_Outlet_Sales'], axis=1)y = train.Item_Outlet_Salesfrom sklearn.model_selection import train_test_splitX_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 modelfrom 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.DataFramesubmission['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 = ,tuneGrid = grid, trControl = fit_control)print(report)importance <- varImp(report, scale = FALSE)print(importance)
結語
至此,我敢肯定你已經對常用的機器學習算法有了一定的了解了。作者寫這篇文章並提供相應的R語言代碼和Python代碼的唯一目的就是幫助你找到起點。如果你想要完全掌握機器學習算法的話,那就馬上開始吧。著手解決問題,加深對過程的理解,將這些代碼用起來並從中發現樂趣!
這篇文章對你來說有幫助嗎?請在下面評論區分享你的觀點和想法。
原文:
https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/
(*本文由 AI 科技大本營編譯,轉載請聯繫微信1092722531)
【end】
2月29日全天直播——中國「遠程辦公」大考·線上峰會
10+位來自華為、阿里、微軟、CODING等名企的專家大牛為大家做全天直播!
在線答疑、吐槽評論、現場抽獎等與大咖多維互動,不出家門,用程式設計師的方式來共同「抗」疫!
機器學習中的線性回歸,你理解多少?華為諾亞、北大提出GhostNet,使用線性變換生成特徵圖,準確率超MobileNet v3兩成開發者月薪超 1.7 萬、算法工程師最緊缺! | 中國開發者年度報告探索處理數據的新方法,8 個重點帶你搞懂雲資料庫——DBaaS(資料庫即服務)到底是什麼!遠程辦公是一陣「過渡風」還是會「繼續燃燒」?在家辦公憋瘋了?不,我還能再待一年!