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

