使用sklearn的決策樹實(shí)現(xiàn)iris鳶尾花數(shù)據(jù)集的分類
要求:
建立分類模型锭沟,至少包含4個(gè)剪枝參數(shù):max_depth致燥、min_samples_leaf 蹭沛、min_samples_split辽剧、max_features和criterion參數(shù)送淆。
運(yùn)用GridSearchCV,尋找出最優(yōu)參數(shù)怕轿。
繪制出在不同的max_depth下的學(xué)習(xí)曲線偷崩。
步驟:
-
一、導(dǎo)入各種我們需要的模塊或者數(shù)據(jù)集等
graphviz安裝(安裝完配置好路徑還是不行的話重啟一下電腦)
from sklearn import tree #導(dǎo)入樹
from sklearn.tree import DecisionTreeClassifier #導(dǎo)入決策樹分類器
from sklearn.datasets import load_iris #導(dǎo)入鳶尾花數(shù)據(jù)集
from sklearn.model_selection import train_test_split #分訓(xùn)練集測試集的類
from matplotlib import pyplot as plt #畫圖用的
from sklearn.model_selection import GridSearchCV #網(wǎng)格搜索
import pandas as pd
import graphviz #畫決策樹的撞羽,需要事先安裝
- 二阐斜、將數(shù)據(jù)實(shí)例化,劃分?jǐn)?shù)據(jù)集和測試集
iris = load_iris() #將數(shù)據(jù)集實(shí)例化诀紊,別忘了括號
Xtrain,Xtest,Ytrain,Ytest = train_test_split(iris.data,iris.target,test_size=0.3) #將鳶尾花數(shù)據(jù)的特征矩陣和標(biāo)簽矩陣谒出,按7:3的比例劃分訓(xùn)練集和測試集,0.3是可以變的,也可以填0.4笤喳,注意X为居,Y的順序
- 三、建立模型(三部曲:實(shí)例化莉测、訓(xùn)練颜骤、評估)
clf = DecisionTreeClassifier() #實(shí)例化模型,括號不填criterion默認(rèn)是‘gini’,也可以填criterion = 'entropy'
clf = clf.fit(Xtrain, Ytrain) #訓(xùn)練數(shù)據(jù)集
score = clf.score(Xtest, Ytest) #評估數(shù)據(jù)集
score #將評估結(jié)果打印出來捣卤,因?yàn)闇y試集和訓(xùn)練集劃分的不同忍抽,可能每個(gè)人的結(jié)果也不同
1.PNG
- 四、畫出決策樹
feature_name = ['花萼長度','花萼寬度','花瓣長度','花瓣寬度'] #定義特征的名字董朝,方便后面的閱讀
dot_data = tree.export_graphviz(clf
,feature_names = feature_name
,class_names=["清風(fēng)藤","云芝","錦葵"] #標(biāo)簽名字
,filled=True #框框填充顏色(可以不寫)
,rounded=True #框框角是圓圓的(可以不寫)
)
graph = graphviz.Source(dot_data) #導(dǎo)出樹
graph
這就得到一棵原始的樹
- 五鸠项、使用四個(gè)剪枝參數(shù)
clf = tree.DecisionTreeClassifier(max_depth=2 #最大深度是2,這個(gè)也可以填3或4試試看
,min_samples_leaf=5 #下一個(gè)葉子節(jié)點(diǎn)大于5會進(jìn)行子姜,小于5就不會再分
,min_samples_split=10 #最小分支節(jié)點(diǎn)祟绊,當(dāng)前樣本大于10才會分
,max_features=3 #最大特征數(shù),有一個(gè)重要程度為0
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score
可以把剪枝后的樹畫出來看看(代碼和上面畫樹的一樣)
2.png
dot_data = tree.export_graphviz(clf
,feature_names = feature_name
,class_names=["清風(fēng)藤","云芝","錦葵"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
- 六哥捕、繪制出在不同的max_depth下的學(xué)習(xí)曲線
test=[] #定義一個(gè)列表放分?jǐn)?shù)
for i in range(10): #10次循環(huán)map_depth
clf = tree.DecisionTreeClassifier(max_depth=i+1)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest,Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red") #橫坐標(biāo)是1-10牧抽,縱坐標(biāo)是分?jǐn)?shù),顏色是紅色
plt.xticks(range(1,11))#橫坐標(biāo)是1-10
plt.xlabel("max_depth") #橫坐標(biāo)標(biāo)簽
plt.ylabel("score") #縱坐標(biāo)標(biāo)簽
plt.show() #展示畫好的圖(由圖可知當(dāng)map_depth為2時(shí)分?jǐn)?shù)最高)
3.PNG
- 七遥赚、運(yùn)用GridSearchCV扬舒,尋找出最優(yōu)參數(shù)
parameters = {'criterion':("gini","entropy")
,"max_depth":[*range(1,5)] #前面我們知道這個(gè)應(yīng)該是2,所以我們給定范圍1-5
,'min_samples_split':[*range(5,40,5)]#最小分支節(jié)點(diǎn)以步長為5凫佛,在5-39循環(huán)
} #定義我們要找的參數(shù)
clf = tree.DecisionTreeClassifier()
GS = GridSearchCV(clf, parameters, cv=10) #cv=10代表交叉驗(yàn)證10次
GS.fit(Xtrain,Ytrain)
GS.best_params_ #打印最好的參數(shù)
GS.best_score_ #打印最好的分?jǐn)?shù)
-
八讲坎、特朗普和他老婆新冠檢測呈陽性
sklearn機(jī)器學(xué)習(xí)推薦菜菜的sklearn課堂