使用Sklearn和Pandas的数据处理初探

这学期学习了一门专业课叫人工智能,前期主要在学习数据处理和搜索算法,挺艰难的,不过这次的作业还是很有意思的,使用sklearn和pandas对数据进行分类处理,并用numpy和matplotlib对实验结果进行画图处理。Python不自带这几个库,需要自己去下载。编程工具是Jupyter notebook。个人感觉很有趣味性。正好也记录一下,加深一下印象。我将从以下几个方面做这次的实验:

  • 获取数据
  • 分离数据为测试集和训练集并训练模型
  • 计算模型中的重要参数
  • 画图及对模型的验证

开始之前先感谢助教的视频,帮助我们这些迷茫的学生走出困境!先上本次试验import的所有库函数:

from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import plot_confusion_matrix
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os

1. 获取数据

path = os.path.abspath('.') + '/' + "dataset-compliance.csv"   #获取相对路径
print(path)
data = pd.read_csv(path,header = 0)  #读入数据
print(data)

os.path.abspath()是用来获取相对路径的,这里先要把自己的数据通过excel导出为.csv文件,不然没办法读取,且最好全部都是数字。读入数据使用的是pandas里面的函数:read_csv(),里面的header变量有必要说一下,header=0意味着将该行号用作数据的开头且用作列名。这样,第一行关于数据的名称就不会被读取。详细使用方法可以参考pandas中文文档:pandas中文网

2. 分离数据为测试集和训练集

x = data.iloc[:, :6] #取GAP_between_Create_Last到CITY的列数据作为x
y = data.iloc[:,6:7] #获得Label列的数据作为y
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.8,random_state = 0)       #分离测试数据和训练数据
clf = tree.DecisionTreeClassifier(criterion = "entropy",max_depth = 5,min_samples_leaf = 5)  #用信息熵划分决策树
clf.fit(x_train,y_train) #训练
y_test_hat = clf.predict(x_test)  #测试
y_test_pb = clf.predict_proba(x_test)  #算取得测试值的概率

这里我将train_size设置为了0.8,也就是10000行数据8000行会用作训练集。sklearn.tree.DecisionTreeClassifier()创建了决策树函数中的几个重要参数:

  • criterion:特征选择标准,这里设置成了“entropy”(熵)。变量的初始值为“gini”也就是通过基尼不纯度划分决策树,是将来自集合的某种结果随机应用于某一数据项的预期误差率,是一种基于统计的思想。我们这里改为“entropy”也就是信息熵来划分决策树,是一种基于信息论的思想;
  • splitter:特征划分标准。best在特征的所有划分点中找出最优的划分点,random随机的在 部分划分点中找局部最优的划分点。 默认的‘best’适合样本量不大的时候,而如果样本数据量 非常大,此时决策树构建推荐‘random’。
  • max_depth:决策树最大深度。
  • min_samples_split:内部节点再划分所需最小样本数。
  • min_samples_leaf:叶子节点最少样本数。分割点的叶子在每个左,右分支至少达到min_samples_leaf训练样本时分割点才会被考虑。

具体可以参考:sklearn决策树说明文档决策树5:剪枝与sklearn中的决策树。其他的函数都可以在sklearn官方文档中找到。可以打印相关参数观察一下是否都操作成功。

3. 计算模型中的重要参数

np.set_printoptions(precision = 2)   #设置精度为保留两位小数
importances = clf.feature_importances_  #返回每个特征的重要性
print(classification_report(y_test, y_test_hat)) #生成混淆矩阵的相关指标

这里主要是计算了每个特征的重要性和混淆矩阵。classification_report()可以参考:sklearn.metrics.classification_report模块使用与指标分析(生成混淆矩阵评价分类指标);计算重要性可以参考:sklearn中文文档

4. 画图及对模型的验证

这一部分主要用到了matplotlib和numpy的画图工具,可以查看matplotlib的官方网站numpy官网

先是画了一个ROC曲线来验证拟合程度:

#画ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_test_pb[:, 1])  #计算fpr,tpr
print(fpr,tpr)
roc_auc = auc(fpr,tpr)  #计算auc面积
plt.plot(fpr,tpr,lw = 1,label = 'ROC')
plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')  #画对角线
plt.xlim([-0.05, 1.05])     # 设置x、y轴的上下限,设置宽一点,以免和边缘重合,可以更好的观察图像的整体
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

效果如图:

计算并绘制混淆矩阵了解一下数据分布和True Positive、True Negative、False Positive、False Negative这四个参数:

cnf_matrix = confusion_matrix(y_test,y_test_hat)  #计算混淆矩阵
print(cnf_matrix)
#绘制混淆矩阵
class_names = ['0','1']
plot_confusion_matrix(clf,x_test,y_test,display_labels = class_names,cmap = plt.cm.Oranges,normalize = "true")

效果:

绘制特征重要性的直方图:

#绘制重要性的直方图

labels = ['GCL', 'TEA', 'AMT', 'PAA', 'EYD','CITY']
I = importances

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x , I, width,color = 'orange',label='Importances')
ax.set_ylabel('Importance')
ax.set_xlabel('Feature')
ax.set_title('Importances of the Feature')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
fig.tight_layout()
plt.show()

这个直方图是耗费时间最长的一部分,也是我到现在都没搞懂错误出在哪的问题,之前的代码会报错:”tuple” object is not callable。网上的答案是参数类型不符,但是改了很久都不对。我就去matplotlib官网找了个代码修改成我想要的效果。效果如下:

接下来就是绘制决策树,这里用到了graphviz,可以参考:Mac 安装 Graphviz python 3下载。效果图Jupyter没完全展示,这里就不放图了。代码如下:

#绘制决策树
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import graphviz
feature_name = ['GAP_between_Create_Last','TOTAL_EXPENSED_AMOUNT',
                     'APPROVED_AMT','PAID_IN_AMOUNT_ALLOCATION','EXPENSE_TYPE_DESC','CITY']


clf = DecisionTreeClassifier(criterion = "entropy",max_depth = 5,min_samples_leaf = 5)
clf.fit(x_train,y_train)

dot_data = export_graphviz(clf,feature_names = feature_name,class_names = ['0','1'],filled = True,rounded = True)
graph = graphviz.Source(dot_data)
graph

除此做这个实验确实是一边查一边看着助教的视频摸索,自己亲身操作之后才知道为什么大数据人工智能等都是使用Python开发,主要是Python这方面的库真的太成熟了,还不断有人去开发完善。越来越完善的函数库和超级简单的语法,让Python越来越受大家欢迎了,不得不说,真的香!只需要提醒一下,一定要写代码的时候写好注释,不然过个一个星期可能就看不懂自己的代码了。我会把具体代码和数据文件放在文章末尾,需要的可以下载。


参考链接:
pandas中文网
sklearn中文手册
matplotlib中文网站
numpy中文网站
python提取相对路径
绘制ROC曲线
封面图片来源

发表评论

电子邮件地址不会被公开。 必填项已用*标注