本文考慮從鸢尾花資料集四個特征中取出兩個特征,用決策樹和随機森林分别進行預測。
0 子產品導入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
1 資料處理
data = pd.read_csv('8.iris.data',header=None)
data.rename(columns={0:'花萼長度',1: '花萼寬度', 2:'花瓣長度', 3:'花瓣寬度',4:'類型'},inplace=True)
map = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
data['類型'] = data['類型'].map(map)
feature = ['花萼長度','花萼寬度', '花瓣長度', '花瓣寬度']
2 兩個特征進行組合
本文考慮從四個特征中取出兩個特征,用決策樹和随機森林分别進行預測
(1)用決策樹做
for i in range(len(feature)):
for j in range(i+1,len(feature)):
best = 0
x = data[[feature[i],feature[j]]]
y = data['類型']
# 決策樹&交叉驗證
print('特征組合:',feature[i],feature[j])
# 決策樹最佳深度查找
scores_plt=[]
depth = [2,4,6,8]
for d in depth:
dtc = DecisionTreeClassifier(criterion='entropy',max_depth = d)
scores = cross_val_score(dtc,x,y,scoring='accuracy',cv=5)
scores_plt.append(scores.mean())
print('準确率:',scores.mean())
if best < np.max(scores_plt):
best = np.max(scores_plt)
types = '%s和%s組合'%(feature[i],feature[j])
plt.plot(depth,scores_plt,'--o',label='%s和%s組合'%(feature[i],feature[j]))
plt.legend()
print('n最佳組合為:%s,n準确率為:%.2f%%'%(types,best*100))
輸出結果
特征組合: 花萼長度 花萼寬度
準确率: 0.6666666666666667
準确率: 0.7666666666666667
準确率: 0.7133333333333333
準确率: 0.7
特征組合: 花萼長度 花瓣長度
準确率: 0.9466666666666667
準确率: 0.9333333333333333
準确率: 0.9333333333333333
準确率: 0.9266666666666667
特征組合: 花萼長度 花瓣寬度
準确率: 0.9400000000000001
準确率: 0.9466666666666667
準确率: 0.9400000000000001
準确率: 0.9266666666666665
特征組合: 花萼寬度 花瓣長度
準确率: 0.9466666666666667
準确率: 0.9200000000000002
準确率: 0.9133333333333334
準确率: 0.9200000000000002
特征組合: 花萼寬度 花瓣寬度
準确率: 0.9400000000000001
準确率: 0.9466666666666667
準确率: 0.9266666666666665
準确率: 0.9399999999999998
特征組合: 花瓣長度 花瓣寬度
準确率: 0.9333333333333332
準确率: 0.9600000000000002
準确率: 0.9600000000000002
準确率: 0.9533333333333334
由圖和輸出可知:最佳組合為:花瓣長度和花瓣寬度組合,
準确率為:96.00%
(2) 使用随機森林
這邊使用了網格搜尋進行參數的調整
for i in range(len(feature)):
for j in range(i+1,len(feature)):
x = data[[feature[i],feature[j]]]
y = data['類型']
rfc = RandomForestClassifier(criterion='entropy')
depth = [2,4,6,8]
model = GridSearchCV(rfc, param_grid={'max_depth':depth},cv=5)
model.fit(x,y)
print('特征組合:',feature[i],feature[j])
print('最佳參數:',model.best_params_)
scores_rfc = cross_val_score(model,x,y,cv=3,scoring='accuracy')
print('準确率為:%.2f%%'%(scores_rfc.mean()*100))
結果:
特征組合: 花萼長度 花萼寬度
最佳參數: {'max_depth': 4}
準确率為:73.33%
特征組合: 花萼長度 花瓣長度
最佳參數: {'max_depth': 4}
準确率為:92.03%
特征組合: 花萼長度 花瓣寬度
最佳參數: {'max_depth': 4}
準确率為:94.73%
特征組合: 花萼寬度 花瓣長度
最佳參數: {'max_depth': 4}
準确率為:93.42%
特征組合: 花萼寬度 花瓣寬度
最佳參數: {'max_depth': 4}
準确率為:94.69%
特征組合: 花瓣長度 花瓣寬度
最佳參數: {'max_depth': 6}
準确率為:96.04%