目錄
一、什么是決策樹
二、怎么使用決策樹解決分類問題
1、重要參數(shù)
(1)Criterion
(2)random_state
(3)splitter
? (4) ? 剪枝參數(shù)
(5)目標(biāo)權(quán)重參數(shù)
2、重要接口
3、重要屬性
三、決策樹的優(yōu)缺點(diǎn)以及適用場景
四、代碼
使用原因:python可以實(shí)現(xiàn)算法,但是比較復(fù)雜,耗時(shí)耗力,而且對于程序員能力要求很高,可能會(huì)出現(xiàn)費(fèi)力構(gòu)建的模型穩(wěn)定性不夠或出現(xiàn)其他問題。而這一工作,sklearn幫我們做了,它是一個(gè)可以幫我們在操作數(shù)據(jù)處理數(shù)據(jù)的時(shí)候高效實(shí)現(xiàn)算法應(yīng)用的工具包,使用簡單。
簡介:scikit-learn,又寫作sklearn,是一個(gè)開源的基于python語言的機(jī)器學(xué)習(xí)工具包。它通過NumPy, SciPy和Matplotlib等python數(shù)值計(jì)算的庫實(shí)現(xiàn)高效的算法應(yīng)用,并且涵蓋了幾乎所有主流機(jī)器學(xué)習(xí)算法。
https://scikit-learn.org/stable/index.htmlhttps://scikit-learn.org/stable/index.html
scikit-learn中文社區(qū)Scikit-learn(以前稱為scikits.learn,也稱為sklearn)是針對Python 編程語言的免費(fèi)軟件機(jī)器學(xué)習(xí)庫。它具有各種分類,回歸和聚類算法,包括支持向量機(jī),隨機(jī)森林,梯度提升,k均值和DBSCAN。Scikit-learn 中文文檔由CDA數(shù)據(jù)科學(xué)研究院翻譯,掃碼關(guān)注獲取更多信息。https://scikit-learn.org.cn/以上鏈接為sklearn的官方教程,英文版和中文版可以對照查看。
其中,常用的模塊共有六大類:分類、回歸、聚類、降維、模型選擇和預(yù)處理。
那今天,我們先從分類說起。
分類,顧名思義,就是將一系列的數(shù)據(jù)進(jìn)行分類,可以是二分類,也可以是多分類,具體要看我們解決什么問題,預(yù)測什么內(nèi)容。比如我是生物信息方向,預(yù)測氨基酸突變是否致病,那這就是一個(gè)二分類問題啦(致病or不致?。?。
今天的重點(diǎn)是決策樹,那就以決策樹展開以解決分類問題,主要內(nèi)容分為什么是決策樹,怎么使用決策樹解決分類問題以及決策樹的優(yōu)缺點(diǎn)以及適用情況,最后是代碼部分。
一、什么是決策樹
?決策樹(DTs)是一種用于分類和回歸的非參數(shù)有監(jiān)督學(xué)習(xí)方法。其目標(biāo)是創(chuàng)建一個(gè)模型,通過學(xué)習(xí)從數(shù)據(jù)特性中推斷出的簡單決策規(guī)則來預(yù)測目標(biāo)變量的值。
構(gòu)建決策樹其實(shí)就是將數(shù)據(jù)表通過對特征提問的方式繪制為樹,最終的葉節(jié)點(diǎn)就是我們想要的分類結(jié)果,如下圖所示。
?在這里,補(bǔ)充節(jié)點(diǎn)的相關(guān)概念:
根節(jié)點(diǎn):只出不進(jìn)
中間節(jié)點(diǎn):有進(jìn)有出
葉子節(jié)點(diǎn):只進(jìn)不出,每個(gè)葉節(jié)點(diǎn)都是一個(gè)類別標(biāo)簽
子節(jié)點(diǎn)和父節(jié)點(diǎn):兩個(gè)相連的節(jié)點(diǎn)中,更接近根的節(jié)點(diǎn)就是父節(jié)點(diǎn),另一個(gè)是子節(jié)點(diǎn)
決策樹構(gòu)建的核心有兩點(diǎn):
- 找出最佳的節(jié)點(diǎn)和最佳的分支。不純度越低越好,不純度基于節(jié)點(diǎn)計(jì)算,書中每個(gè)節(jié)點(diǎn)都有不純度,并且子節(jié)點(diǎn)的不純度低于父節(jié)點(diǎn)的不純度,所以,在同一棵決策樹上,葉子節(jié)點(diǎn)的不純度一定是最低的。
- 如何讓決策樹停止生長,防止過擬合,可以通過剪枝參數(shù)調(diào)整。
在sklearn中,共有五個(gè)關(guān)于決策樹的類:
????????Tree.DecisionTreeClassfier 分類樹
????????Tree.DecisionTreeRegressor 回歸樹
????????Tree.export_graphviz 將生成的決策樹導(dǎo)出為dot格式,畫圖專用
????????Tree.ExtraTreeClassifier 高隨機(jī)版本的分類樹
????????Tree.ExtraTreeRegressor 高隨機(jī)版本的回歸樹
二、怎么使用決策樹解決分類問題
其實(shí),很簡單,四行搞定
from sklearn import tree
clf = tree.DecisionTreeClassifier() #實(shí)例化
clf = clf.fit(xtrain,ytrain) #訓(xùn)練
result = clf.score(xtest,ytest) #為測試集打分
我們可以看到在實(shí)例化一行中,括號(hào)內(nèi)并無內(nèi)容,但不代表無參數(shù),而是默認(rèn)了,那怎么調(diào)參呢,該怎么調(diào)呢,我們往下看。
1、重要參數(shù)
(1)Criterion
上文已經(jīng)說明了決策樹的核心之一就是找出最佳的節(jié)點(diǎn)和最佳的分支,這就涉及到不純度的計(jì)算。此參數(shù)就決定了怎么計(jì)算不純度,兩種方式:gini:基尼系數(shù)(默認(rèn));entropy:信息熵。
t代表給定的節(jié)點(diǎn),i代表標(biāo)簽的任意分類,p(i,t)代表標(biāo)簽分類i在節(jié)點(diǎn)t上所占的比例。
兩個(gè)的對比:
差別不大,但是信息熵會(huì)慢一些,且對不純度會(huì)更加敏感,所以決策樹會(huì)更加精細(xì)。對于高維數(shù)據(jù)和噪音過多的數(shù)據(jù)信息熵很容易過擬合,建議基尼系數(shù),當(dāng)然也不是絕對的。
具體如何選取:
- 通常默認(rèn)
- 維度大噪音多選擇基尼系數(shù)
- 維度低,數(shù)據(jù)清晰都可以
- 當(dāng)欠擬合時(shí)可以選用信息熵
- 個(gè)人建議,二者都試試,對比選擇
(2)random_state
在建樹的過程中,是依靠優(yōu)化節(jié)點(diǎn)來追求一棵優(yōu)化的樹,但最優(yōu)的節(jié)點(diǎn)不一定保證最優(yōu)的樹。所以,在sklearn中,會(huì)建更多的樹從中取最好的。在每次分枝時(shí),不從全部特征中選取,而是隨機(jī)從中選取一部分特征,從中選取不純度相關(guān)指標(biāo)達(dá)到最優(yōu)的作為分枝用的節(jié)點(diǎn)。
可以設(shè)置任意整數(shù),目的是讓指標(biāo)更優(yōu)秀。
(3)splitter
控制決策樹的隨機(jī)性。
輸入值:best(選擇重要性更高的特征)和?? random(隨機(jī)選擇,可以防止過擬合)
?(4) 剪枝參數(shù)
實(shí)際情況中,常常會(huì)過擬合,也就是訓(xùn)練集上表現(xiàn)非常好,而測試集上表現(xiàn)一般,需要剪枝。
剪枝策略對決策樹的影響較大,正確的剪枝是優(yōu)化決策樹算法的核心。
max_depth:特征多,但數(shù)據(jù)少,限制樹的深度可以防止過擬合,建議從3開始嘗試
min_samples_leaf 和 min_samples_split:限制葉子節(jié)點(diǎn),可以整數(shù),也可以是浮點(diǎn)數(shù)(百分比),搭配max_depth使用,建議從5開始嘗試,一般情況,對于類別不多的分類問題,最佳是1。
max_features:限制考慮的特征數(shù),超過限制個(gè)數(shù)的特征會(huì)被舍棄(不太推薦,太暴力,可以選擇PCA降維或者sklearn自帶的特征選擇)
min_impurity_decrease:限制信息增益的大小,信息增益小于設(shè)定值分枝就不會(huì)發(fā)生
如何找出最優(yōu)秀的剪枝參數(shù)?
繪制超參數(shù)曲線(詳見后文代碼)
當(dāng)然,剪枝后,效果不一定會(huì)更好。只是當(dāng)數(shù)據(jù)集較大,特征較多時(shí),樹枝的無限生長會(huì)對內(nèi)存消耗很大,所以需要提前剪枝處理。
(5)目標(biāo)權(quán)重參數(shù)
Class_weight 和 Min_weight_fraction_leaf:完成樣本標(biāo)簽平衡的參數(shù)。默認(rèn)值為None,即相同的權(quán)重。
樣本標(biāo)簽不平衡,指的是在一個(gè)數(shù)據(jù)集中,某一類樣本占有大多數(shù),比如銀行貸款違約的人數(shù),大概百分之97的人不會(huì)違約,但是這樣的數(shù)據(jù)集會(huì)導(dǎo)致最終模型的預(yù)測只要預(yù)測為不會(huì)違約,也會(huì)有97%的正確率,因此需要Class_weight參數(shù)對樣本標(biāo)簽進(jìn)行一定的衡量,給少量的標(biāo)簽更多的權(quán)重,讓模型偏向于樣本較少的那一類。
2、重要接口
fit(xtrain,ytrain)???? 訓(xùn)練模型
score(xtest,ytest) ?得分
predict(xtest)???????? 返回每個(gè)測試樣本的分類或者回歸的結(jié)果
apply(xtest) ????????? 返回每個(gè)測試樣本所在的葉子的索引
predict_proba(xtest) ?預(yù)測的分類結(jié)果屬于每個(gè)標(biāo)簽的概率值
輸入的xtrain和xtest必須是二維矩陣,不接受任何一維特征矩陣,如果是一維,需要reshape(-1,1)轉(zhuǎn)換。
?3、重要屬性
feature_importances_ :特征重要性
#重要性
importance = clf.feature_importances_
feature_importance = [(feature,importance.round(3)) for feature,importance in zip(feature_name,importance)]
#排序
feature_importance = sorted(feature_importance,key=lambda x :x[1],reverse=True)
#對應(yīng)進(jìn)行打印
[print('variable:{:20} importance: {}'.format(*pair)) for pair in feature_importance]
三、決策樹的優(yōu)缺點(diǎn)以及適用場景
決策樹的一些優(yōu)點(diǎn):
-
易于理解和解釋。樹可以被可視化。
-
幾乎不需要數(shù)據(jù)準(zhǔn)備。其他算法通常需要數(shù)據(jù)標(biāo)準(zhǔn)化,需要?jiǎng)?chuàng)建虛擬變量并刪除缺失值。但是,請注意,此模塊不支持缺失值。
-
使用樹的成本(即預(yù)測數(shù)據(jù))是用于訓(xùn)練樹的數(shù)據(jù)點(diǎn)數(shù)的對數(shù)。
-
能夠處理數(shù)值型和分類型數(shù)據(jù)。其他技術(shù)通常專門分析只有一種類型變量的數(shù)據(jù)集。有關(guān)更多信息,請參見algorithms?。
-
能夠處理多輸出問題。
-
使用白盒模型。如果給定的情況在模型中是可以觀察到的,那么對條件的解釋就很容易用布爾邏輯來解釋。相反,在黑箱模型中(例如,在人工神經(jīng)網(wǎng)絡(luò)中),結(jié)果可能很難解釋。
-
可以使用統(tǒng)計(jì)測試驗(yàn)證模型。這樣就有可能對模型的可靠性作出解釋。
-
即使它的假設(shè)在某種程度上被生成數(shù)據(jù)的真實(shí)模型所違背,它也表現(xiàn)得很好。
決策樹的缺點(diǎn)包括:
-
決策樹學(xué)習(xí)器可以創(chuàng)建過于復(fù)雜的樹,不能很好地概括數(shù)據(jù)。這就是所謂的過擬合。為了避免這個(gè)問題,必須設(shè)置剪枝、設(shè)置葉節(jié)點(diǎn)所需的最小樣本數(shù)或設(shè)置樹的最大深度等機(jī)制。
-
決策樹可能是不穩(wěn)定的,因?yàn)閿?shù)據(jù)中的小變化可能導(dǎo)致生成完全不同的樹。通過集成決策樹來緩解這個(gè)問題。
-
學(xué)習(xí)最優(yōu)決策樹的問題在最優(yōu)性的幾個(gè)方面都是NP-complete的,甚至對于簡單的概念也是如此。因此,實(shí)際的決策樹學(xué)習(xí)算法是基于啟發(fā)式算法,如貪婪算法,在每個(gè)節(jié)點(diǎn)上進(jìn)行局部最優(yōu)決策。這種算法不能保證返回全局最優(yōu)決策樹。這可以通過訓(xùn)練多棵樹再集成一個(gè)學(xué)習(xí)器來緩解,其中特征和樣本被隨機(jī)抽取并替換。
-
有些概念很難學(xué)習(xí),因?yàn)闆Q策樹不能很容易地表達(dá)它們,例如異或、奇偶校驗(yàn)或多路復(fù)用器問題。
-
如果某些類占主導(dǎo)地位,則決策樹學(xué)習(xí)者會(huì)創(chuàng)建有偏見的樹。因此,建議在擬合決策樹之前平衡數(shù)據(jù)集。
適用場景
對于決策樹分類而言,它更擅長分月亮型和半分型的數(shù)據(jù),對于環(huán)狀分布的數(shù)據(jù)效果并不是太好。
最擅長月亮型數(shù)據(jù)的是最近鄰算法,RBF支持向量機(jī)和高斯過程
最擅長環(huán)形數(shù)據(jù)的是最近鄰算法和高斯過程
最擅長半分的是樸素貝葉斯、神經(jīng)網(wǎng)絡(luò)和隨機(jī)森林
四、代碼
本文選擇經(jīng)典的紅酒數(shù)據(jù)集,也是sklearn自帶的數(shù)據(jù)集。相比于鳶尾花數(shù)據(jù)集,它的特征會(huì)更多一些,對于參數(shù)調(diào)整前后的分?jǐn)?shù)情況更加直觀明顯。文章來源:http://www.zghlxwxcb.cn/news/detail-409091.html
from sklearn import tree
import pandas as pd
from sklearn.datasets import load_wine #紅酒數(shù)據(jù)集
from sklearn.model_selection import train_test_split
wine = load_wine()
print(wine.data)
print(wine.data.shape)
print(wine.target)
print(wine.feature_names)
print(wine.target_names)
df = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1) #將特征和標(biāo)簽合并,axis=0為橫向合并
print(df)
# 劃分測試集和訓(xùn)練集
xtrain,xtest,ytrain,ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# 創(chuàng)建決策樹
clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=42,splitter='random',max_depth=3,min_samples_leaf=10,min_samples_split=10) #實(shí)例化
#訓(xùn)練
clf = clf.fit(xtrain,ytrain)
#為測試集打分,分?jǐn)?shù)每次運(yùn)行會(huì)不一樣,原因有兩個(gè):測試集和訓(xùn)練集劃分不確定;決策樹分類器的random_state參數(shù)影響
result = clf.score(xtest,ytest)
print('測試集打分',result)
print('訓(xùn)練集打分',clf.score(xtrain,ytrain))
#可視化
from sklearn.tree import export_graphviz
import pydot
import graphviz #需要自己導(dǎo)入 pip install graphviz
feature_name = ['酒精','蘋果酸','灰','灰的堿性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強(qiáng)度','色調(diào)','od280/od315稀釋葡萄酒','脯氨酸']
dot = tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','貝爾摩德']
,filled=True #上色
,rounded=True) #圓角
graph = graphviz.Source(dot)
print(graph)
#重要性
importance = clf.feature_importances_
feature_importance = [(feature,importance.round(3)) for feature,importance in zip(feature_name,importance)]
#排序
feature_importance = sorted(feature_importance,key=lambda x :x[1],reverse=True)
#對應(yīng)進(jìn)行打印
[print('variable:{:20} importance: {}'.format(*pair)) for pair in feature_importance]
#繪制超參數(shù)曲線
import matplotlib.pyplot as plt
test = []
for i in range(100):
clf = tree.DecisionTreeClassifier(max_depth=2
# ,criterion='gini'
,criterion='entropy'
,random_state=i
,splitter='random')
clf.fit(xtrain,ytrain)
score = clf.score(xtest,ytest)
test.append(score)
plt.plot(range(100),test)
plt.xlabel('max_depth')
plt.ylabel('score')
plt.show()
總之,sklearn主要三步:建立模型評估對象,通過模型接口訓(xùn)練模型,最后通過模型接口提取需要的信息。其他模塊內(nèi)容會(huì)后續(xù)更新,我們一起學(xué)習(xí)~文章來源地址http://www.zghlxwxcb.cn/news/detail-409091.html
到了這里,關(guān)于sklearn的系統(tǒng)學(xué)習(xí)——決策樹分類器(含有python完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!