python+sklearn實現決策樹(分類樹)


整理今天的代碼……
采用的是150條鳶尾花的數據集fishiris.csv

# 讀入數據,把Name列取出來作為標簽(groundtruth)
import pandas as pd
data = pd.read_csv('fishiris.csv')
print(data.head(5))
X = data.iloc[:, data.columns != 'Name']
Y = data['Name'] 

df.iloc[rows, columns]取出符合條件的列。查看數據讀取是否正確(關於pandas使用最熟練的一條……orz),如果csv文件或者其他數據沒有列名需要加上names=[]?

   SepalLength  SepalWidth  PetalLength  PetalWidth    Name
0          5.1         3.5          1.4         0.2  setosa
1          4.9         3.0          1.4         0.2  setosa
2          4.7         3.2          1.3         0.2  setosa
3          4.6         3.1          1.5         0.2  setosa
4          5.0         3.6          1.4         0.2  setosa

確認數據無誤后就可以分出驗證集和測試集,挺方便的!查看一下返回數據的格式和數據集好像是相同的:type(Xtrain):<class .pandas.core.frame.DataFrame'>

# 分割驗證集和訓練集
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,Y,test_size=0.2)

數據准備好就可以建模了。注意,因為這個數據集里沒有空缺值所以沒管,但是sklearn里這個模塊好像是不能處理空缺的?要手動寫個函數填進去。

# 導入分類樹的模塊
from sklearn.tree import DecisionTreeClassifier

# 需要整理一下序號,也就是更新df.index,前面的可以看到挺亂的,因為是隨機取的
for i in [Xtrain,Xtest,Ytrain,Ytest]: # 這里的意思是i依次為Xtrain,Xtest……並修改它們的index值
    print(i,'before')
    i.index = range(i.shape[0])
    print(i,'after changed')

clf = DecisionTreeClassifier(random_state=3) # 初始化
clf = clf.fit(Xtrain,Ytrain) # 擬合
score_ = clf.score(Xtest, Ytest) # 驗證集查看得分,這個得分好像就是分類的准確率

# 可以輸入數據送到訓練好的模型里,輸出預測的類
y_pred = clf.predict(Xtest)

看看:

# 之前的index
     SepalLength  SepalWidth  PetalLength  PetalWidth
19           5.1         3.8          1.5         0.3
67           5.8         2.7          4.1         1.0
6            4.6         3.4          1.4         0.3
100          6.3         3.3          6.0         2.5
39           5.1         3.4          1.5         0.2
..           ...         ...          ...         ...
106          4.9         2.5          4.5         1.7
25           5.0         3.0          1.6         0.2
138          6.0         3.0          4.8         1.8
84           5.4         3.0          4.5         1.5
94           5.6         2.7          4.2         1.3

[120 rows x 4 columns] before

# 之后的index
SepalLength  SepalWidth  PetalLength  PetalWidth
0            5.1         3.8          1.5         0.3
1            5.8         2.7          4.1         1.0
2            4.6         3.4          1.4         0.3
3            6.3         3.3          6.0         2.5
4            5.1         3.4          1.5         0.2
..           ...         ...          ...         ...
115          4.9         2.5          4.5         1.7
116          5.0         3.0          1.6         0.2
117          6.0         3.0          4.8         1.8
118          5.4         3.0          4.5         1.5
119          5.6         2.7          4.2         1.3

[120 rows x 4 columns] after changed
輸出驗證集的預測結果以及和真值的對比:
['virginica' 'setosa' 'versicolor' 'setosa' 'setosa' 'versicolor' 'setosa'
 'setosa' 'setosa' 'versicolor' 'virginica' 'versicolor' 'setosa'
 'virginica' 'setosa' 'virginica' 'versicolor' 'versicolor' 'virginica'
 'virginica' 'versicolor' 'versicolor' 'versicolor' 'virginica'
 'virginica' 'versicolor' 'setosa' 'setosa' 'setosa' 'virginica']
0     True
1     True
2     True
3     True
4     True
5     True
6     True
7     True
8     True
9     True
10    True
11    True
12    True
13    True
14    True
15    True
16    True
17    True
18    True
19    True
20    True
21    True
22    True
23    True
24    True
25    True
26    True
27    True
28    True
29    True
Name: Name, dtype: bool

更高級的建模方法:利用GridSearchCV這個模塊!

# 預測結果不准確,可以使用網格法優化,這里設定了模型訓練的多個參數,利用sklearn里的模塊可以自己測試並選擇結果最好的一個模型?我還不是很懂
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)]
}
from sklearn.model_selection import GridSearchCV
GS = GridSearchCV(clf, parameters, cv=10)
GS.fit(Xtrain,Ytrain)
print(GS.best_params_)
print(GS.best_score_)
{'criterion': 'gini', 'max_depth': 5, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 1, 'splitter': 'random'}
0.9703296703296704

score_ = clf.score(Xtest, Ytest)
print(score_,'score') # 1.0 score

明天想把圖畫出來嗷嗷,然后再試試回歸樹!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM