其他分享
首页 > 其他分享> > 基于PlayTennis数据集的决策树决策分析

基于PlayTennis数据集的决策树决策分析

作者:互联网

基于PlayTennis数据集的决策树决策分析

前导知识:【决策树原理与代码】

本文事先把PlayTennis数据集导入到了MySQL中

决策分析要求:利用不同评价指数对是否PlayTennis构建决策树并合理剪枝,并作出决策评价(如10个做训练,4个做测试)
在这里插入图片描述

1. 利用数据库驱动导入数据表

# 导包
import pandas as pd
import pymysql
from sqlalchemy import create_engine

# 数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
engine = create_engine('mysql+pymysql://root:**********@127.0.0.1:3306/mydatabase?charset=utf8')

# 读取数据
df = pd.read_sql('select * from play_tennis',engine,index_col='Day')

结果:

**********为自己设定的密码

2. 将字符串数据替换为数值型数据

# 预处理:Outlook
outlook_c = list(df['Outlook'].unique())
for i in range(len(outlook_c)):
    df.Outlook[df['Outlook']==outlook_c[i]]=i+1
    print(outlook_c[i],':',i+1)

# 预处理:Temperature
temperature_c = list(df['Temperature'].unique())
for i in range(len(temperature_c)):
    df.Temperature[df['Temperature']==temperature_c[i]]=i+1
    print(temperature_c[i],':',i+1)

# 预处理:Humidity
humidity_c = list(df['Humidity'].unique())
for i in range(len(humidity_c)):
    df.Humidity[df['Humidity']==humidity_c[i]]=i
    print(humidity_c[i],':',i)

# 预处理:Wind
wind_c = list(df['Wind'].unique())
for i in range(len(wind_c)):
    df.Wind[df['Wind']==wind_c[i]]=i
    print(wind_c[i],':',i)

# 预处理:PlayTennis
playtennis_c = list(df['PlayTennis'].unique())
for i in range(len(playtennis_c)):
    df.PlayTennis[df['PlayTennis']==playtennis_c[i]]=i
    print(playtennis_c[i],':',i)

结果:

Sunny : 1
Overcast : 2
Rain : 3
Hot : 1
Mild : 2
Cool : 3
High : 0
Normal : 1
Weak : 0
Strong : 1
No : 0
Yes : 1

3. 数据分割

# 导包
import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split
import pydotplus

X = np.array(df.iloc[:,0:4].astype(int))
y = np.array(df['PlayTennis'].astype(int))
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=2/7,random_state=5)

按照10:4的比例分割样本

4. 决策树预测(选择不同评价标准)

# 决策树预测(选择不同评价标准)
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(X_train,y_train)

# 准确率
clfScore = clf.score(X_test,y_test)
print('准确率:',clfScore)

# 精确率(被正确分类的正例样本数/总的正例样本数)
y_pred = clf.predict(X_test)
positiveNo = sum(y_test==1)
scores = 0
for i in range(len(y_test)):
    if y_pred[i] == 1 & y_test[i] == 1:
        scores += 1
print('精确率:',scores/positiveNo)

# 召回率(被正确分类的正例样本数/所有被正确分类的样本数)
print('召回率:',(scores/len(y_test))/clfScore)

结果:

准确率: 0.75
精确率: 1.0
召回率: 0.3333333333333333

结论:
在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。正类样本全部预测正确,但是召回率不是很高。一般情况下,精确率与召回率此消彼长

5. 把决策树结构写入文件

play_feature_E = 'Outlook', 'Temperature', 'Humidity', 'Wind'
play_class = 'Yes', 'No'

# 把决策树结构写入文件
dot_data = tree.export_graphviz(clf, out_file=None, feature_names=play_feature_E, class_names=play_class,
                                filled=True, rounded=True, special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf('play1.pdf')

结果:

6. 剪枝

参数调整:

clf = tree.DecisionTreeClassifier(criterion='entropy', splitter='best', max_depth=2,min_samples_split=2, min_samples_leaf=1,max_features=3,min_impurity_split=None)

结果:

准确率: 0.75
精确率: 1.0
召回率: 0.3333333333333333

决策树:

标签:df,print,决策分析,test,import,决策树,PlayTennis
来源: https://blog.csdn.net/linjing_zyq/article/details/120798555