机器学习入门:决策树与随机森林-7

机器学习入门:决策树与随机森林

1、实验描述

  • 本实验提供了一份汽车评测的数据,通过python编程,利用此数据,构造决策树模型、训练、预测及评估模型,然后绘制一下ROC曲线图;再使用随机森林建模、训练、预测及绘制ROC曲线。

  • 实验时长:45分钟

  • 主要步骤:

    • 加载训练数据
    • 数据预处理:将car.data数据数值化
    • 数据集的划分
    • 决策树模型、随机森林模型创建
    • 模型训练
    • 模型的预测
    • 模型评估
    • 绘制ROC曲线

2、实验环境

  • 虚拟机数量:1
  • 系统版本:CentOS 7.5
  • scikit-learn版本: 0.19.2
  • pandas版本:0.22.4
  • numpy版本:1.15.1
  • matplotlib版本:2.2.3
  • python版本:3.5
  • IPython版本:6.5.0

3、相关技能

  • Python编程
  • Pandas编程
  • 数据预处理
  • SklearnAPI的使用
  • 决策树建模
  • 随机森林建模
  • 模型训练
  • 模型评估
  • 绘制ROC曲线
  • 计算AUC

4、相关知识点

  • 训练数据集
  • 测试数据集
  • 决策树
  • 随机森林
  • ROC
  • AUC

5、实现效果

  • 决策树在汽车数据集上的ROC效果如下图所示:

在这里插入图片描述

图 1

6、实验步骤

6.1进入Anaconda创建的虚拟环境“ML”

6.1.1从zkpk的公共目录下拷贝实验所需的数据文件到zkpk的家目录下

[zkpk@master ~]$ cd
[zkpk@master ~]$ cp /home/zkpk/experiment/car.data /home/zkpk

6.1.2数据集car.data介绍:

6.1.2.1共有1728行关于汽车评测的数据,每行记录着汽车的6个属性,详情见下表:

属性名意义取值范围
buying买入价vhigh, high, med, low
maint保养费用vhigh, high, med, low
doors车门数2, 3, 4, 5more
persons可容纳人数2, 4, more
lug_boot后备箱大小small, med, big
safety安全性low, med, high

6.1.2.2根据车辆的6个不同指标信息的权重不同,对汽车做评测,用户最终决定是否购买车辆。评测结果class values有四种,见下表

取值意义
unacc不可接受
acc可接受
good
vgood非常好

6.1.3在zkpk的家目录下执行如下命令

[zkpk@master ~]$ cd
[zkpk@master ~]$ source activate ML
(ML) [zkpk@ master ML]$ 

6.1.4此时已经进入虚拟环境。键入如下命令,进入ipython交互是编程环境

(ML) [zkpk@ master ML]$ ipython
Python 3.5.4 |Anaconda, Inc.| (default, Nov  3 2017, 20:01:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]:

6.2在Ipython交互式编程环境中开始进行实验

6.2.1导入实验所需的包

In [1]: import pandas as pd
   ...: import numpy as np
   ...: from sklearn.tree import DecisionTreeClassifier
   ...: from sklearn.ensemble import RandomForestClassifier
   ...: from sklearn import metrics
   ...: from sklearn.model_selection import train_test_split
   ...: from sklearn.model_selection import GridSearchCV
   ...: from sklearn.preprocessing import label_binarize	# 将label二值化
   ...: import matplotlib as mpl
   ...: import matplotlib.pyplot as plt

6.2.2读取数据文件

In [3]: data = pd.read_csv('car.data', header=None)	# header=None没有标题

6.2.2.1打印文件的前几行

In [4]: data.head(2)

在这里插入图片描述

图 2

6.2.2.2显示文件数据data的shape

In [5]: data.shape
Out[5]: (1728, 7)

6.2.3数据预处理

    In [6]: n_columns = len(data.columns)	# 获得数据集的列的个数
   ...: columns = ['buy', 'maintain', 'doors', 'persons', 'boot', 'safety', 'accept']	# 自定义列名
   ...: new_columns = dict(zip(np.arange(n_columns), columns)) # 将列名与整数映射
   ...:	data.rename(columns=new_columns, inplace=True)  # 替换数据集中的列名为columns中的值
   ...: for col in columns:
   ...: 	data[col] = pd.Categorical(data[col]).codes   # Categorical方法,获取list的类别;codes方法赋给每个类别对应的类别编码值

6.2.3.1查看处理后的数据;发现data中类别信息转化成了数值信息,各列的类别值已经替换成了类别相应的编码值

在这里插入图片描述

图 3

6.2.4读取对应的x,y标签

In [8]: x = data.loc[:, columns[:-1]] # 得到样本特征
   ...: y = data['accept']		# 取到标签值
   ...: x.shape	# 结果是(1728, 6)
   ...: y.shape	# 结果是(1728,)

6.2.5数据计划分

In [9]: x, x_test, y, y_test = train_test_split(x, y, test_size=0.3) # 将x,y都切分成训练集数据、测试集数据,其中训练集占%30

6.3决策树建模训练

6.3.1决策树建模,DecisionTreeClassifier主要参数如下:

6.3.1.1criterion计算属性的gini

6.3.1.2max_depth设置树的最大深度,默认为None,

6.3.1.3min_samples_split根据属性划分节点时,每个划分的节点样本数的阈值。

6.3.1.4max_features选择最适属性时划分的特征不能超过此值。

In [10]: clf = DecisionTreeClassifier(criterion='gini', max_depth=12, min_samples_split=5, max_features=5)

6.3.2在训练集训练模型

In [11]: clf.fit(x, y)

在这里插入图片描述

图 4

6.3.3模型评估

