从零开始机器学习-11 特征工程(下)

本文由 沈庆阳 所有,转载请与作者取得联系!
在特征工程(上),我们提到了坏数据对整个数据集的危害,那么我们有什么方法去挑选出并剔除坏数据呢?

缩放

缩放,顾名思义,将特征值从自然范围(比如0到1000)转换到标准范围(0到1或-1到1)。
对于多特特征,缩放可以帮助提升梯度下降法的收敛速度;避免因训练时超出数值范围(如大于float型最大值的范围)而造成的NaN而产生的后果(即NaN陷阱);帮助模型为特征确定合适的权重。
除了将[min,max]以线性方式缩放到诸如[0,1]范围之内,还有另一种缩放策略——计算每个数值的Z得分。
Z得分的计算公式如下:

缩放值=(原始数值-平均值)/标准偏差
scaled=(value-mean)/stddev

极端离群值

通过将totalRooms/population得到roomsPerPerson特征。

california_housing_dataframe["rooms_per_person"] = (
    california_housing_dataframe["total_rooms"] / california_housing_dataframe["population"])

使用pyplot绘制其概率分布如下:
人均房间数分布曲线
我们可以看到,人均房间数大部分分布在1到2之间。但是在图的右侧我们不难观察到甚至于人均55个房间,可以说该分布具有很长的尾巴。由于右侧的这些分布偏离我们的主要分布很远,因此需要降低这些极端离群值对数据集的影响。
其中一个处理极端离群值的方法就是取对数。

roomsPerPerson=log((totalRooms / population) + 1)

对数据取对数处理之后的概率分布
我们可以看到在对数据进行取对数处理过后,最远的离群值到了4左右,相比最远到55少了不少,但是仍然有很多离群值。即使用对数缩放之后仍存在部分离群值。如果这时候我们将roomsPerPerson的最大值限制为4呢?也就是所有大于4的值都会变为4。

roomsPerPerson = min(totalRooms / population, 4)

限制特征值最大值
可以看到,由于将特征值最大值限制为了4,因此所有大于4的值都会变成4,因此在4的地方会出现激增。尽管这个地方出现了一个峰值,但也比原始数据有用的多。

分箱

假设我们存在一个特征值分布在从32到44范围之内的特征。
纬度和房价的分布直方图
可以看出,跟随纬度的变化,房价的变化不再是线性关系。为了将纬度特征变成一个实用的预测指标,则需要对纬度进行分箱。
即对32到44之间的内容等分为11份。如第一个箱(Bin)是从32到34,第二个箱是从34到36…
我们使用一个具有11个元素的矢量来表示,即33纬度坐落在第一个箱内,则该纬度表示为:

[1,0,0,0,0,0,0,0,0,0]

清查

有时,在进行数据集准备的时候,我们获取的数据往往存在不可靠的情况。其具体表现有如下几种:
不良标签:将钢笔误标记为茶杯
重复样本:一个样本存在两次(同时存在训练集和验证集/测试集中,相当致命)
不良特征值:特征值错误,如将房价错误地多大了一个0
遗漏值:如某个房屋的价格忘记输入了,导致该样本的特征值为NaN
在同上面的一些对数据的处理过程中,直方图是可视化数据集中的数据的一种很直观的方法。同时,了解数据的最大值最小值、均值和中间值和标准偏差(方差)都是很有作用的。
最后请记住,良好的机器学习依赖于良好的数据。

觉得写的不错的朋友可以点一个 喜欢♥ ~
谢谢你的支持!

猜你喜欢

转载自blog.csdn.net/sqy941013/article/details/80536166
今日推荐