上篇文章介绍特征抽取,这篇文章将要介绍征工程的预处理。主要介绍对数据两种方法两种方式如何处理,它的算法原理是什么,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是从列中取。