特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
数值型数据:标准缩放(归一化、标准化)、缺失值处理
类别型数据:one-hot编码
时间类型:时间的切分
sklearn.preprocessing模块提供了一些数据预处理API
1.目的
在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,把不同来源的数据统一到一个参考区间下,使得不同数值范围的数据变得同等重要,预测结果更有意义。
例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大。
2.原理
通过对原始数据进行线性变换把数据映射到[min,max]之间,通常取[0,1]:
3.代码
1)普通归一化
def feature_normal(data_set)
#特征归一化
min_vals = data_set.min(0)
max_vals = data_set.max(0)
ranges = max_vals - min_vals
norm_data = np.zeros(np.shape(data_set))
# 得出行数
m = data_set.shape[0]
# 复制min_vals,行数乘m,再进行矩阵相减
norm_data = data_set - np.tile(min_vals, (m,1))
# 复制ranges,行数乘m,再进行矩阵相除
norm_data = norm_data/np.tile(ranges, (m, 1)))
return norm_data
2)调用sklearn.preprocessing.MinMaxScaler
MinMaxScaler(feature_range=(min,max))----每个特征缩放到给定范围(默认[0,1]);
MinMaxScaler.fit_transform(X)----返回转换后的array,X:numpy array格式的数据[n_samples,n_features]。
>>> from sklearn.preprocessing import MinMaxScaler
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
4.特点:最大值与最小值非常容易受异常点影响,归一化鲁棒性较差,只适合传统精确小数据场景。
1.目的:在归一化方法中异常点的影响很大,要考虑另一种能反应数据的关系,且受异常值影响较小的数据转换方法。
2.原理:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内:
3.代码
调用sklearn.preprocessing.StandardScaler
In [2]: import numpy as np
In [3]: X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
In [4]: from sklearn.preprocessing import StandardScaler
In [5]: std = StandardScaler()
In [6]: X_train_std = std.fit_transform(X_train)
In [7]: X_train_std
Out[7]:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
4.特点:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小,适合现代嘈杂大数据场景。
1.概述
由于各种原因,实际中得到的数据常常是不完整的,缺少的值通常编码为空白、NaN或其他占位符,不能用于机器学习。对于缺失值的处理有删除和插补两种,删除指丢弃包含缺失值的整个行或列,但可能会丢失有价值的数据;常用的方法是插补,即用均值、中位数估算缺失值。
2.方法
1)可以用pandas中的dropna()丢弃缺失值,或fillna()填补缺失值
2)sklearn.preprocessing中的Imputer类进行填充
>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> print(imp.transform([[1, 2], [np.nan, 3], [7, 6]]))
[[ 1. 2. ]
[ 4. 3. ]
[ 7. 6. ]]
注:Imputer实例化后,在填补缺失值前必须进行适配(fit),即先调用Imputer.fit()再调用Imputer.transform()进行转换,或者直接调用Imputer.fit_transform()进行适配和转换。
3.注意
无论是pandas还是sklearn.preprocessing中对缺失值的处理,都是针对np.nan类型的缺失值,在得到数据后,还需要将其他形式的缺失值转换成np.nan,才能进行处理。
API----Application Programming Interface,应用程序接口
strategy----策略
sklearn库中包含很多机器学习的模型及数据处理的API,可以用于实践练习,但实际工程中如果考虑到性能和效率,也需要自己进行代码书写。