我们在进行特征抽取后,需要根据算法的要求,使用特定的统计方法(数学方法)将数据转换成其所需格式(算法要求的数据)。对于不同的数据类型有不同的转换方法。
(1)数值类型数据
对于数值类型数据可采用标准的缩放,其方法有:
- 归一化
- 标准化
- 缺失值处理
(2)类别型数据
采用one-hot编码,像字典、文本数据进行特征抽取,转成了one-hot编码。
(3)时间类型
采用时间切分的方式。
注意:这里主要说说数值型数据的预处理方式。
特征预处理模块:sklearn.preprocessing
1、归一化(※)
sklearn归一化API
sklearn归一化API:sklearn.preprocessing.MinMaxScaler
归一化目的:使得某一个特征对最终结果不会造成更大的影响
MinMaxScaler(feature_range(0,1)...) | 每个特征缩放到给定的范围(默认[0,1]) | 支持自己指定范围 |
MinMaxScaler.fit_transform(X) | X:numpy array格式的数据[n_samples, n_features] | 返回转换后形状相同的array |
注:feature_range用于指定规范化后的范围 |
'''
归一化步骤:
1、实例化MinMaxScalar
2、通过fit_transform转换
'''
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return: None
"""
mm = MinMaxScaler(feature_range=(2, 3))
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
return None
if __name__ == "__main__":
mm()
如果数据中出现的异常点较多,会有什么影响?
从公式角度:异常点对最大值max和最小值min影响太大,所以归一化最大的缺点就是对异常数据的处理不是太好。
归一化总结:
注意在特定场景下最大值最小值是变化的,另外最大值与最小值非常容易受异常点影响,所以这种方法的鲁棒性比较差,只适合传统精确小数据的场景。
2、标准化
目的:使得某一个特征对最终结果不会造成更大的影响
特点:通过对原始数据进行变换,把数据变化到均值为0,标准差为1范围内(注:是标准差,下方图片有误)
注:方差为0的意义(代表什么):某个特征所有值都一样
如果数据中出现的异常点较多,会有什么影响?
标准化中使用的是平均值,异常点对平均值的影响不大
对于标准化来说:如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小
标准化API(sklearn)
sklearn特征化API:sklearn.preprocessing.StandardScaler
StandardScaler(...) | 处理之后对于每列来说,所有的数据都聚集在均值为0、标准差为1附近 | |
StandardScaler.fit_transform(X) | X:numpy array格式的数据 [n_samples, n_features] | 返回转换后形状相同的array |
StandardScaler.mean_ | 原始数据中每列特征的平均值 | |
StandardScaler.std_ | 原始数据中每列特征的方差 | |
注:标准化步骤——> 1、实例化StandardScaler 2、通过fit_transform()转换 |
from sklearn.preprocessing import StandardScaler
def stand():
"""
标准化
:return: None
"""
std = StandardScaler()
data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
print(data)
return None
if __name__ == "__main__":
stand()
标准化总结:
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据情景
3、缺失处理(主要用pandas处理)
如何处理数据中的缺失值?
删除 | 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列 |
插补(常用) | 可以通过缺失值每行或者每列的平均值,中位数来填充(注:建议按列填补) |
sklearn缺失值API:
sklearn缺失值API:sklearn.preprocessing.Imputer
Imputer(missing_value='NaN', strategy='mean', axis=0) | 完成缺失值插补 | axis=0是列,1是行 |
Imputer.fit_transform(X) | X:numpy array格式的数据 [n_samples, n_features] | 返回转换后形状相同的array |
注:在sklearn的0.22以上版本的sklearn去除了Imputer类,我们可以使用SimpleImputer类代替。或者降级回版本sklearn 0.19 |
from sklearn.preprocessing import Imputer
import numpy as np
def im():
"""
缺失值处理
:return: None
"""
im1 = Imputer(missing_values=np.nan, strategy='mean', axis=0) #axis取0代表按列取平均,1代表按行
data = im1.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
if __name__ == "__main__":
im()