實驗一 使用sklearn的決策樹實現(xiàn)iris鳶尾花數(shù)據(jù)集的分類

使用sklearn的決策樹實現(xiàn)iris鳶尾花數(shù)據(jù)集的分類



要求:

  1. 建立分類模型,至少包含4個剪枝參數(shù):max_depth、min_samples_leaf 、min_samples_split、max_featurescriterion參數(shù)。

  2. 運用GridSearchCV,尋找出最優(yōu)參數(shù)。

  3. 繪制出在不同的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ù)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容