決策樹分類與迴歸基礎實戰(一)

再刷DT,看完記得關注,能看完的是有緣人


迴歸樹

import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

N = 100
x = np.random.rand(N) * 6 - 3
x.sort()
y = np.sin(x) + np.random.rand(N) * 0.05
# y[5] = 5
print(y)

x = x.reshape(-1, 1)
print(x)


dt_reg = DecisionTreeRegressor(criterion='mse', max_depth=3)
dt_reg.fit(x, y)

x_test = np.linspace(-3, 3, 50).reshape(-1, 1)
y_hat = dt_reg.predict(x_test)

plt.plot(x, y, "y*", label="actual")
plt.plot(x_test, y_hat, "b-", linewidth=2, label="predict")
plt.legend(loc="upper left")
plt.grid()
plt.show()

# 比較不同深度的決策樹
depth = [2, 4, 6, 8, 10, 50]
color = 'rgbmyw'
dt_reg = DecisionTreeRegressor()
plt.plot(x, y, "ko", label="actual")
x_test = np.linspace(-3, 3, 50).reshape(-1, 1)
for d, c in zip(depth, color):
    dt_reg.set_params(max_depth=d)
    dt_reg.fit(x, y)
    y_hat = dt_reg.predict(x_test)
    plt.plot(x_test, y_hat, '-', color=c, linewidth=2, label="depth=%d" % d)
plt.legend(loc="upper left")
plt.grid(b=True)
plt.show()

先看展示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s5DuRtzq-1590900366353)(D:\CSDN\pic\決策樹\1590885735988.png)]

這個是在max_depth=3 的決策樹深度下的迴歸擬合,我們開始調參展示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DX10URSH-1590900366356)(D:\CSDN\pic\決策樹\1590885947781.png)]

從紅線到綠線,到藍色,紫色,黃色白色,在一定限度內隨着決策樹深度的加深,而擬合程度加深,迴歸更好。

代碼就不解讀了,太簡單了,我們瞭解一下源代碼!!

class sklearn.tree.DecisionTreeRegressor (criterion=’mse’, splitter=’best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort=False)

與分類樹對比:

criterion參數取值不同;
迴歸樹種,沒有標籤分佈是否均衡的問題,所以沒有目標權重的參數;
屬性及接口都和分類樹的功能一模一樣;但是實現方式略有不同

criterion 參數:迴歸樹衡量分枝質量的指標

支持的標準有三種:
1)criterion=“mse”:使用均方誤差mean squared error(MSE),父節點和葉子節點之間的均方誤差的差額將被用來作爲特徵選擇的標準,這種方法通過使用葉子節點的均值來最小化L2損失
2)criterion=“friedman_mse”:使用費爾德曼均方誤差,這種指標使用弗裏德曼針對潛在分枝中的問題改進後的均方誤差
3)criterion=“mae”:使用絕對平均誤差MAE(mean absolute error),這種指標使用葉節點的中值來最小化L1損失

score接口:衡量模型好壞程度

在DecisionTreeClassifier中,這個接口返回的是“模型的準確度”;而在DecisionTreeRegressor中,這個接口返回的是“R平方”(此處不對什麼是R平方解釋),但是雖然稱爲“R平方”但是可以取值可以爲正爲負(如果模型的殘差平方和 > 模型的總平方和,模型非常糟糕,R平方就會爲負),R方越接近1越好。

說明:

對於迴歸樹來說,衡量模型好不好除了使用接口score以外,還不得不提“交叉驗證”的方法,如果想使用均方誤差作爲模型的衡量指標,就要使用交叉驗證

Splitter = 'best’

拆分器:{“best”,“random”},默認值爲“best”

用於在每個節點上選擇拆分的策略。支持

策略是“最佳”選擇最佳分割和“隨機”選擇

最好的隨機分割。

min_samples_leaf=1

每個非空子結點最少一片葉子。 葉子節點最少樣本數 如果是 int,則取傳入值本身作爲最小樣本數; 如果是 float,則去 ceil(min_samples_leaf * 樣本數量) 的值作爲最小樣本數,即向上取整。 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。

max_depth 決策樹最大深度 int or None, optional (default=None) 一般來說,數據少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。常用的可以取值10-100之間。常用來解決過擬合
min_impurity_decrease 節點劃分最小不純度 float, optional (default=0.) 這個值限制了決策樹的增長,如果某節點的不純度(基尼係數,信息增益,均方差,絕對差)小於這個閾值,則該節點不再生成子節點。 sklearn 0.19.1版本之前叫 min_impurity_split
min_samples_split 內部節點再劃分所需最小樣本數 int, float, optional (default=2) 如果是 int,則取傳入值本身作爲最小樣本數; 如果是 float,則去 ceil(min_samples_split * 樣本數量) 的值作爲最小樣本數,即向上取整。

max_leaf_nodes 最大葉子節點數 int or None, optional (default=None) 通過限制最大葉子節點數,可以防止過擬合,默認是”None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。

min_impurity_split 信息增益的閥值 決策樹在創建分支時,信息增益必須大於這個閥值,否則不分裂

信息增益上一節說了,傳送門~

