【机器学习基础】(五):通俗易懂决策树与随机森林及代码实践
與SVM一樣,決策樹是通用的機器學(xué)習(xí)算法。隨機森林,顧名思義,將決策樹分類器集成到一起就形成了更強大的機器學(xué)習(xí)算法。它們都是很基礎(chǔ)但很強大的機器學(xué)習(xí)工具,雖然我們現(xiàn)在有更先進的算法工具來訓(xùn)練模型,但決策樹與隨機森林因其簡單靈活依然廣受喜愛,建議大家學(xué)習(xí)。
一、決策樹
1.1 什么是決策樹
我們可以把決策樹想象成IF/ELSE判別式深度嵌套的二叉樹形結(jié)構(gòu)。以我們在《機器學(xué)習(xí)(三):理解邏輯回歸及二分類、多分類代碼實踐》所舉的鳶尾花數(shù)據(jù)集為例。
我們曾用seaborn繪制花瓣長度和寬度特征對應(yīng)鳶尾花種類的散點圖,如下:
當花瓣長度小于2.45則為山鳶尾(setosa),剩下的我們判斷花瓣寬度小于1.75則為變色鳶尾(versicolor)剩下的為維吉尼亞鳶尾(virginica)。那么我用導(dǎo)圖畫一下這種判別式的樹形結(jié)構(gòu)如下:
因此,當我們面對任意鳶尾花的樣本,我們只需要從根節(jié)點到葉子節(jié)點遍歷決策樹,就可以得到鳶尾花的分類結(jié)論。
這就是決策樹。
1.2 決策樹代碼實踐
我們導(dǎo)入數(shù)據(jù)集(大家不用在意這個域名),并訓(xùn)練模型:
import?numpy?as?np import?pandas?as?pd from?sklearn.tree?import?DecisionTreeClassifier#引入數(shù)據(jù)集 df?=?pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')#決策樹模型 X?=?df[['petal_length','petal_width']].to_numpy()? y?=?df['species'] tree_clf?=?DecisionTreeClassifier(max_depth=2,?random_state=42) tree_clf.fit(X,?y)我們來可視化決策樹:
import?matplotlib.pyplot?as?plt from?sklearn.tree?import?plot_tree plt.figure(figsize=(12,8)) plot_tree(tree_clf,filled=True);如上圖,我們可以看到根節(jié)點總實例數(shù)為150時,由value = [50, 50, 50]可知,實際樣本分類為50個山鳶尾花實例、50個變色鳶尾花實例、50個維吉尼亞鳶尾花實例。我們再看最末尾右側(cè)的葉子節(jié)點(紫色),由value = [0, 1, 45]可知,實際樣本分類為0個山鳶尾花實例、1個變色鳶尾花實例、45個維吉尼亞鳶尾花實例。
那么gini = 0.043是什么意思呢?
1.3 基尼不純度
顯然我們進行分類時,每一個類別實際混入其他類的數(shù)量越少分類就越純粹,這種純度我們通過如下公式表示:
我們計算維吉尼亞鳶尾花節(jié)點(紫色)的gini系數(shù)1-((0/46)**2 + (1/46)**2 + (45/46)**2) = 0.04253308128544431 ≈0.043 。
我們使用基尼(gini)不純度來衡量決策樹的好壞。那么我們通過最小化基尼不純度min(gini)來求解X[0],X[1](即,花瓣長度寬度特征)邊界的過程就決策樹模型的訓(xùn)練過程。
二、隨機森林
2.1 大數(shù)定理與隨機森林
其實隨機森林很簡單,我們把決策樹隨機組合在一起就是隨機森林,它比單個的決策樹更有效。
憑什么?
假設(shè)我們有一枚不均勻的硬幣,投擲它有51%的概率為正面,49%的概率為背面,那么當投擲1000次時,“大多數(shù)為正面"這件事的概率為75%。投擲10000次時,“大多數(shù)為正面"這件事的概率為97%。這就是大數(shù)定理,它體現(xiàn)的是群體智慧。質(zhì)量不夠,數(shù)量來湊。由此可知,當前尋找最佳模型的方法不止是技巧的比拼,也同樣是算力的比拼。
2.2 隨機森林代碼實踐
2.2.1. 引入新的數(shù)據(jù)集
添加引用:
import?numpy?as?np import?pandas?as?pd import?matplotlib.pyplot?as?plt import?seaborn?as?sns導(dǎo)入數(shù)據(jù)集(大家不用在意這個域名):
df?=?pd.read_csv("https://blog.caiyongji.com/assets/penguins_size.csv") df?=?df.dropna() df.head()| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | MALE |
| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | FEMALE |
| Adelie | Torgersen | 40.3 | 18 | 195 | 3250 | FEMALE |
| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | FEMALE |
| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | MALE |
企鵝數(shù)據(jù)集包含特征和標簽如下:
特征:所在島嶼island、鳥喙長度culmen_length_mm、鳥喙深度culmen_depth_mm、腳蹼長度flipper_length_mm、體重(g)、性別
標簽:物種species:Chinstrap, Adélie, or Gentoo
2.2.2 觀察數(shù)據(jù)
sns.pairplot(df,hue='species')我們通過pairplot方法繪制特征兩兩之間的對應(yīng)關(guān)系。
2.2.3 預(yù)處理
X?=?pd.get_dummies(df.drop('species',axis=1),drop_first=True) y?=?df['species'] X.head()注意,get_dummies方法將字符串屬性的列轉(zhuǎn)換成了數(shù)字屬性的多個列。如,島嶼island和性別sex分別轉(zhuǎn)換成了island_Dream、island_Torgersen和sex_FEMALE、sex_MALE。這是一種獨熱編碼的關(guān)系,比如sex_FEMALE與sex_MALE屬性獨立,在空間內(nèi)沒有向量關(guān)系。
| 39.1 | 18.7 | 181 | 3750 | 0 | 1 | 0 | 1 |
| 39.5 | 17.4 | 186 | 3800 | 0 | 1 | 1 | 0 |
| 40.3 | 18 | 195 | 3250 | 0 | 1 | 1 | 0 |
| 36.7 | 19.3 | 193 | 3450 | 0 | 1 | 1 | 0 |
| 39.3 | 20.6 | 190 | 3650 | 0 | 1 | 0 | 1 |
2.2.4 訓(xùn)練數(shù)據(jù)
#訓(xùn)練 from?sklearn.model_selection?import?train_test_split from?sklearn.ensemble?import?RandomForestClassifier X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.3,?random_state=101) model?=?RandomForestClassifier(n_estimators=10,max_features='auto',random_state=101) model.fit(X_train,y_train)#預(yù)測 from?sklearn.metrics?import?accuracy_score preds?=?model.predict(X_test) accuracy_score(y_test,preds)使用隨機森林分類器RandomForestClassifier訓(xùn)練,得到模型精度為97%。
2.2.5 網(wǎng)格搜索與AdaBoost提升法(拓展)
我們使用AdaBoostClassifier分類器集成數(shù)個決策樹分類器DecisionTreeClassifier進行分類。并使用網(wǎng)格搜索方法GridSearchCV來尋找最優(yōu)參數(shù)。
from?sklearn.model_selection?import?GridSearchCV from?sklearn.ensemble?import?AdaBoostClassifierada_clf?=?AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),?random_state=101) ada_clf.fit(X_train,?y_train) param_grid?=?{'n_estimators':[10,15,20,25,30,35,40],?'learning_rate':[0.01,0.1,0.5,1],?'algorithm':['SAMME',?'SAMME.R']} grid?=?GridSearchCV(ada_clf,param_grid) grid.fit(X_train,y_train) print("grid.best_params_?=?",grid.best_params_,",?grid.best_score_?="?,grid.best_score_)這是一種集成學(xué)習(xí)技術(shù),輸出如下:
grid.best_params_?=??{'algorithm':?'SAMME',?'learning_rate':?1,?'n_estimators':?20}?,?grid.best_score_?=?0.9914893617021276總結(jié)
二叉樹是決策樹的核心邏輯,隨機森林是大數(shù)定理的應(yīng)用實現(xiàn)。這種基本思想即使不用數(shù)學(xué)公式也可以很容易的解釋清楚,這也是我做這個系列課程(文章)的主要風(fēng)格特點。我認為,數(shù)學(xué)是對現(xiàn)實世界的解釋,但現(xiàn)實世界并不能被數(shù)學(xué)完全解釋。像谷歌AI主管Laurence Moroney所說:
很多人害怕數(shù)學(xué),害怕大量的深度的微積分知識。其實我們可以實現(xiàn)編碼而不考慮數(shù)學(xué),我們可以使用TensorFlow中高(層)級的API,來解決問題,如自然語言處理,圖像分類,計算機視覺序列模型等而無需理解深刻的數(shù)學(xué)。就像你使用JAVA卻不一定非要掌握它是如何編譯的。未來,AI只是每個開發(fā)者技術(shù)棧(toolbox)中的一部分,就像HTML, CSS, JAVA。
希望那一天可以早點到來吧……
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 本站qq群704220115,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】(五):通俗易懂决策树与随机森林及代码实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统之家win11最新旗舰版64位镜像v
- 下一篇: 【数据资源】遥感资源大放送(下)| 11