值数据清洗
刚开始接触的数据,并不如我们想的那么完美, 数据存在缺失值以及一些脏数据。数据清洗也包括对数据进行再处理比如归一化等。
皮马印第安人糖尿病预测数据集, 通过怀孕次数,口服葡萄糖耐量实验中的2小时血浆葡萄糖浓度,舒张压,三头肌皮褶厚度,2小时血清胰岛素浓度,体重指数,糖尿病家族函数,年龄,预测5年内会不会得糖尿病,类变量(0或1,代表无或有糖尿病)
数据分析
首先查看一下空准确率(当模型总是预测频率较高的类别时达到的正确率):
既然终极目标是研究数据的规律以预测是否会患糖尿病,那么可以对糖尿病患者和健康患者进行可视化。查看俩类的差异。
可以查看各属性跟onset_diabetes类别的相关性:
根据以上相关性,可以得出plasma_glucose_concentration(血浆葡萄糖浓度)和onset_diabetes(糖尿病类别)有较强的相关性。
查看缺失值:
根据以上可以得出没有缺失的情况。
查看数据的基本的描述性统计:
发现血压, bmi, 胰岛素浓度等指标都是0,不符合医学常识。也许缺失值都是以0来填充的。
处理缺失值
对缺失值的处理方式,主要分为俩种:删除缺失值的行, 填充缺失值
现对上面数据将null填充为0的数据还原。
删除有害的行
先确保删除的行在可以接受的范围内:
从上面可知,有51%的数据被删除掉, 一半以上的数据被忽略掉,虽然数据变得非常干净,但是我们没有利用尽可能多的数据。
先比较删除前后数据的分布,是否有所改变:
将删除前后的空准确率进行比较,发现没有很大的差别。
查看各属性删除前后值是否存在波动:
通过上面俩种表现形式的数据,可以发现前后数据的存在较大的波形性,特别是times_pregnant,pedigree_function有超过10%的改变。
得到准确率为74.5%, 比空准确率66.8%效果好,这只是使用了49%的数据。
填充缺失值
先以plasma_glucose_concentration缺失为5的开始, 以均值填充缺失值
sklearn提供了一种预处理类的Imputer模块。
机器学习流水线
注意:
1. 首先需要将数据划分为训练集和测试集
2. 预处理是在划分数据之后
准确率略低于目标0.745
标准化和归一化
归一化:因为一些机器学习模型受数据尺度的影响很大, 这意味着diastolic_blood_presure列的舒张压在24-22,但是年龄是21-81,那么算法不会达到最优化状态。可以在直方图方法中调用可选的sharex和sharey参数,在同一比例下查看每个图表:
标准化通过确保所有行和列在机器学习中得到平等对待,让数据的处理保持一致。有以下几种方法:z分数标准化,min-max标准化,行归一化。
z分数标准化
z分数标准化利用了统计学里简单的z分数(标准分数)思想。z分数标准化的输出会被重新缩放,使均值为0, 标准差为1。
:单元格原来的值 :该列的均值 :是列的标准差
目前得分0.7435,接近目标得分0.745
min-max标准化
min-max标准化:
m:是新的值, x是单元格原来的值, 是该列的最小值,是该列的最大值
所有属性的最小值都是0, 所有属性的最大值都是1。注意,这种缩放的副作用是标准差都非常小。这有可能不利于某些模型,因为异常值的权重降低了。
0.746目前最高得分。