python sklearn中的決策樹(shù)模型詳解
sklearn中的決策樹(shù)
sklearn 中的決策樹(shù)實(shí)現(xiàn)使用的是CART(Classification and Regression Trees)算法
sklearn中的決策樹(shù)都在 sklearn.tree
這個(gè)模塊下。
位置 | 說(shuō)明 |
---|---|
tree.DecisionTreeClassifier | 分類(lèi)樹(shù) |
tree.DecisionTreeRegressor | 回歸樹(shù) |
tree.export_graphviz | 用于畫(huà)圖 |
tree.ExtraTreeClassifier | 高隨機(jī)版本的分類(lèi)樹(shù) |
tree.ExtraTreeRegressor | 高隨機(jī)版本的回歸樹(shù) |
基本使用
以紅酒數(shù)據(jù)集和波士頓房?jī)r(jià)數(shù)據(jù)集為例,sklearn中的分類(lèi)樹(shù)和回歸樹(shù)的簡(jiǎn)單使用如下:
# 導(dǎo)包 from sklearn.datasets import load_wine, load_boston from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor # 分類(lèi)樹(shù) data_wine = load_wine() # 加載紅酒數(shù)據(jù)集 # 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test = train_test_split(data_wine.data, data_wine.target, test_size=0.3, random_state=42) clf = DecisionTreeClassifier() # 分類(lèi)樹(shù) clf.fit(X_train, y_train) # 擬合訓(xùn)練集 print(clf.predict(X_train)) # 輸出測(cè)試集的預(yù)測(cè)結(jié)果 print(clf.score(X_test, y_test)) # 測(cè)試集上的準(zhǔn)確率 # 回歸樹(shù) data_boston = load_boston() # 加載波士頓房?jī)r(jià)數(shù)據(jù)集 # 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test = train_test_split(data_boston.data, data_boston.target, test_size=0.3, random_state=42) regressor = DecisionTreeRegressor() # 回歸樹(shù) regressor.fit(X_train, y_train) # 擬合訓(xùn)練集 print(regressor.predict(X_train)) # 測(cè)試集的預(yù)測(cè)結(jié)果 print(regressor.score(X_test, y_test)) # 測(cè)試集上的決定系數(shù) R2
常用屬性和接口
.feature_importances_
:每個(gè)特征的特征重要性,總和為1.apply()
:與predict不同,例如輸入為X_test,apply返回的則是測(cè)試樣本所在葉子節(jié)點(diǎn)的索引
幾乎每個(gè)模型都有的接口如訓(xùn)練和預(yù)測(cè)就不說(shuō)明了.
決策樹(shù)的 .score()
接口的計(jì)算方法:
- 分類(lèi)樹(shù):使用Accuracy(準(zhǔn)確度)作為指標(biāo),準(zhǔn)確度=
預(yù)測(cè)正確的樣本數(shù)?/總體樣數(shù) - 回歸樹(shù):使用決定系數(shù) R2R^2R2 作為指標(biāo),[0,1],越接近1表示效果越好,反之越差
本文主要講解分類(lèi)樹(shù)和回歸樹(shù)的常用參數(shù)。
注:本文的說(shuō)明都不是絕對(duì)的,不存在某種情況下某種說(shuō)法一定就是正確的。
參數(shù)說(shuō)明
以下參數(shù)說(shuō)明是針對(duì)分類(lèi)樹(shù)的,對(duì)于回歸樹(shù),幾乎所有參數(shù)、屬性及接口都和分類(lèi)樹(shù)一模一樣。需要注意的是,在回歸樹(shù)中,沒(méi)有標(biāo)簽分布是否均衡的問(wèn)題,因此沒(méi)有class_weight這樣的參數(shù)。
sklearn中分類(lèi)樹(shù)和回歸樹(shù)的默認(rèn)參數(shù)
- 分類(lèi)樹(shù):
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best')
- 回歸樹(shù):
DecisionTreeRegressor(ccp_alpha=0.0, criterion='mse', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best')
本文涉及的參數(shù)和調(diào)優(yōu)說(shuō)明:
- criterion
- random_state
- splitter
- max_depth
- min_samples_leaf
- min_samples_split
- max_features
- min_impurity_decrease
- class_weight
- class_weight_fraction_leaf
本文主要就以上這十個(gè)常用參數(shù)進(jìn)行說(shuō)明和講解.
criterion
criterion:規(guī)則,原則(英文直譯)
criterion
:該參數(shù)用于決定決策樹(shù)來(lái)計(jì)算不純度的方法,共有兩種選擇
'entropy'
:信息熵'gini'
:Gini系數(shù),默認(rèn)值
參數(shù)說(shuō)明:
- 信息熵和基尼系數(shù)的效果基本相同
- 使用信息熵速度會(huì)相對(duì)更慢一些,因?yàn)樾畔㈧氐挠?jì)算(存在對(duì)數(shù))比Gini系數(shù)的計(jì)算相對(duì)更復(fù)雜一些
- 信息熵對(duì)不純度更加敏感,對(duì)不純度的懲罰相對(duì)更強(qiáng),使用信息熵作為指標(biāo)時(shí)決策樹(shù)的生長(zhǎng)會(huì)更加 "精細(xì)",更容易過(guò)擬合
- 當(dāng)模型欠擬合時(shí)(訓(xùn)練集測(cè)試集表現(xiàn)都差)可以嘗試使用信息熵,當(dāng)模型過(guò)擬合時(shí)(訓(xùn)練集好測(cè)試集差)可以嘗試使用Gini系數(shù)
一般情況下使用Gini系數(shù),當(dāng)數(shù)據(jù)維度很高、噪音很大的時(shí)候使用Gini系數(shù);維度低、數(shù)據(jù)相對(duì)清晰的時(shí)候信息熵和Gini系數(shù)區(qū)別不大;當(dāng)決策樹(shù)的擬合程度不夠(欠擬合)時(shí),使用信息熵。
對(duì)于回歸樹(shù),criterion支持的標(biāo)準(zhǔn)為三種:
'mse'
(默認(rèn)):均方誤差mean squared error(MSE),父節(jié)點(diǎn)和葉子節(jié)點(diǎn)之間的均方誤差的差額將被用來(lái)作為 特征選擇的標(biāo)準(zhǔn),這種方法通過(guò)使用葉子節(jié)點(diǎn)的均值來(lái)最小化損失'friedman_mse'
:使用費(fèi)爾德曼均方誤差,這種指標(biāo)使用弗里德曼針對(duì)潛在分枝中的問(wèn)題改進(jìn)后的均方誤差'mae'
:使用絕對(duì)平均誤差MAE(mean absolute error),這種指標(biāo)使用葉節(jié)點(diǎn)的中值來(lái)最小化損失在回歸樹(shù)中,MSE不只是我們的分枝質(zhì)量衡量指標(biāo),也是我們最常用的衡量回歸樹(shù)回歸質(zhì)量的指標(biāo),我們往往選擇均方誤差作為我們的評(píng)估標(biāo)準(zhǔn)
雖然均方誤差永遠(yuǎn)為正,但是sklearn當(dāng)中使用均方誤差作為評(píng)判標(biāo)準(zhǔn)時(shí),卻是計(jì)算 "負(fù)均方誤差"(neg_mean_squared_error)。
- 這是因?yàn)閟klearn在計(jì)算模型評(píng)估指標(biāo)的時(shí)候,會(huì)考慮指標(biāo)本身的性質(zhì),均 方誤差本身是一種誤差,所以被sklearn劃分為模型的一種損失(loss),因此在sklearn當(dāng)中,都以負(fù)數(shù)表示。真正的均方誤差MSE的數(shù)值,其實(shí)就是neg_mean_squared_error去掉負(fù)號(hào)的數(shù)字。
random_state & splitter
splitter:分離器 (英文直譯)
random_state
:用來(lái)設(shè)置分枝中的隨機(jī)模式的參數(shù),默認(rèn)None,在高維度時(shí)隨機(jī)性會(huì)表現(xiàn)更明顯,對(duì)于低維度的數(shù)據(jù),隨機(jī)性幾乎不會(huì)顯現(xiàn)。輸入任意整數(shù),會(huì)一直長(zhǎng)出同一棵樹(shù),讓模型穩(wěn)定下來(lái)。
sklearn中的決策樹(shù)都是會(huì)先對(duì)原本所有的特征隨機(jī)選取其中一部分用來(lái)建模,random_state的值不同,隨機(jī)選取的情況可能也不同,當(dāng)random_state為None時(shí),每次都會(huì)重新進(jìn)行隨機(jī)選取。
splitter
:用來(lái)控制決策樹(shù)中的隨機(jī)選項(xiàng),有兩種輸入值:
'best'
(默認(rèn)值):決策樹(shù)在分枝時(shí)雖然隨機(jī),但是還是會(huì)優(yōu)先選擇更重要的特征進(jìn)行分枝(重要性可以通過(guò)屬性feature_importances_查看)'random'
:決策樹(shù)在分枝時(shí)會(huì)更加隨機(jī),樹(shù)會(huì)因?yàn)楹懈嗟牟槐匾畔⒍罡?,并因這些不必要信息而降低對(duì)數(shù)據(jù)集的擬合程度。
控制決策樹(shù)在選取特征時(shí)的隨機(jī)程度也是防止過(guò)擬合的一種方式。當(dāng)你預(yù)測(cè)到你的模型會(huì)過(guò)擬合,用這兩個(gè)參數(shù)來(lái)幫助你降低樹(shù)建成之后過(guò)擬合的可能性。
剪枝參數(shù)
在不加限制的情況下,一棵決策樹(shù)會(huì)生長(zhǎng)到衡量不純度的指標(biāo)最優(yōu)的情況,或者沒(méi)有更多的特征可用為止,這樣的決策樹(shù)模型往往會(huì)過(guò)擬合。為了讓決策樹(shù)有更好的泛化性,我們要對(duì)決策樹(shù)進(jìn)行剪枝。
剪枝策略對(duì)決策樹(shù)的影響巨大,正確的剪枝策略是優(yōu)化決策樹(shù)算法的核心
max_depth
:限制樹(shù)的最大深度,超過(guò)設(shè)定深度的樹(shù)枝全部剪掉
- 默認(rèn)值為 None,即不做限制
- 這是用得最廣泛的剪枝參數(shù),在高維度低樣本量時(shí)非常有效。決策樹(shù)多生長(zhǎng)一層,對(duì)樣本量的需求會(huì)增加近似一倍,所以限制樹(shù)深度能夠有效地限制過(guò)擬合。在集成算法中也非常實(shí)用。實(shí)際使用時(shí),建議從 3 開(kāi)始嘗試,看看擬合的效 果再?zèng)Q定是否增加設(shè)定深度。
min_samples_leaf
:一個(gè)節(jié)點(diǎn)在分支后的每個(gè)子節(jié)點(diǎn)都必須包含至少 min_samples_leaf 個(gè)訓(xùn)練樣本,否則分枝就不會(huì)發(fā)生。
- 默認(rèn)值為 1
- 一般搭配 max_depth 使用,在回歸樹(shù)中有神奇的效果,可以讓模型變得更加平滑。這個(gè)參數(shù)的數(shù)量設(shè)置得太小可能會(huì)引起過(guò)擬合,設(shè)置得太大可能會(huì)欠擬合,一般從 5 開(kāi)始調(diào)整
- 如果葉節(jié)點(diǎn)中含有的樣本量變化很大,建議輸入浮點(diǎn)數(shù)作為樣本量的百分比來(lái)使用:當(dāng)輸入為浮點(diǎn)數(shù)時(shí),例如0.05,則表示 樣本量*0.05 作為參數(shù)值
- 這個(gè)參數(shù)可以保證每個(gè)葉子的最小尺寸,可以在回歸問(wèn)題中避免高方差,過(guò)擬合的葉子節(jié)點(diǎn)出現(xiàn)。
- 對(duì)于類(lèi)別不多的分類(lèi)問(wèn)題,1 通常就是最佳選擇。
min_samples_split
:一個(gè)節(jié)點(diǎn)必須要包含至 少min_samples_split 個(gè)訓(xùn)練樣本,這個(gè)節(jié)點(diǎn)才允許被分枝,否則分枝就不會(huì)發(fā)生。
- 注意這里的概念不要與 min_samples_leaf 進(jìn)行混淆,若樣本數(shù)量小于 min_samples_split 那么該節(jié)點(diǎn)就不會(huì)考慮進(jìn)行分支,是前提條件。
max_features
:限制分枝時(shí)考慮的特征個(gè)數(shù),超過(guò)限制個(gè)數(shù)的特征都會(huì)被舍棄。
- 默認(rèn)值為 None
- 如果
max_features
是一個(gè)整數(shù),則每個(gè)節(jié)點(diǎn)的拆分最多考慮max_features
個(gè)特征 - 如果
max_features
是一個(gè)浮點(diǎn)數(shù),則每個(gè)節(jié)點(diǎn)的拆分最多考慮max_features * n_features
個(gè)特征,其中n_features
是總特征數(shù)量 - 如果
max_features
是一個(gè)字符串,則使用特定的方法選擇特征。例如,"sqrt"表示每個(gè)節(jié)點(diǎn)的拆分最多考慮sqrt(n_features)
個(gè)特征,"log2"表示每個(gè)節(jié)點(diǎn)的拆分最多考慮log2(n_features)
個(gè)特征
max_features 用來(lái)限制高維度數(shù)據(jù)的過(guò)擬合的剪枝參數(shù),但其方法比較暴力,是直接限制可以使用的特征數(shù)量 而強(qiáng)行使決策樹(shù)停下的參數(shù),在不知道決策樹(shù)中的各個(gè)特征的重要性的情況下,強(qiáng)行設(shè)定這個(gè)參數(shù)可能會(huì)導(dǎo)致模型學(xué)習(xí)不足。
min_impurity_decrease
:限制信息增益的大小,信息增益小于設(shè)定數(shù)值的分枝不會(huì)發(fā)生
- 默認(rèn)值為 None,即不做限制
- 可以嘗試從一個(gè)相對(duì)較小的值開(kāi)始調(diào)優(yōu),例如0.001或0.0001,并根據(jù)結(jié)果逐漸調(diào)整
如何確認(rèn)最優(yōu)的剪枝參數(shù):
- 畫(huà)曲線,橫軸為超參數(shù)的值,縱軸為模型評(píng)估指標(biāo),觀察曲線來(lái)選擇超參數(shù)
剪枝參數(shù)的默認(rèn)值會(huì)讓樹(shù)無(wú)盡地生長(zhǎng),這些樹(shù)在某些數(shù)據(jù)集上可能非常巨大,對(duì)內(nèi)存的消耗也非常巨 大。所以如果你手中的數(shù)據(jù)集非常巨大,你已經(jīng)預(yù)測(cè)到無(wú)論如何你都是要剪枝的,那提前設(shè)定這些參數(shù)來(lái)控制樹(shù)的 復(fù)雜性和大小會(huì)比較好。
目標(biāo)權(quán)重參數(shù)
class_weight
:對(duì)樣本標(biāo)簽進(jìn)行一定的均衡,給少量的標(biāo)簽更多的權(quán)重,讓模型更偏向少數(shù)類(lèi),向捕獲少數(shù)類(lèi)的方向建模。該參數(shù)默認(rèn)None,此模式表示自動(dòng)給 與數(shù)據(jù)集中的所有標(biāo)簽相同的權(quán)重。
None
(默認(rèn)值):所有類(lèi)別的權(quán)重都被視為相等,不進(jìn)行特殊處理。'balanced'
:根據(jù)訓(xùn)練集中每個(gè)類(lèi)別的樣本數(shù)量自動(dòng)調(diào)整權(quán)重。權(quán)重與類(lèi)別中樣本數(shù)量的反比成正比。- 字典(Dictionary):可以手動(dòng)指定每個(gè)類(lèi)別的權(quán)重。字典的鍵是類(lèi)別標(biāo)簽,值是對(duì)應(yīng)的權(quán)重。例如,
{0: 1, 1: 2}
表示類(lèi)別0的權(quán)重為1,類(lèi)別1的權(quán)重為2
樣本不平衡:指在一組數(shù)據(jù)集中,標(biāo)簽的一類(lèi)天生占有很大的比例。比如說(shuō),在銀行要 判斷 "一個(gè)辦了信用卡的人是否會(huì)違約","是" 和 "否"(1%:99%)的比例。這種分類(lèi)狀況下,即便模型什么也不做,全把結(jié)果預(yù)測(cè)成 "否",正確率也能有99%。
min_weight_fraction_leaf
:用于控制葉子節(jié)點(diǎn)中樣本權(quán)重的最小總和的比例。它可以用來(lái)限制決策樹(shù)生成過(guò)程中葉子節(jié)點(diǎn)的最小權(quán)重
- 默認(rèn)值為 0.0
- 類(lèi)似于 min_samples_leaf,不過(guò)是權(quán)重版本的。在決策樹(shù)的生成過(guò)程中,分裂節(jié)點(diǎn)時(shí)會(huì)考慮葉子節(jié)點(diǎn)中樣本在指定權(quán)重下的總和。如果一個(gè)節(jié)點(diǎn)的權(quán)重總和低于 min_weight_fraction_leaf 指定的閾值,則不會(huì)進(jìn)行分支。
class_weight 相當(dāng)于給不同標(biāo)簽的樣本的數(shù)量加上了權(quán)重,決策樹(shù)在分支時(shí)會(huì)計(jì)算樣本量等操作,對(duì)于不均衡的數(shù)據(jù),class_weight 可以保證決策樹(shù)在計(jì)算不同標(biāo)簽樣本量時(shí)也會(huì)乘以不同的權(quán)重,一般對(duì)于不均衡數(shù)據(jù)參數(shù)使用 'balanced'
就可以了。
min_weight_fraction_leaf 就是權(quán)重版本的 min_samples_leaf 參數(shù),需要注意的是,在設(shè)定 class_weight 參數(shù)后使用 min_samples_leaf 參數(shù)在計(jì)算樣本量時(shí)是不會(huì)加上權(quán)重的。
決策樹(shù)的優(yōu)缺點(diǎn)
決策樹(shù)優(yōu)點(diǎn):
- 需要很少的數(shù)據(jù)準(zhǔn)備。其他很多算法通常都需要數(shù)據(jù)規(guī)范化,需要?jiǎng)?chuàng)建虛擬變量并刪除空值等。但請(qǐng)注意,sklearn中的決策樹(shù)模塊不支持對(duì)缺失值的處理。
- 使用樹(shù)的成本(比如說(shuō),在預(yù)測(cè)數(shù)據(jù)的時(shí)候)是用于訓(xùn)練樹(shù)的數(shù)據(jù)點(diǎn)的數(shù)量的對(duì)數(shù),相比于其他算法,這是一個(gè)很低的成本。
- 能夠同時(shí)處理數(shù)值型和離散型數(shù)據(jù),既可以做回歸又可以做分類(lèi)。
- 白盒模型,易于理解和解釋。如果在模型中可以觀察到給定的情況,則可以通過(guò)布爾邏輯輕松解釋條件。相反,在黑盒模型中(例如,在人工神經(jīng)網(wǎng)絡(luò)中),結(jié)果可能更難以解釋。
決策樹(shù)缺點(diǎn):
- 決策樹(shù)可能不穩(wěn)定,數(shù)據(jù)中微小的變化可能導(dǎo)致生成完全不同的樹(shù),這個(gè)問(wèn)題需要通過(guò)集成算法來(lái)解決。
- 決策樹(shù)的學(xué)習(xí)是基于貪心算法,它靠?jī)?yōu)化局部最優(yōu)(每個(gè)節(jié)點(diǎn)的最優(yōu))來(lái)試圖達(dá)到整體的最優(yōu),但這種做法不能保證返回全局最優(yōu)決策樹(shù)。
以上就是python sklearn中的決策樹(shù)模型詳解的詳細(xì)內(nèi)容,更多關(guān)于python sklearn決策樹(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python asyncore socket客戶端實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Python asyncore socket客戶端實(shí)現(xiàn)方法,asyncore庫(kù)是python的一個(gè)標(biāo)準(zhǔn)庫(kù),提供了以異步的方式寫(xiě)入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)2022-12-12一篇文章徹底搞懂Python中可迭代(Iterable)、迭代器(Iterator)與生成器(Generator)的概念
這篇文章主要給大家介紹了如何通過(guò)一篇文章徹底搞懂Python中可迭代(Iterable)、迭代器(Iterator)與生成器(Generator)的概念,對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05基于python分布式爬蟲(chóng)并解決假死的問(wèn)題
這篇文章主要介紹了基于python分布式爬蟲(chóng)并解決假死的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04如何在Python中自定義異常類(lèi)與異常處理機(jī)制
在Python編程中,異常處理是一種重要的編程范式,它允許我們?cè)诔绦蜻\(yùn)行時(shí)檢測(cè)并處理錯(cuò)誤,本文將介紹如何在Python中編寫(xiě)自定義的異常類(lèi),并詳細(xì)解釋Python的異常處理機(jī)制,感興趣的朋友一起看看吧2024-06-06postman發(fā)送文件請(qǐng)求并以python服務(wù)接收方式
這篇文章主要介紹了postman發(fā)送文件請(qǐng)求并以python服務(wù)接收方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07