赞
踩
本实验提供了一份汽车评测的数据,通过python编程,利用此数据,构造决策树模型、训练、预测及评估模型,然后绘制一下ROC曲线图;再使用随机森林建模、训练、预测及绘制ROC曲线。
实验时长:45分钟
主要步骤:
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)
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中类别信息转化成了数值信息,各列的类别值已经替换成了类别相应的编码值
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)
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)) # 评估
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.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()
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)
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)
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
本次实验,涉及了决策树、随机森林相关的算法模型创建、训练、预测、评估、绘制ROC曲线等操作。同时,作为编程类的实验,需要大家多做编程练习,并且在编程过程中遇到语法或方法、函数的使用方面的疑问,需要我们养成查看相关文档解决问题的习惯及能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。