min_weight_fraction_leaf 葉子節點最小的樣本權重和 float, optional (default=0.) 這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。

class_weight 類別權重 dict, list of dicts, “balanced” or None, default=None 指定樣本各類別的的權重,主要是爲了防止訓練集某些類別的樣本過多,導致訓練的決策樹過於偏向這些類別。這裏可以自己指定各個樣本的權重,或者用“balanced”,如果使用“balanced”,則算法會自己計算權重,樣本量少的類別所對應的樣本權重會高。當然,如果你的樣本類別分佈沒有明顯的偏倚,則可以不管這個參數,選擇默認的”None” 不適用於迴歸樹 sklearn.tree.DecisionTreeRegressor
資料來源官網。

模型調參注意事項:

當樣本少數量但是樣本特徵非常多的時候,決策樹很容易過擬合,一般來說,樣本數比特徵數多一些會比較容易建立健壯的模型
如果樣本數量少但是樣本特徵非常多,在擬合決策樹模型前,推薦先做維度規約,比如主成分分析(PCA),特徵選擇(Losso)或者獨立成分分析(ICA)。這樣特徵的維度會大大減小。再來擬合決策樹模型效果會好。
推薦多用決策樹的可視化,同時先限制決策樹的深度(比如最多3層),這樣可以先觀察下生成的決策樹裏數據的初步擬合情況,然後再決定是否要增加深度。
在訓練模型先,注意觀察樣本的類別情況(主要指分類樹),如果類別分佈非常不均勻,就要考慮用class_weight來限制模型過於偏向樣本多的類別。
決策樹的數組使用的是numpy的float32類型,如果訓練數據不是這樣的格式,算法會先做copy再運行。
如果輸入的樣本矩陣是稀疏的,推薦在擬合前調用csc_matrix稀疏化,在預測前調用csr_matrix稀疏化。

缺點介紹

過擬合

    採用上面算法生成的決策樹在事件中往往會導致過擬合。也就是該決策樹對訓練數據可以得到很低的錯誤率,但是運用到測試數據上卻得到非常高的錯誤率。過擬合的原因有以下幾點:

• 噪音數據:訓練數據中存在噪音數據,決策樹的某些節點有噪音數據作爲分割標準,導致決策樹無法代表真實數據。

• 缺少代表性數據:訓練數據沒有包含所有具有代表性的數據,導致某一類數據無法很好的匹配,這一點可以通過觀察混淆矩陣(Confusion Matrix)分析得出。

• 多重比較(Mulitple Comparition),這一情況和決策樹選取分割點類似,需要在每個變量的每一個值中選取一個作爲分割的代表,所以選出一個噪音分割標準的概率是很大的。
我們來看看這個:
根據上面的算法:修改某個數值:

N = 100
x = np.random.rand(N) * 6 - 3
x.sort()
y = np.sin(x) + np.random.rand(N) * 0.05
y[-8] = 10
print(y)

我們修改了y[-8]值爲10,這個就是異常數據,噪點了,我們看一下基於決策樹深度爲2的迴歸可視化:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QxrYhrX3-1590900366358)(D:\CSDN\pic\決策樹\1590888409863.png)]

那麼這樣,一看便知結果了,過擬合。

不過,我們使用的決策樹的

from sklearn.tree import DecisionTreeRegressor

並不是相像中那麼差,例如:我們再將數值調大一點點:

y[-8] =13:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GqZyHPUO-1590900366363)(D:\CSDN\pic\決策樹\1590888569084.png)]

這便優化了過擬合問題,也就是說,算法能分析出這是異常點,不必管他,丟掉。

重點來了,如何解決過擬合呢??

我看了網上資料較少,自己整理了一些方法,當然介紹參數上的,其他的例如,數據上的,預處理上的,特徵工程和歸一化,pca降維等方法暫時不深挖。

解決過擬合欠擬合問題,常用的就是max_depth

優化過擬合問題,在決策迴歸樹中,SKlean使用這個參數可以更好的優化。

dt_reg = DecisionTreeRegressor(criterion='mse', max_depth=8, min_impurity_decrease=0.001)

min_impurity_decrease=0.001這個參數我們上面介紹過,現在可以網上翻翻。min_impurity_decrease 節點劃分最小不純度 float, optional (default=0.) 這個值限制了決策樹的增長,如果某節點的不純度(基尼係數,信息增益,均方差,絕對差)小於這個閾值,則該節點不再生成子節點。

不過,他其實並沒用那麼有用,還是加深了深度才提高效果的,看結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tNA2liPy-1590900366366)(D:\CSDN\pic\決策樹\1590889360428.png)]

那麼還有哪些方法呢??

接着我們使用這個參數來過濾異常點,他產生的信息增益差值大於閾值,便不分裂該節點。

min_impurity_split=0.1

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SBEzDcvl-1590900366368)(D:\CSDN\pic\決策樹\1590889632917.png)]

調參過後:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-m0qCIJrb-1590900366371)(D:\CSDN\pic\決策樹\1590889717271.png)]

今天分享至此~三連支持!另邀深度學習交流羣,與廣大煉丹師共同交流。

在這裏插入圖片描述周小夏(CV調包俠)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章