特征工程(二)特征预处理
特征处理就是通过特定的统计方法(数学方法)将数据转换为算法要求的数据,可以把有量纲表达式转换为无量纲表达式。
- 数值型的数据
- 归一化
- 标准化
- 缺失值
- 类别型数据
- one-hot编码
- 时间类型
- 时间的切分
归一化
通过对原始数据进行变换把数据映射到 [ 0 , 1 ] [0,1] [0,1](或其他区间)
实质上归一化就是去掉量纲,使得多组特征在对结果的影响是相同的。
X ′ = x − m i n m a x − m i n X'=\frac{x-min}{max-min} X′=max−minx−min
X ′ ′ = X ′ ∗ ( m x − m i ) + m i X''=X'*(mx-mi)+mi X′′=X′∗(mx−mi)+mi
作用于每一列, m a x max max为一列的最大值, m i n min min为一列的最小值,那么 X ′ ′ X'' X′′为最终结果, m x , m i mx,mi mx,mi为指定的区间(默认 m x = 1 , m i = 0 mx=1,mi=0 mx=1,mi=0)
式(1)中的分式量纲相除为1,这样就把量纲表达式转换为无量纲表达式。
归一化的问题:
异常点会严重影响归一化的结果,造成偏差
sklearn特征处理归一化API:
sklearn.preprocessing
- 所有的数据预处理都要使用这个API
sklearn.preporcessing.MinMaxScaler(feature_range=(0,1)...)
- 归一化API
- feature_range=(0,1)代表缩放的给定范围
MinMaxScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_feature]
- 返回值:转换后的形状相同的array
示例:
# 归一化
from sklearn.preprocessing import MinMaxScaler
def mm():
# 实例化
mm = MinMaxScaler()
# 调用fit_transform()转化数据
data = mm.fit_transform(([90,2,10,40],[60,4,15,45],[75,3,13,46]))
print(data)
return None
if __name__ == "__main__":
mm()
输出:
[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
标准化
归一化的问题就是异常点对于计算结果影响较大,而标准化对于异常点并不敏感
标准化可以通过对原始数据进行变换,把数据变换到均值为0,方差为1的范围内
X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X′=σx−mean
作用于每一列, m e a n mean mean为平均值, σ \sigma σ为标准差、
v a r var var为方差,
v a r = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 . . . n ( 每 个 特 征 的 样 本 数 ) var=\frac{(x_1-mean)^2+(x_2-mean)^2...}{n(每个特征的样本数)} var=n(每个特征的样本数)(x1−mean)2+(x2−mean)2...
σ = v a r \sigma=\sqrt{var} σ=var
其中 v a r var var(方差)代表数据的稳定性
标准化在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
sklearn特征处理标准化API:
sklearn.preporcessing.StandardScaler
- 处理之后每列数据都聚集在均值0附近,标准差为1
StandardScaler.fit_transform(X)
- X: numpy array格式的数据[n_samples,n_feature]
- 返回值:转化后的形状相同的array
StandardScaler.mean_
- 原始数据中每列特征的平均值
StandardScaler.std_
- 原始数据每列特征的方差
示例:
# 标准化
from sklearn.preprocessing import StandardScaler
def stan():
# 实例化
sta = StandardScaler()
data = sta.fit_transform(([1,-1,3],[2,4,2],[4,6,-1]))
print(data)
return None
if __name__ == '__main__':
stan()
输出:
[[-1.06904497 -1.35873244 0.98058068]
[-0.26726124 0.33968311 0.39223227]
[ 1.33630621 1.01904933 -1.37281295]]
缺失值
缺失值处理方法:
删除 | 如果每列过着每行数据缺失值到达一定比例,建议整行或整列删除 |
---|---|
插补 | 可以通过缺失值每行或者每列的平均数或中位数来填充(主要按列) |
sklearn缺失值处理API:
sklearn.perprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0)
- 完成缺失值插补
- missing_valuess=‘NaN’代表缺失值现在的值是’NaN’
- strategy='mean’插补的策略为平均值插补
- axis=0按列填补
Imputer.fit_transform(X)
- X:numpy array格式的数据[n_samples, n_features]
- 返回值:转换后形状相同的array
示例:
# 缺失值填补
from sklearn.preprocessing import Imputer
import numpy as np
def inp():
# 实例化
i = Imputer(missing_values='NaN', strategy='mean',axis=0)
data = i.fit_transform(([1.,2.],[np.nan,3.],[7.,6.])) # 注意,这里需要是float型
print(data)
return None
if __name__ == '__main__':
inp()