机器学习特征工程之预处理

上篇文章介绍特征抽取,这篇文章将要介绍征工程的预处理。主要介绍对数据两种方法两种方式如何处理,它的算法原理是什么,api如何使用,用于场景。

特征处理

通过特定的统计方法(数学方法)将数据转换成算法要求的数据

特征处理之后的数据

如图所示特征抽取完之后,就要进行对其预处理,左边就是原始特征值,右边就被预处理完之后的数据,之所以进行预处理是为了后续算法(算法后续文章将会更新)要求的数据。这里要强调下,这时候的数据是数值型数据,是已经把文本、图片转换成数值之后。

数值型数据处理,有一种方法标准缩放,这方法又有两种方式一种叫做归一化,一种叫做标准化;对于类别型数据的处理的方法叫one-hot编码;对于时间类型处理的方法有时间的切分。

接下来介绍第一组数据转化的方式。

归一化

特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

归一化的算法公式

公式解释:作用于每一列,max为一列的最大值,min为一列的最小值,mx、mi分别为指定区间值默认mx为1、mi为0,X''为最终结。

举个栗子,理解

以第一列为例

解(得一分): X'=(90-60)/(90-60)=1 X''=1* (1-0)+0=1

所以第一列第一行为1

X'=(60-60)/(90-60)=0 X''=0 (1-0)+0=0

所以第一列第二行为0

X'=(75-60)/(90-60)=0.5 X''=0 .5(1-0)+0=0.5

所以第一列第二行为0.5

API:

sklearn归一化API: sklearn.preprocessing.MinMaxScaler MinMaxScalar(feature_range=(0,1)…) 每个特征缩放到给定范围(默认[0,1]) MinMaxScalar.fit_transform(X) X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array

案例:

def gyh(): dict = MinMaxScaler() data = dict.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) print(data) if __name__ == '__main__': gyh()

执行结果

作用:

进行归一化,使特征同等重要。使某一个特征不会对结果造成倾斜式的影响。

相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的

百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个

所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large

也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的

人觉得这三个特征同等重要。

如果上图的算法是(72993-35948)^2+(10.141740-6.83)^2+(1.03-1.21)^2 这样它影响因素就变成里程数,而不是三个因素。这时候对三个因素进行归一化处理,这样里程数和公升数和消耗时间比,影响就是相同的。

缺点:

从公式看出,这种算法很受最大值最小值影响。

在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

标准化

特点:

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。

公式

注:作用于每一列,mean为平均值, 6为标准差(考量数据的稳定性)

举个栗子说明:

第一列的方差

var=((90-75)^2+(60-75)^2+(75-75)^2)/3=300

方差决定为该数据的稳定性。

标准化与归一化的差别:

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。

对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

标准化由于方差跟平均值大多相关,比归一化的鲁棒性强很多。所以标准化是常用于特征处理的方式。

Api:

sklearn特征化API: scikit-learn.preprocessing.StandardScaler StandardScaler(…) 处理之后每列来说所有数据都聚集在均值0附近标准差为1 StandardScaler.fit_transform(X,y) X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array StandardScaler.mean 原始数据中每列特征的平均值 StandardScaler.var 原始数据每列特征的方差

案例:

def staevc(): dict = StandardScaler() data = dict.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]]) print(data) if __name__ == '__main__': staevc()

运行结果

标准化适合在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

缺失值处理

处理方式:

删除: 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列。

插补:可以通过缺失值每行或者每列的平均值、中位数来填充。

Api:

sklearn缺失值API: sklearn.preprocessing.Imputer Imputer(missing_values='NaN', strategy='mean', axis=0) 完成缺失值插补 Imputer.fit_transform(X,y) X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array

案例:

def imputerevc(): im = Imputer(missing_values='NaN', strategy='mean', axis=0) data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]]) print(data) if __name__ == '__main__': imputerevc()

初始化Imputer,指定”缺失值”,指定填补策略,指定行或列。缺失值也可以是别的指定要替换的值。这里传进去的空值必须用使用np.nan/np.NaN来代替,该类型属于float类型 im = Imputer(missing_values='NaN', strategy='mean', axis=0),第一个参数是锁定空值,第二个是如果是空则取平均值,这里的平均值是取不包括空值的平均值,如上图结果 (1+7)/2=4.,axis=0是从列中取。

后续会持续更新由浅入深机器学习的技术文章,关注我随时了解人工智能