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