数据分析(三)实战——分类模型(随机森林与 AdaBoost )

本文以Wine Quality数据集为例,实战应用随机森林与AdaBoost构建分类模型。通过数据预处理,包括异常值检测、离散化和标准化,以及模型训练、参数调整,探讨了在小数据集上可能遇到的过拟合问题。尽管处理方式简化,但旨在展示数据分析的基本流程和学以致用的重要性。
摘要由CSDN通过智能技术生成

前言:根据个人的学习经历,最无奈的就是前面学习了一大堆的零碎知识点,却压根不知道怎么去使用,更不清楚前面所学的哪个知识点可以在哪里派上用场。所以这第三篇文章笔者打算先拿一个简单的案例作为实战演练(之前专业课程的大作业之一),争取在实战中,每个处理环节如何与学习过程挂钩。不过事实声明:由于只是个小数据集,而且是介绍性质,许多处理过程不会与商业上的处理过程一样(比如会省去大量的前期清洗操作),也不会与比赛有可比性(Kaggle上的大神都是套用了一个一个又一个的复杂模型的,膜)。但这不会影响你从上帝视角去做到学以致用。

基本信息

  • 数据集:Wine Quality (同时建议你看下构建这个数据集的作者的 论文
    – 其中包含了红酒和白酒两个文件,本文只使用白酒数据集,即 winequality-white.csv;
    – 白酒数据集包含了 4898 个样本,每个样本包含了【 11 个特征值】+【 1 个类别标签】(即 quality,白酒品质),如下图:
    White wine qulity
  • 基本任务:对白酒品质做分类,即构建分类模型,使其能够以 11 个特征为输入、尽可能准确地预测出白酒的品质。

数据预处理

观察数据集特点

  • 首先从数据集的介绍文档中看到,该数据集无缺失值,因此基本上无需使用缺失值处理(为何说“基本上”?回顾 数据分析(二) 中异常值的处理方式);
  • 只有不到 5000 个数据样本,不算多,在训练过程中要注意观察是否会过拟合或欠拟合;
  • 从 csv 文件中看出,作者没有使用逗号作为分隔符,导致数据以字符串的形式“挤”在一个格子中,需要将其分割开;尤其是表头中,除了第一个属性名称外都因此带上了双引号,强迫症患者要注意啦;另外是各个特征之间的量级差别较大,标准化的需求比较明显;
  • 借用 DataFrame.describe() 不难发现样本的重复率有 20% 左右,最高的一条样本重复了 8 次,为了放大单条样本的作用(也是减少重复收集相同数据的概率),建议去重(可用 DataFrame.drop_duplicates() 函数,下面的数据和实验都是去重后的统计结果);
    describe
  • 数据分布极不均匀,多集中在均值附近,如下图为简单过后的数据中部分统计结果。一方面看出比较适合使用 Z-Score 和 Logistic 的标准化方法,另一方面两端数据较稀疏,可以考虑将其作为异常值去掉(或者使用 LOF);注意,在样本中,白酒品质最低为 3 ,最高为 9 ;
    describe
    品质分布
  • 特征应该多为连续值,个别特征的取值个数比较多,需要进行离散化处理;
    特征取值
''' 分割数据的代码可参考这个 '''
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值