剪枝參數
- 在不加限制的情況下,一棵決策樹會生長到衡量不純度的指標最優,或者沒有更多的特征可用為止。這樣的決策樹 往往會過擬合。為了讓決策樹有更好的泛化性,我們要對決策樹進行剪枝。剪枝策略對決策樹的影響巨大,正確的剪枝策略是優化 決策樹算法的核心。
sklearn
為我們提供了不同的剪枝策略:
max_depth
-
限制樹的最大深度,超過設定深度的樹枝全部剪掉
這是用得最廣泛的剪枝參數,在高維度低樣本量時非常有效。決策樹多生長一層,對樣本量的需求會增加一倍,所 以限制樹深度能夠有效地限制過擬合。在集成算法中也非常實用。實際使用時,建議從=3開始嘗試,看看擬合的效 果再決定是否增加設定深度。
min_samples_leaf & min_samples_split
-
min_samples_leaf
限定,一個節點在分枝后的每個子節點都必須包含至少min_samples_leaf
個訓練樣本,否則分 枝就不會發生,或者,分枝會朝著滿足每個子節點都包含min_samples_leaf
個樣本的方向去發生。min_samples_leaf
限定,一個節點在分枝后的每個子節點都必須包含至少min_samples_leaf
個訓練樣本,否則分 枝就不會發生,或者,分枝會朝著滿足每個子節點都包含min_samples_leaf
個樣本的方向去發生 一般搭配max_depth
使用,在回歸樹中有神奇的效果,可以讓模型變得更加平滑。這個參數的數量設置得太小會引 起過擬合,設置得太大就會阻止模型學習數據。一般來說,建議從=5開始使用。如果葉節點中含有的樣本量變化很 大,建議輸入浮點數作為樣本量的百分比來使用。同時,這個參數可以保證每個葉子的最小尺寸,可以在回歸問題 中避免低方差,過擬合的葉子節點出現。對于類別不多的分類問題,=1通常就是最佳選擇。 -
min_samples_split
限定,一個節點必須要包含至少min_samples_split
個訓練樣本,這個節點才允許被分枝,否則 分枝就不會發生。 -
min_samples_leaf
= 10min_samples_split
= 25# -*- coding: utf-8 -*-""" ************************************************** @author: Ying @software: PyCharm @file: 3、分類樹_min_samples_leaf& min_samples_split.py @time: 2021-08-26 10:51 ************************************************** """ from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split import pandas as pd import graphviz# 加載數據 wine = load_wine() data = pd.DataFrame(wine.data, columns=wine.feature_names) # X target = pd.DataFrame(wine.target) # y# 劃分訓練測試集 X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3)clf = tree.DecisionTreeClassifier(criterion="entropy", random_state=30, splitter="random", max_depth=3, min_samples_leaf=10, min_samples_split=25)clf.fit(X_train, y_train) score = clf.score(X_test, y_test) # 返回預測的準確度# 保存決策樹圖 feature_name = ['酒精', '蘋果酸', '灰', '灰的堿性', '鎂', '總酚', '類黃酮', '非黃烷類酚類','花青素', '顏色強度', '色調', 'od280/od315稀釋葡萄酒', '脯氨酸']dot_data = tree.export_graphviz(clf, feature_names=feature_name, class_names=["琴酒", "雪莉", "貝爾摩德"], filled=True # 填充顏色, rounded=True # 圓角) graph = graphviz.Source(dot_data)graph.render(view=True, format="png", filename="./save/decisiontree_pdf")# 特征重要性 feature_importances = clf.feature_importances_a = pd.DataFrame([*zip(feature_name, feature_importances)]) a.columns = ['feature', 'importance'] a.sort_values('importance', ascending=False, inplace=True) print(a)
?
max_features & min_impurity_decrease
- 一般max_depth使用,用作樹的”精修“ max_features限制分枝時考慮的特征個數,超過限制個數的特征都會被舍棄。和max_depth異曲同工, max_features是用來限制高維度數據的過擬合的剪枝參數,但其方法比較暴力,是直接限制可以使用的特征數量 而強行使決策樹停下的參數,在不知道決策樹中的各個特征的重要性的情況下,強行設定這個參數可能會導致模型 學習不足。如果希望通過降維的方式防止過擬合,建議使用PCA,ICA或者特征選擇模塊中的降維算法。 min_impurity_decrease限制信息增益的大小,信息增益小于設定數值的分枝不會發生。這是在0.19版本中更新的 功能,在0.19版本之前時使用min_impurity_split。
確定最優剪枝參數(超參數曲線)
-
那具體怎么來確定每個參數填寫什么值呢?這時候,我們就要使用確定超參數的曲線來進行判斷了,繼續使用我們 已經訓練好的決策樹模型clf。超參數的學習曲線,是一條以超參數的取值為橫坐標,模型的度量指標為縱坐標的曲 線,它是用來衡量不同超參數取值下模型的表現的線。在我們建好的決策樹里,我們的模型度量指標就是score。
# -*- coding: utf-8 -*-""" ************************************************** @author: Ying @software: PyCharm @file: 4、分類樹_超參數曲線.py @time: 2021-12-01 11:28 ************************************************** """from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split import pandas as pd import matplotlib.pyplot as plt# 加載數據 wine = load_wine() data = pd.DataFrame(wine.data, columns=wine.feature_names) # X target = pd.DataFrame(wine.target) # y# 劃分訓練測試集 X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3)test = [] for i in range(10):clf = tree.DecisionTreeClassifier(max_depth=i+1,criterion="entropy",random_state=10,splitter='random')clf = clf.fit(X_train, y_train)score = clf.score(X_test, y_test)test.append(score) plt.plot(range(1,11),test,color="red",label="max_depth") plt.legend() plt.show()