数据分析(三)实战——分类模型(随机森林与 AdaBoost )
前言:根据个人的学习经历,最无奈的就是前面学习了一大堆的零碎知识点,却压根不知道怎么去使用,更不清楚前面所学的哪个知识点可以在哪里派上用场。所以这第三篇文章笔者打算先拿一个简单的案例作为实战演练(之前专业课程的大作业之一),争取在实战中,每个处理环节如何与学习过程挂钩。不过事实声明:由于只是个小数据集,而且是介绍性质,许多处理过程不会与商业上的处理过程一样(比如会省去大量的前期清洗操作),也不会与比赛有可比性(Kaggle上的大神都是套用了一个一个又一个的复杂模型的,膜)。但这不会影响你从上帝视角去做到学以致用。
基本信息
- 数据集:Wine Quality (同时建议你看下构建这个数据集的作者的 论文 )
– 其中包含了红酒和白酒两个文件,本文只使用白酒数据集,即 winequality-white.csv;
– 白酒数据集包含了 4898 个样本,每个样本包含了【 11 个特征值】+【 1 个类别标签】(即 quality,白酒品质),如下图:
- 基本任务:对白酒品质做分类,即构建分类模型,使其能够以 11 个特征为输入、尽可能准确地预测出白酒的品质。
数据预处理
观察数据集特点
- 首先从数据集的介绍文档中看到,该数据集无缺失值,因此基本上无需使用缺失值处理(为何说“基本上”?回顾 数据分析(二) 中异常值的处理方式);
- 只有不到 5000 个数据样本,不算多,在训练过程中要注意观察是否会过拟合或欠拟合;
- 从 csv 文件中看出,作者没有使用逗号作为分隔符,导致数据以字符串的形式“挤”在一个格子中,需要将其分割开;尤其是表头中,除了第一个属性名称外都因此带上了双引号,强迫症患者要注意啦;另外是各个特征之间的量级差别较大,标准化的需求比较明显;
- 借用 DataFrame.describe() 不难发现样本的重复率有 20% 左右,最高的一条样本重复了 8 次,为了放大单条样本的作用(也是减少重复收集相同数据的概率),建议去重(可用 DataFrame.drop_duplicates() 函数,下面的数据和实验都是去重后的统计结果);
- 数据分布极不均匀,多集中在均值附近,如下图为简单过后的数据中部分统计结果。一方面看出比较适合使用 Z-Score 和 Logistic 的标准化方法,另一方面两端数据较稀疏,可以考虑将其作为异常值去掉(或者使用 LOF);注意,在样本中,白酒品质最低为 3 ,最高为 9 ;
- 特征应该多为连续值,个别特征的取值个数比较多,需要进行离散化处理;
''' 分割数据的代码可参考这个 '''
import codecs
'''
columns = ["fixed acidity", "volatile acidity", "citric acid", "residual sugar",
"chlorides", "free sulfur dioxide", "total sulfur dioxide", "density",
"pH", "sulphates", "alcohol", "quality"]
'''
file = codecs.open(filePath, 'r', 'utf-8')
data = file.readlines()
for i in range(len(data)):
if i == 0:
# strip 只能删除【首尾】的指定字符
data[0] = [item.strip('"') for item in data[i].split(';')]
# 注意到最后还有一个换行符,对最后一个串额外 strip
data[0][len(data[0]) - 1] = data[0][len(data[0]) - 1].strip('"\n')
continue
data[i] = [float(item) for item in data[i].split(';')]
wine_df = pd.DataFrame(columns=data[0], data=data[1:])
wine_df.drop_duplicates(inplace=True)
print(wine_df.head())
print(wine_df