“
从UCI上获取到了一份winequality的数据来作为小练习的数据源,大家可以去Index of /ml/machine-learning-databases/wine-quality下载选择red红酒的csv数据下载即可。
”
一、首先进行数据的导入,探索与预处理:
观察到表有问题,实际上这个csv文件通过分号分割,所以导入时需要添加:sep=';',即可正常读取数据。继续初步观察下来,得知数据集中,不存在空值。
关于以上这些列的含义有一个中英对照表:
二、处理数据是否分布平衡
数据是否平衡是在机器学习建模过程前需要考虑的一个问题,其主要本质是分类,在这个数据集中是quality,可能部分在训练数据中,绝大多数都是quality是3,而只有极少部分是4,则这时候训练出来的模型只需要都归为3,也可以获得很好的准确度,但这个时候实际上这个模型就没有意义了。
针对这种数据可以有多种处理方法,可以重新整体采样,也可以对小类别的数据进行过采样(即多加一个同类的副本)或者对大类别中删去一定数量的样本,使得最后总体各个类别的数据几乎差不多。
对于这个数据集先观察一下目前各个quality(我们想要预测的这个变量)的分布情况。
显然quality为5的数据样本有太多,而quality为3的数据样本又太少,这时候可以考虑过采样,python现在有个新包叫imbalanced-learn可以进行处理,这个Anaconda不自带,需要自行pip install一下。
3 681
4 681
5 681
6 681
7 681
8 681
Name: 0, dtype: int64
可以看到都根据样本数最多的那个quality=5进行了过采样,样本数量不够分类的会进行复制使其数量达到681,这种操作可能会造成后续的数据会有偏向性以及所谓过拟合,这个后续还可以通过交叉检验进行验证。
先用LR回归尝试一下,这里也权当复习,先可以尝试把所有特征都用上,利用交叉检验,看看预测结果如何
输出结果为0.57可以看到如果直接在原始不平衡数据上把所有特征都用上,使用LR回归几乎对预测这个多分类的quality没有什么帮助,后来再过采样后的数据上也用了LR回归同样准确率很不理想。
查阅资料知道Logistics回归一般做的是二分类即预测变量只有两个结果,对于多分类的y一般预测并不准确,但同时也要认知到Logistics回归在金融预测,诸如是否发信用卡等方面仍然还是十分常用的,准确度高,训练速度快。
由于也是边学边做,起先的时候以为可能是由于特征的多重共线性导致的,所以有差看一下所有使用的特征的相关性,这个可以利用seaborn快速可视化的实现这一效果,代码如下:
显示如下:可以看到多数变量之间实际上相关系数都在0.4以下,不存在高度相关
通过查阅更多的资料得知,Logistics回归的一些优缺点:
⊙Logistic回归分析的优点:
适合需要得到一个分类概率的场景
实现效率较高
对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决;
逻辑回归广泛的应用于工业问题上
⊙逻辑回归的缺点:
当特征空间很大时,逻辑回归的性能不是很好;
不能很好地处理大量多类特征或变量;
对于非线性特征,需要进行转换;
依赖于全部的数据特征,当特征有缺失的时候表现效果不好
对于这个红酒问题而言,预测变量的类别显得有些太多了,估计是模型效果不佳的一个主要原因。
接下来引入随机森林,要理解随机森林先要理解决策树,决策树的原理如下:实际上就是对样本通过特征条件判断不断细分,形成像树状一样的结构,最后使得最后的子树中类别越纯,则说明分类的效果越好。
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。
因为决策树本质上可以有很多的决策条件所以可以形成很多不同的决策树,对样本的分类也会不尽相同,随机森林可以集成许多决策树分类的结果取多数的一个结果作为随机森林模型得到的结果,这样的方法会使最终的结果的准确率高于单个的决策树的准确率。
实际使用的话仍然可以通过sklearn中简单调取相关方法即可。
得到结果是86%,大大超过了Logistics回归的准确率。这种交叉检验的方法是训练集是所有样本都使用了,在检验测试的时候分为5个部分,四个部分进行训练,一个部分作为测试集,会得到5次测试结果后取平均准确度得到86%,还有通常的做法会一开始就将所有样本先拆分为训练集和测试集,通过训练集的模型直接放到测试集上去测试效果,得到准确率,我们也来看一下这种方法预测后的结果如何。
将数据切分成80%的数据作为训练集,20%的数据作为测试集。
关于train_test_split的用法参考如下:
一般形式:
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和testdata,形式为:
X_train,X_test, y_train, y_test =
cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)
参数解释:
train_data:所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比,如果是整数的话就是样本的数量
random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
那么首先,使用predict()函数得到上一节训练的随机森林模型在测试集合上的预测结果,然后使用 sklearn.metrics中的相关函数对模型的性能进行评估。
得到的结果如下:
precision recall f1-score support
3 0.99 1.00 0.99 142
4 1.00 1.00 1.00 129
5 0.80 0.81 0.80 150
6 0.77 0.66 0.71 146
7 0.87 0.98 0.92 125
8 0.99 1.00 1.00 126
avg / total 0.90 0.90 0.90 818
[[142 0 0 0 0 0]
[ 0 129 0 0 0 0]
[ 2 0 121 26 1 0]
[ 0 0 31 96 18 1]
[ 0 0 0 2 123 0]
[ 0 0 0 0 0 126]]
上述混淆矩阵中对角线的元素表示模型正确预测数,对角元素之和表示模型整体预测正确的样本数。
准确度在90%左右,由于前面在抽取训练集和测试集时random_state设置为0,我们可以测试多次,会选取到不同的训练集和测试集,测算多个准确度求平均值进行比较,经过测试仍然维持在90%左右。
DC君补充阅读:
关于决策树的介绍:http://blog.csdn.net/gumpeng/article/details/51397737
信息熵:http://blog.csdn.net/saltriver/article/details/53056816
不平衡学习的评价方法:https://www.jianshu.com/p/3e8b9f2764c8
本篇实例分析文档为DC数据分析学员Echo投稿,DC君也希望有更多小伙伴学习实例做出更多属于自己的项目,分享给一同学习的小伙伴~
领取专属 10元无门槛券
私享最新 技术干货