In [12]: y_hat = clf.predict(x)  #在训练集上进行预测
    ...: print ('训练集精确度:', metrics.accuracy_score(y, y_hat)) # 评估成绩
    ...: y_test_hat = clf.predict(x_test) # 测试集预测
    ...: print ('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat)) # 评估

在这里插入图片描述

图 5

6.3.4绘制ROC曲线

6.3.4.1ROC曲线指受试者工作特征曲线(receiver operating characteristic curve,简称ROC曲线)/接收器操作特性曲线,是反映灵敏性和特效性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正例率(True Positive Rate,TPR 也就是灵敏度)为纵坐标,假正例率(False Positive Rate,FPR,1-特效性)为横坐标绘制的曲线。

6.3.4.2roc_auc_score是根据真实值(必须是二值的)。所以需要对标签值作如下二值化处理

In [13]: n_class = len(data['accept'].unique())
    ...: y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))	# 将标签值映射成one-hot编码
    ...: y_test_one_hot.shape	# 结果是(519, 4)

6.3.4.3计算测试集的预测结果(预测值(可以是0/1,也可以是proba值)计算出auc值)

In [14]: y_test_one_hot_hat = clf.predict_proba(x_test)  #测试集预测分类的概率 
    ...: y_test_one_hot_hat

在这里插入图片描述

图 6

6.3.4.4计算fpr,tpr 以及面积

In [17]: fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())

6.3.4.5计算不同average下的AUC值

In [19]: print ('Micro AUC:\t', metrics.auc(fpr, tpr))	# AUC ROC意思是ROC曲线下方的面积(Area under the Curve of ROC)
    ...: print( 'Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))
    ...: auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
    ...: print ('Macro AUC:\t', auc)

6.3.4.6绘制曲线图

plt.figure(figsize=(8, 7), dpi=80, facecolor='w')	# dpi:每英寸长度的像素点数;facecolor 背景颜色
plt.xlim((-0.01, 1.02))  # x,y 轴刻度的范围
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))  #绘制刻度
plt.yticks(np.arange(0, 1.1, 0.1))

plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)  # 绘制AUC 曲线
plt.legend(loc='lower right')    # 设置显示标签的位置

plt.xlabel('False Positive Rate', fontsize=14)   #绘制x,y 坐标轴对应的标签
plt.ylabel('True Positive Rate', fontsize=14)

plt.grid(b=True, ls=':')  # 绘制网格作为底板;b是否显示网格线;ls表示line style

plt.title(u'DecisionTree ROC curve And  AUC', fontsize=18)  # 打印标题
plt.show()  

在这里插入图片描述

图 7

6.4使用随机森林建模训练与上面保持一致,

6.4.1使用随机森林建模

In [21]: clf = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=12, min_samples_split=5, max_features=5)	# n_estimators:设置树的个数为100, criterion:使用gini系数作为信息熵,max_depth:树的最大深度为12,min_samples_split:少于5个样本不分裂,max_features:最多使用5个特征

6.4.1.1n_estimators:决策树个数

6.4.1.2使用‘gini’系数作为衡量属性划分的依据

6.4.1.3max_depth:树的最大深度

6.4.1.4min_samples_split:根据属性划分节点时,节点应持有的最少样本数。

6.4.1.5max_features:选择最合适属性划分时,使用的特征不能超过该值

6.4.2在训练数据上学习

In [23]: clf.fit(x,y) 

在这里插入图片描述

图 8

6.4.3模型预测

y_hat = clf.predict(x)  #在训练集上进行预测
print ('训练集精确度:', metrics.accuracy_score(y, y_hat)) # 评估成绩
y_test_hat = clf.predict(x_test) # 测试集预测
print ('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat)) # 评估
n_class = len(data['accept'].unique())     # 将标签值映射成one-hot编码
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))

y_test_one_hot_hat = clf.predict_proba(x_test)  #测试集预测分类的概率

fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel()) # 获取auc, roc 曲线需要的值

print ('Micro AUC:\t', metrics.auc(fpr, tpr))
print( 'Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot,                                                   y_test_one_hot_hat, average='micro'))	# 计算roc曲线下的面积
auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print ('Macro AUC:\t', auc) 

在这里插入图片描述

图 9

6.4.4绘图步骤和上面保持一致,

plt.figure(figsize=(8, 7), dpi=80, facecolor='w')	# dpi:每英寸长度的像素点数;facecolor 背景颜色
plt.xlim((-0.01, 1.02))  # x,y 轴刻度的范围
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))  #绘制刻度
plt.yticks(np.arange(0, 1.1, 0.1))

plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)  # 绘制AUC 曲线
plt.legend(loc='lower right')    # 设置显示标签的位置

plt.xlabel('False Positive Rate', fontsize=14)   #绘制x,y 坐标轴对应的标签
plt.ylabel('True Positive Rate', fontsize=14)

plt.grid(b=True, ls=':')  # 绘制网格作为底板;b是否显示网格线;ls表示line style

plt.title(u'RandomForest ROC curve And  AUC', fontsize=18)  # 打印标题
plt.show()  

6.4.5最终绘制的ROC曲线如下所示:

在这里插入图片描述

图 10

7、参考答案

  • 代码清单rf_dt.py

在这里插入图片描述

图 11

8、总结

本次实验,涉及了决策树、随机森林相关的算法模型创建、训练、预测、评估、绘制ROC曲线等操作。同时,作为编程类的实验,需要大家多做编程练习,并且在编程过程中遇到语法或方法、函数的使用方面的疑问,需要我们养成查看相关文档解决问题的习惯及能力。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JTZ001

你的鼓励是我创作的最大动力?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值