特征工程系列(三)特征增强:清洗数据

《特征工程入门与实践》 笔记

第三章 特征增强

1.识别缺失值

对每个属性进行可视化,发现可以作为特征的一些属性。
画相关矩阵的热力图,发现和target有强相关性的特征,对该列进行探索性分析:
isnull().sum()观察是否有缺失值
shape查看数据的行数列数
describe()作描述性统计分析,观察是否有异常值,可能存在缺失值都用0填充的问题,还是存在缺失值。

2.处理缺失值

若存在缺失值都被填充为0的情况,使用
map(lambda x:x if x!=0 else None)来替换原来的0,也可以for循环replace([0],[None],inplace=True).
然后用isnull()检验

2.1删除有害的行

用下面的代码检查删除了多少行:

data_dropped = data_dropna(how='any')
data_rows_lost=round((100*(data,shape[0]-data_dropped.shape[0])/float(data.shape[0]))
print("retain {}% of rows".format(data_rows_lost))

如果直接dropna的缺失值比较多,考虑比较一下转换前后列的均值,用柱状图看看每列变化的百分比。

fig, ax = plt.subplots()
ax = ((data_dropped.mean() - data.mean()) / data,
      mean()).plot(kind='bar', title='%change in average column values')
ax.set_ylabel('% change')

如果删除行会导致均值有很大的差别,那就应该尽可能的保留更多的数据。
接下来拟合机器学习模型。
先把data_dropped的target和数据分离,然后用机器学习模型拟合算出中其准确率,发现比空准确率高。
接下来尝试填充缺失值来重新拟合。

2.2填充缺失值

可以使用sklearn预处理类的Imputer模块进行处理。
先实例化填充器对象,在创建新的数据对象

from sklearn.preprocessing import Imputer
imputer = Imputer(strategy='mean')
data_imputed = imputer.fit_transform(data)

值得注意的是Imputer的输出值是numpy数组,因此需要

data_imputed = pd.DataFrame(data_imputed, columns=data.columns)

最后检查是否还有缺失值
再次拟合模型,观察准确率。

2.3 在机器学习流水线中填充值

机器学习流水线:
原始数据在输出结果之前要经过多种预处理步骤,乃至多种算法。

学习算法的目标是泛化训练集并将其应用到测试集,我们需要划分训练集和测试集,在交叉验证中可能会进行多次划分。

但是用整体的均值来填充缺失值,泛化能力很差,我们应该用训练集的均值来填充更接近实际泛化能力。
下面用sklearn 的Pipeline 和Imputer

3.标准化和归一化

通过decribe()或者画直方图可以发现每一列数据的均值、最大值、最小值和方差差别都很大,因为一些机器学习模型受数据尺度的影响很大。
同一比例在看直方图hist(sharex=True)保持x轴相同,可以看出所有数据的y轴尺度都不一样。
可以选择归一化操作,将所有的列转化为都在同一个静态范围内的值(例如0-1)
重点关注三种数据归一化方法:

3.1 z分数标准化

z = x − μ σ z = \frac{x-\mu}{\sigma} z=σxμ
原来的值减去该列的均值(mean())除以该列的标准差(std()),改标准化后不会改变原来的分布。
sklearn中有内置的对象帮助我们计算

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
#转换列a
data_standardized = scaler.fit_transform(data[['a']])
#注意data['a']是Series,data[['a]]是DataFrame,转换需要DataFrame

#对每一列都进行z分数转换
scaler_2 = StandardScaler()
data_imputed_mean_scaled = pd.DataFrame(scale.fit_transform(data_imputed_mean),
                                        columns=data.columns)
#作归一化后横坐标相同的直方图
data_imputed_mean_scaled.hist(sharex=True)
3.2 min-max标准化

z = x − x m i n x m a x − x m i n z = \frac{x-x_{min}}{x_{max}-x_{min}} z=xmaxxminxxmin
x是原值,x_min是该列最小值,x_max是该列最大值
每列的值会在0-1
sklearn中同样有内置对象

from sklearn.preprocessing import MinMaxScaler
min_max = MinMaxScaler()
data_minmaxed = pd.DataFrame(min_max.fit_transform(data_imputed),
                             columns=data.columns)

这种标准化的副作用是标准差都非常小,可能不利于某些模型,因为异常值的权重降低了。

3.3 行归一化

这个标准化方法保证每行有单位范数,意味着每行的向量长度相同。
x = ( x 1 , x 2 , . . . , x n ) x=(x_{1},x_{2},...,x_{n}) x=(x1,x2,...,xn)
∣ ∣ x ∣ ∣ = ( x 1 2 + x 2 2 + . . . + x n 2 ||x||=\sqrt{(x_{1}^2+x_{2}^2+...+x_{n}^2} x=(x12+x22+...+xn2
上面这个是L2范数,让每行都有相同的范数。
这个在使用文本数据或聚类算法时非常方便
下面用sklearn

from sklearn.preprocessing import Normalizer
normalize = Normalizer()
data_normalized = pd.DataFrame(normalize.fit_transform(data_imputed),
                               columns=data.columns)
np.sqrt((data_normalized**2).sum(axis=1)).mean()
#行归一化后矩阵的平均范数
1.0
3.4 总结

特征增强的意义:
识别有问题的区域,并确定那种修复方法最有效。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值