机器学习(2)--特征工程之特征预处理(归一化/标准化/缺失值)
二、数据的特征处理
概念: 通过特定的统计方法(数学方法)将数据转换成算法要求的数据
不同数据的处理方式:(并非一定要用,视情况)
数值型数据: 标准缩放:
1、归一化
2、标准化
3、缺失值
类别型数据 :one-hot编码(后续补充)
时间类型: 时间的切分(后续补充)
sklearn特征处理API
sklearn. preprocessing
数值型数据
1. 归一化:
特点 :通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:


注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’ 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
归一化公式计算过程:

x11 = 90-60/90-60 = 1,x11‘ = 1(1-0)+0 = 1
x21 = 60-60/90-60 = 0,x21 = 0(1-0)+0 = 0
……
结果为:

sklearn归一化API:
sklearn.preprocessing.MinMaxScaler
MinMaxScaler语法:
MinMaxScalar(feature_range=(0,1)…)
每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
归一化步骤 :
1)实例化MinMaxScalar
2)通过fit_transform转换
【注:这里的数据不同于特征抽取的数据,这里应该是一个二维数组】
def mm():
"""
归一化处理
:return: NOne
"""
mm = MinMaxScaler(feature_range=(0, 1))#范围可以修改
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
结果显示:

可见每一列都是在默认的范围
归一化案例:
相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的 百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large 也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的人觉得这三个特征同等重要。

三个特征同等重要的时候,才能进行归一化
目的使得某一个特征对于最终结果不会造成更大的影响
例如:(72993-35948)^2 + (10.14-6.8)^2 + (1.0 - 1.21)^2 这样结果与实际情况偏差了,某一个特征过于大,对结果影响大
如果数据中异常点过多,会有什么影响?可以从公式角度分析,异常点对最大值最小值影响较大
缺点 :
注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。【鲁棒性:稳定性较差,像是用户较多时,系统不稳定】
2. 标准化【解决归一化受异常点影响较大的问题】
特点:
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
公式:

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

结合归一化来谈标准化

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。【因此,标准化对于数据量有一定的要求】
sklearn特征化API
scikit-learn.preprocessing.StandardScaler
StandardScaler语法
1)StandardScaler(…) 处理之后每列来说所有数据都聚集在均值0附近方差为1
2)StandardScaler.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
3)StandardScaler.mean_
原始数据中每列特征的平均值
4)StandardScaler.std_
原始数据每列特征的方差
步骤:
1)实例化StandardScaler
2)通过fit_transform转换
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
return None
结果显示:

每一列的平均值为0,标准差为1
案例:
相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的 百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large 也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的人觉得这三个特征同等重要。【数据见归一化的案例】
【这里输入的数据是二维数组,尝试一下】
总结:
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
缺失值处理
方式:
| 删除 | 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列 |
|---|---|
| 插补 | 可以通过缺失值每行或者每列的平均值、中位数来填充 |
【一般不建议删除,尤其是样本量较小】
【这里有按行和按列,一般是按列填充,更准确】
sklearn缺失值API:
sklearn.preprocessing.Imputer
Imputer语法:
1)Imputer(missing_values='NaN', strategy='mean', axis=0) 完成缺失值插补
2)Imputer.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
使用pandas:fropna删除,fillna填补/
【需要数据当中的缺失值需要是np.nan】
如果缺失值类型非np.nan,则需要使用replace()进行处理
【可以用NaN或nan都可以】
Imputer流程:
1)初始化Imputer,指定”缺失值”,指定填补策略,指定行或列【注:缺失值也可以是别的指定要替换的值】
2)调用fit_transform
def im():
"""
缺失值处理
:return:NOne
"""
# NaN, nan
im = Imputer(missing_values='NaN', strategy='mean', axis=0)
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
【这里的axis=0代表的是按列填补】
结果显示;
转变为:
对于类别型数据和时间数据,类别型上一节已经提到,需要将类别型数据转为字典,然后对其做one-hot编码,时间数据以后结合案例写。
关于np.nan(np.NaN)
1)numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
2)如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float 型的数组即可
