本文考虑从鸢尾花数据集四个特征中取出两个特征,用决策树和随机森林分别进行预测。数据集可关注文末公众号回复:“鸢尾花”
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))
image
输出结果
特征组合: 花萼长度 花萼宽度
准确率: 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%
随机森林预测的准确度略微高点,两者的最佳组合预测结果一致,均为花瓣长度+花瓣宽度组合
欢迎关注[小鹿数据分析]
二维码.jpg
网友评论