机器学习与数据挖掘大数据大数据 爬虫Python AI Sql

数据分析实战--决策树与随机森林鸢尾花分类

2019-04-27  本文已影响1人  勤奋的土豆鹿鹿

本文考虑从鸢尾花数据集四个特征中取出两个特征,用决策树和随机森林分别进行预测。数据集可关注文末公众号回复:“鸢尾花”

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
上一篇 下一篇

猜你喜欢

热点阅读