使用sklearn的決策樹實現(xiàn)iris鳶尾花數(shù)據(jù)集的分類
要求:
建立分類模型,至少包含4個剪枝參數(shù):max_depth、min_samples_leaf 、min_samples_split、max_features和criterion參數(shù)。
運用GridSearchCV,尋找出最優(yōu)參數(shù)。
繪制出在不同的max_depth下的學習曲線。
步驟:
-
一、導入各種我們需要的模塊或者數(shù)據(jù)集等
graphviz安裝(安裝完配置好路徑還是不行的話重啟一下電腦)
from sklearn import tree #導入樹
from sklearn.tree import DecisionTreeClassifier #導入決策樹分類器
from sklearn.datasets import load_iris #導入鳶尾花數(shù)據(jù)集
from sklearn.model_selection import train_test_split #分訓練集測試集的類
from matplotlib import pyplot as plt #畫圖用的
from sklearn.model_selection import GridSearchCV #網(wǎng)格搜索
import pandas as pd
import graphviz #畫決策樹的,需要事先安裝
- 二、將數(shù)據(jù)實例化,劃分數(shù)據(jù)集和測試集
iris = load_iris() #將數(shù)據(jù)集實例化,別忘了括號
Xtrain,Xtest,Ytrain,Ytest = train_test_split(iris.data,iris.target,test_size=0.3) #將鳶尾花數(shù)據(jù)的特征矩陣和標簽矩陣,按7:3的比例劃分訓練集和測試集,0.3是可以變的,也可以填0.4,注意X,Y的順序
- 三、建立模型(三部曲:實例化、訓練、評估)
clf = DecisionTreeClassifier() #實例化模型,括號不填criterion默認是‘gini’,也可以填criterion = 'entropy'
clf = clf.fit(Xtrain, Ytrain) #訓練數(shù)據(jù)集
score = clf.score(Xtest, Ytest) #評估數(shù)據(jù)集
score #將評估結果打印出來,因為測試集和訓練集劃分的不同,可能每個人的結果也不同
1.PNG
- 四、畫出決策樹
feature_name = ['花萼長度','花萼寬度','花瓣長度','花瓣寬度'] #定義特征的名字,方便后面的閱讀
dot_data = tree.export_graphviz(clf
,feature_names = feature_name
,class_names=["清風藤","云芝","錦葵"] #標簽名字
,filled=True #框框填充顏色(可以不寫)
,rounded=True #框框角是圓圓的(可以不寫)
)
graph = graphviz.Source(dot_data) #導出樹
graph
這就得到一棵原始的樹
- 五、使用四個剪枝參數(shù)
clf = tree.DecisionTreeClassifier(max_depth=2 #最大深度是2,這個也可以填3或4試試看
,min_samples_leaf=5 #下一個葉子節(jié)點大于5會進行,小于5就不會再分
,min_samples_split=10 #最小分支節(jié)點,當前樣本大于10才會分
,max_features=3 #最大特征數(shù),有一個重要程度為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=["清風藤","云芝","錦葵"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
- 六、繪制出在不同的max_depth下的學習曲線
test=[] #定義一個列表放分數(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") #橫坐標是1-10,縱坐標是分數(shù),顏色是紅色
plt.xticks(range(1,11))#橫坐標是1-10
plt.xlabel("max_depth") #橫坐標標簽
plt.ylabel("score") #縱坐標標簽
plt.show() #展示畫好的圖(由圖可知當map_depth為2時分數(shù)最高)
3.PNG
- 七、運用GridSearchCV,尋找出最優(yōu)參數(shù)
parameters = {'criterion':("gini","entropy")
,"max_depth":[*range(1,5)] #前面我們知道這個應該是2,所以我們給定范圍1-5
,'min_samples_split':[*range(5,40,5)]#最小分支節(jié)點以步長為5,在5-39循環(huán)
} #定義我們要找的參數(shù)
clf = tree.DecisionTreeClassifier()
GS = GridSearchCV(clf, parameters, cv=10) #cv=10代表交叉驗證10次
GS.fit(Xtrain,Ytrain)
GS.best_params_ #打印最好的參數(shù)
GS.best_score_ #打印最好的分數(shù)
-
八、特朗普和他老婆新冠檢測呈陽性
sklearn機器學習推薦菜菜的sklearn課堂