整理今天的代碼……
采用的是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
明天想把圖畫出來嗷嗷,然后再試試回歸樹!