sklearn機(jī)器學(xué)習(xí)庫(一)sklearn中的決策樹
sklearn中決策樹的類都在”tree“這個(gè)模塊之下。
tree.DecisionTreeClassifier | 分類樹 |
---|---|
tree.DecisionTreeRegressor | 回歸樹 |
tree.export_graphviz | 將生成的決策樹導(dǎo)出為DOT格式,畫圖專用 |
tree.export_text | 以文字形式輸出樹 |
tree.ExtraTreeClassifier | 高隨機(jī)版本的分類樹 |
tree.ExtraTreeRegressor | 高隨機(jī)版本的回歸樹 |
1、DecisionTreeClassifier及其重要參數(shù)
1.1 重要參數(shù)
1.1.1 參數(shù)criterion
-
決策樹需要找出最佳節(jié)點(diǎn)和最佳的分枝方法,對(duì)分類樹來說,衡量這個(gè)“最佳”的指標(biāo)叫做“不純度”。
-
通常來說,不純度越低,決策樹對(duì)訓(xùn)練集的擬合越好。
-
不純度基于節(jié)點(diǎn)來計(jì)算,樹中的每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)不純度,并且子節(jié)點(diǎn)的不純度一定是低于父節(jié)點(diǎn)的。
-
criterion這個(gè)參數(shù)正是用來決定不純度的計(jì)算方法的。sklearn提供了兩種選擇:
-
輸入”entropy“,使用信息熵(Entropy)
-
輸入”gini“,使用基尼系數(shù)(Gini Impurity)
-
在實(shí)際使用中,信息熵和基尼系數(shù)的效果基本相同
。
信息熵的計(jì)算比基尼系數(shù)緩慢一些,因?yàn)榛嵯禂?shù)的計(jì)算不涉及對(duì)數(shù)。
因?yàn)樾畔㈧貙?duì)不純度更加敏感,所以信息熵作為指標(biāo)時(shí),決策樹的生長(zhǎng)會(huì)更加“精細(xì)”,因此對(duì)于高維數(shù)據(jù)或者噪音很多的數(shù)據(jù),信息熵很容易過擬合,基尼系數(shù)在這種情況下效果往往比較好。
當(dāng)模型擬合程度不足的時(shí)候,即當(dāng)模型在訓(xùn)練集和測(cè)試集上都表現(xiàn)不太好的時(shí)候,使用信息熵。當(dāng)然,這些不是絕對(duì)的。
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import pandas as pd
# 紅酒數(shù)據(jù)集
wine = load_wine()
print(wine.keys())
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
print(wine.data.shape)
print(wine.target)
print(wine.feature_names)
print(wine.target_names)
(178, 13)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline']
['class_0' 'class_1' 'class_2']
pd.concat(
# 在列上進(jìn)行拼接
[pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1
)
# 劃分訓(xùn)練集和測(cè)試集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target,test_size=0.3)
print(Xtrain.shape)
print(Xtest.shape)
(124, 13)
(54, 13)
# 模型創(chuàng)建與訓(xùn)練
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) # 返回預(yù)測(cè)的準(zhǔn)確度
print(score)
import graphviz
# 畫出決策樹
feature_name = ['酒精','蘋果酸','灰','灰的堿性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強(qiáng)度','色調(diào)','od280/od315稀釋葡萄酒','脯氨酸']
dot = tree.export_graphviz(
decision_tree=clf,
out_file=None,
feature_names=feature_name,
class_names=["琴酒","雪莉","貝爾摩德"],
filled=True, # 填充顏色
rounded=True # 鈍化角
)
graph = graphviz.Source(dot)
graph
# 特征重要性
sorted([*zip(feature_name,clf.feature_importances_)],key=lambda x:x[1],reverse=True)
[('od280/od315稀釋葡萄酒', 0.4258755013151412),
('脯氨酸', 0.34593013978074255),
('酒精', 0.08094994077047969),
('顏色強(qiáng)度', 0.07600214535710607),
('色調(diào)', 0.03483435693073402),
('蘋果酸', 0.02210497552631582),
('花青素', 0.014302940319480591),
('灰', 0.0),
('灰的堿性', 0.0),
('鎂', 0.0),
('總酚', 0.0),
('類黃酮', 0.0),
('非黃烷類酚類', 0.0)]
總結(jié)如下:
-
通常就使用基尼系數(shù)
-
數(shù)據(jù)維度很大,噪音很大時(shí)使用基尼系數(shù)
-
維度低,數(shù)據(jù)比較清晰的時(shí)候,信息熵和基尼系數(shù)沒區(qū)別
-
當(dāng)決策樹的擬合程度不夠的時(shí)候,使用信息熵
-
總之,兩個(gè)都試試,不好就換另外一個(gè)
決策樹在建樹時(shí),是靠?jī)?yōu)化節(jié)點(diǎn)來追求一棵優(yōu)化的樹,但最優(yōu)的節(jié)點(diǎn)能夠保證最優(yōu)的樹嗎?
集成算法被用來解決這個(gè)問題:既然一棵樹不能保證最優(yōu),那就建更多的不同的樹,然后從中取最好的。
怎樣從一組數(shù)據(jù)集中建不同的樹?在每次分枝時(shí),不從使用全部特征,而是隨機(jī)選取一部分特征,從中選取不純度相關(guān)指標(biāo)最優(yōu)的作為分枝用的節(jié)點(diǎn)。這樣,每次生成的樹也就不同了。
1.1.2 random_state & splitter
-
random_state隨機(jī)模式參數(shù),默認(rèn)None,在高維度時(shí)隨機(jī)性會(huì)表現(xiàn)更明顯,低維度的數(shù)據(jù)(比如鳶尾花數(shù)據(jù)集),隨機(jī)性幾乎不會(huì)顯現(xiàn)。輸入任意整數(shù),會(huì)一直長(zhǎng)出同一棵樹,讓模型穩(wěn)定下來。
-
splitter也是用來控制決策樹中的隨機(jī)選項(xiàng)的,有兩種輸入值
- 輸入”best",決策樹在分枝時(shí)雖然隨機(jī),但是還是會(huì)優(yōu)先選擇更重要的特征進(jìn)行分枝
- 輸入“random",決策樹在分枝時(shí)會(huì)更加隨機(jī),樹會(huì)因?yàn)楹?code>更多的不必要信息而更深更大。這也是防止過擬合的一種方式。當(dāng)然,我們經(jīng)常會(huì)使用剪枝參數(shù)來防止過擬合。
clf = tree.DecisionTreeClassifier(
criterion='entropy',
random_state=30,
splitter='random'
)
clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) # 返回預(yù)測(cè)的準(zhǔn)確度
print(score)
1.1.3 剪枝參數(shù)
決策樹往往會(huì)過擬合,它會(huì)在訓(xùn)練集上表現(xiàn)很好,在測(cè)試集上卻表現(xiàn)糟糕。 我們收集的樣本數(shù)據(jù)不可能和整體的狀況完全一致,因此當(dāng)一棵決策樹對(duì)訓(xùn)練數(shù)據(jù)有了過于優(yōu)秀的解釋性,它找出的規(guī)則必然包含了訓(xùn)練樣本中的噪聲,并使它對(duì)未知數(shù)據(jù)的擬合程度不足。
剪枝策略對(duì)決策樹的影響巨大,正確的剪枝策略是優(yōu)化決策樹算法的核心。
sklearn為我們提供了不同的剪枝策略:
1.1.3.1 max_depth
限制樹的最大深度,超過設(shè)定深度的樹枝全部剪掉,這是用得最廣泛的剪枝參數(shù),在高維度低樣本量時(shí)非常有效。
決策樹多生長(zhǎng)一層,對(duì)樣本量的需求會(huì)增加一倍,所以限制樹深度能夠有效地限制過擬合。
在集成算法中也非常實(shí)用。
實(shí)際使用時(shí),建議從=3開始嘗試,看看擬合的效果再?zèng)Q定是否增加設(shè)定深度
。
1.1.3.2 min_samples_leaf & min_samples_split
min_samples_leaf,限定一個(gè)節(jié)點(diǎn)在分枝后的每個(gè)子節(jié)點(diǎn)
都必須包含至少min_samples_leaf個(gè)訓(xùn)練樣本,否則分枝就不會(huì)發(fā)生 。
-
一般搭配max_depth使用,可以讓模型變得更加平滑。
-
這個(gè)參數(shù)的數(shù)量設(shè)置得太小會(huì)引起過擬合,設(shè)置得太大就會(huì)阻止模型學(xué)習(xí)數(shù)據(jù)。
-
一般來說,建議從=5開始使用。如果葉節(jié)點(diǎn)中含有的樣本量變化很大,建議輸入浮點(diǎn)數(shù)作為樣本量的百分比來使用。
-
同時(shí),這個(gè)參數(shù)可以保證每個(gè)葉子的最小尺寸,可以在回歸問題中避免低方差,過擬合的葉子節(jié)點(diǎn)出現(xiàn)。
-
對(duì)于類別不多的分類問題,=1通常就是最佳選擇。
min_samples_split,限定一個(gè)節(jié)點(diǎn)必須要包含至少min_samples_split個(gè)訓(xùn)練樣本,這個(gè)節(jié)點(diǎn)才允許被分枝,否則分枝就不會(huì)發(fā)生。
clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter="random"
,max_depth=3
,min_samples_leaf=10
,min_samples_split=10
)
clf = clf.fit(Xtrain, Ytrain)
dot_data = tree.export_graphviz(clf
,feature_names= feature_name
,class_names=["琴酒","雪莉","貝爾摩德"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
print(clf.score(Xtrain,Ytrain))
print(clf.score(Xtest,Ytest))
0.8951612903225806
0.8888888888888888
1.1.3.3 max_features & min_impurity_decrease
max_features
限制分枝時(shí)考慮的特征個(gè)數(shù),超過限制個(gè)數(shù)的特征都會(huì)被舍棄。
max_features是用來限制高維度數(shù)據(jù)的過擬合的剪枝參數(shù),但其方法比較暴力,是直接限制可以使用的特征數(shù)量而強(qiáng)行使決策樹停下的參數(shù),在不知道決策樹中的各個(gè)特征的重要性的情況下,強(qiáng)行設(shè)定這個(gè)參數(shù)可能會(huì)導(dǎo)致模型學(xué)習(xí)不足。如果希望通過降維的方式防止過擬合,建議使用PCA,ICA或者特征選擇模塊中的降維算法。
min_impurity_decrease
限制信息增益的大小,信息增益小于設(shè)定數(shù)值的分枝不會(huì)發(fā)生。
1.1.3.4 確認(rèn)最優(yōu)的剪枝參數(shù)
超參數(shù)的學(xué)習(xí)曲線,是一條以超參數(shù)的取值為橫坐標(biāo),模型的度量指標(biāo)為縱坐標(biāo)的曲線,它是用來衡量不同超參數(shù)取值下模型的表現(xiàn)的線。 我們可以通過學(xué)習(xí)曲線,來確定最優(yōu)的剪枝參數(shù)。
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(
max_depth= i + 1,
criterion='entropy',
random_state=30,
splitter='random'
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11), test,color='green', label='max_depth')
plt.legend()
plt.show()
這么多參數(shù),需要一個(gè)個(gè)畫學(xué)習(xí)曲線嗎?我們?cè)谙旅姘咐?,使用網(wǎng)格搜索來進(jìn)行多個(gè)參數(shù)的調(diào)參。
剪枝參數(shù)的默認(rèn)值會(huì)讓樹無盡地生長(zhǎng),這些樹在某些數(shù)據(jù)集上可能非常巨大,對(duì)內(nèi)存的消耗也非常巨大。所以如果你手中的數(shù)據(jù)集非常巨大,你已經(jīng)預(yù)測(cè)到無論如何你都是要剪枝的,那提前設(shè)定這些參數(shù)來控制樹的復(fù)雜性和大小會(huì)比較好。
1.1.3.5 class_weight & min_weight_fraction_leaf
樣本不平衡是指在一組數(shù)據(jù)集中,標(biāo)簽的一類天生占有很大的比例。比如說,在銀行要判斷“一個(gè)辦了信用卡的人是否會(huì)違約”,是vs否(1%:99%)的比例。這種分類狀況下,即便模型什么也不做,全把結(jié)果預(yù)測(cè)成“否”,正確率也能有99%。
因此我們要使用class_weight參數(shù)對(duì)樣本標(biāo)簽進(jìn)行一定的均衡,給少量的標(biāo)簽更多的權(quán)重,讓模型更偏向少數(shù)類,向捕獲少數(shù)類的方向建模。該參數(shù)默認(rèn)None,此模式表示自動(dòng)給與數(shù)據(jù)集中的所有標(biāo)簽相同的權(quán)重。
有了權(quán)重之后,樣本量就不再是單純地記錄數(shù)目,而是受輸入的權(quán)重影響了,因此這時(shí)候剪枝,就需要搭配min_weight_fraction_leaf這個(gè)基于權(quán)重的剪枝參數(shù)來使用。
1.2 重要的屬性和接口
決策樹來說,最重要的屬性是feature_importances_,能夠查看各個(gè)特征對(duì)模型的重要性。
sklearn中許多算法的接口都是相似的,比如說我們之前已經(jīng)用到的fit和score,幾乎對(duì)每個(gè)算法都可以使用。
除了這兩個(gè)接口之外,決策樹最常用的接口還有apply和predict。apply中輸入測(cè)試集返回每個(gè)測(cè)試樣本所在的葉子節(jié)點(diǎn)的索引,predict輸入測(cè)試集返回每個(gè)測(cè)試樣本的標(biāo)簽。
#apply返回每個(gè)測(cè)試樣本所在的葉子節(jié)點(diǎn)的索引
clf.apply(Xtest)
#predict返回每個(gè)測(cè)試樣本的分類/回歸結(jié)果
clf.predict(Xtest)
所有接口中要求輸入X_train和X_test的部分,輸入的特征矩陣必須至少是一個(gè)二維矩陣
。sklearn不接受任何一維矩陣作為特征矩陣被輸入。
2、DecisionTreeRegressor及其重要參數(shù)
DecisionTreeRegressor幾乎所有參數(shù),屬性及接口都和分類樹一模一樣。
需要注意的是,在回歸樹中,沒有標(biāo)簽分布是否均衡的問題,因此沒有class_weight這樣的參數(shù) 。
2.1 criterion
回歸樹衡量分枝質(zhì)量的指標(biāo),支持的標(biāo)準(zhǔn)有三種:
-
輸入"mse"使用均方誤差mean squared error(MSE),父節(jié)點(diǎn)和葉子節(jié)點(diǎn)之間的均方誤差的差額將被用來作為特征選擇的標(biāo)準(zhǔn),這種方法通過使用葉子節(jié)點(diǎn)的均值來最小化L2損失。
-
輸入“friedman_mse”使用費(fèi)爾德曼均方誤差,這種指標(biāo)使用弗里德曼針對(duì)潛在分枝中的問題改進(jìn)后的均方誤差
-
輸入"mae"使用絕對(duì)平均誤差MAE(mean absolute error)
屬性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心 。
回歸樹中,MSE不只是我們的分枝質(zhì)量衡量指標(biāo),也是我們最常用的衡量回歸樹回歸質(zhì)量的指標(biāo)
。
當(dāng)我們?cè)谑褂媒徊骝?yàn)證,或者其他方式獲取回歸樹的結(jié)果時(shí),我們往往選擇均方誤差作為我們的評(píng)估(在分類樹中這個(gè)指標(biāo)是score代表的預(yù)測(cè)準(zhǔn)確率)。在回歸中,我們追求的是,MSE越小越好。
回歸樹的接口score返回的是R平方,并不是MSE
。 R平方可以為正為負(fù)(如果模型的殘差平方和遠(yuǎn)遠(yuǎn)大于模型的總平方和,模型非常糟糕,R平方就會(huì)為負(fù)),而均方誤差永遠(yuǎn)為正。
其中: u是殘差平方和(MSE * N),v是總平方和,N是樣本數(shù)量,i是每一個(gè)數(shù)據(jù)樣本,fi是模型回歸出的數(shù)值,yi是樣本點(diǎn)i實(shí)際的數(shù)值標(biāo)簽。y帽是真實(shí)數(shù)值標(biāo)簽的平均數(shù)。
注意:
雖然均方誤差永遠(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ù)字。
import pandas as pd
from sklearn import tree
from sklearn.model_selection import cross_val_score
# 1、讀取波士頓數(shù)據(jù)集,注意:新版本的sklearn中自帶的已經(jīng)刪除
data = pd.read_csv("boston_housing.data", sep='\s+', header=None)
x = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 2、交叉驗(yàn)證
regressor = tree.DecisionTreeRegressor(random_state=420)
cross_val_score(
regressor,
x,
y,
cv=10, # 10折交叉驗(yàn)證
scoring='neg_mean_squared_error' # 負(fù)均方誤差
).mean()
交叉驗(yàn)證是用來觀察模型的穩(wěn)定性的一種方法,我們將數(shù)據(jù)劃分為n份,依次使用其中一份作為測(cè)試集,其他n-1份作為訓(xùn)練集,多次計(jì)算模型的精確性來評(píng)估模型的平均準(zhǔn)確程度。訓(xùn)練集和測(cè)試集的劃分會(huì)干擾模型的結(jié)果,因此用交叉驗(yàn)證n次的結(jié)果求出的平均值,是對(duì)模型效果的一個(gè)更好的度量。
2.2 一維回歸的圖像繪制小案例
我們用回歸樹來擬合正弦曲線,并添加一些噪聲來觀察回歸樹的表現(xiàn)。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
'''
我們的基本思路是,先創(chuàng)建一組隨機(jī)的,分布在0~5上的橫坐標(biāo)軸的取值(x),然后將這一組值放到sin函
數(shù)中去生成縱坐標(biāo)的值(y),接著再到y(tǒng)上去添加噪聲。
'''
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80,1), axis=0)
y = np.sin(X).ravel() # ravel()降維
y[::5] += 3 * (0.5 - rng.rand(16)) # 每隔5個(gè),添加一個(gè)噪聲數(shù)據(jù)
# 訓(xùn)練模型
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 測(cè)試數(shù)據(jù)
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] # np.newaxis 升緯
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
# 畫圖展示
plt.figure()
plt.figure(figsize=(8,6))
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()
回歸樹學(xué)習(xí)了近似正弦曲線的局部線性回歸。
我們可以看到,如果樹的最大深度(由max_depth參數(shù)控制)設(shè)置得太高,則決策樹學(xué)習(xí)得太精細(xì),它從訓(xùn)練數(shù)據(jù)中學(xué)了很多細(xì)節(jié),包括噪聲得呈現(xiàn),從而使模型偏離真實(shí)的正弦曲線,形成過擬合。
3、實(shí)例:泰坦尼克號(hào)幸存者的預(yù)測(cè)
3.1 數(shù)據(jù)預(yù)處理和特征工程
import pandas as pd
from sklearn.model_selection import cross_val_score,train_test_split,GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from matplotlib import pyplot as plt
data = pd.read_csv(r'data.csv')
data.head()
文章來源:http://www.zghlxwxcb.cn/news/detail-645327.html
# 數(shù)據(jù)預(yù)處理
# 刪除缺失值過多的列、以及和y沒有關(guān)系的列
data.drop(['Cabin','Name','Ticket'], inplace=True,axis=1)
# 填充缺失值
# 缺失值較少的填充均值
data['Age'] = data['Age'].fillna(data['Age'].mean())
# 缺失值較多的,直接刪除
data = data.dropna()
# 將分類變量轉(zhuǎn)換為數(shù)值變量
# 性別是2分類變量
print(data['Sex'].unique().tolist())
# 性別轉(zhuǎn)換為 male = 1 female = 0
data['Sex'] = (data['Sex'] == 'male').astype(int)
# Embarked是3分類變量
print(data['Embarked'].unique().tolist())
# 直接轉(zhuǎn)換為list的下標(biāo)
labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x))
3.2 模型訓(xùn)練
# 劃分訓(xùn)練集和測(cè)試集
X = data.iloc[:, 2:]
y = data.iloc[:, 1]
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3)
# 導(dǎo)入模型,粗略跑一下,查看結(jié)果
clf = DecisionTreeClassifier(random_state=25)
clf = clf.fit(Xtrain, Ytrain)
score_ = clf.score(Xtest, Ytest)
print(score_)
# 通過學(xué)習(xí)曲線,觀察在不同深度下模型擬合的狀況
train_score = []
test_score = []
for i in range(10):
clf = DecisionTreeClassifier(random_state=25, max_depth=(i + 1),criterion='entropy')
clf = clf.fit(Xtrain, Ytrain)
score_train = clf.score(Xtest, Ytest)
# 使用全量的數(shù)據(jù)集求取交叉驗(yàn)證的均值
score_test = cross_val_score(clf, X, y, cv=10).mean()
train_score.append(score_train)
test_score.append(score_test)
# 打印最大的測(cè)試分?jǐn)?shù),以及所在的索引
print(max(test_score),test_score.index(max(test_score)))
# 畫圖
plt.plot(range(1,11),train_score,color='orange',label='train')
plt.plot(range(1,11),test_score,color='green',label='test')
plt.xticks(range(1,11))
plt.legend()
plt.show()
文章來源地址http://www.zghlxwxcb.cn/news/detail-645327.html
# 使用網(wǎng)格搜搜調(diào)整多個(gè)參數(shù)
import numpy as np
gini_thresholds = np.linspace(0,0.5,20)
parameters = {'splitter':('best','random')
,'criterion':("gini","entropy")
,"max_depth":[*range(1,10)]
,'min_samples_leaf':[*range(1,50,5)]
,'min_impurity_decrease':[*np.linspace(0,0.5,20)]
}
clf = DecisionTreeClassifier(random_state=25)
gs = GridSearchCV(clf,parameters, cv=10)
gs.fit(Xtrain, Ytrain)
print(gs.best_params_)
print(gs.best_score_)
{'criterion': 'entropy', 'max_depth': 4, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 11, 'splitter': 'random'}
0.8087301587301587
到了這里,關(guān)于sklearn機(jī)器學(xué)習(xí)庫(一)sklearn中的決策樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!