什么是特征预处理
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响目标结果,使得一些算法无法学习到其它的特征。所以需要通过转换函数将特征数据转换成更加适合算法模型的特征预处理,包括了对数值型数据进行归一化和标准化。
# 特征预处理 api
sklearn.preprocessing
归一化
定义:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
API
# 实例化一个转换器类,映射范围[0,1]
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)…)
# 调用fit_transform
# X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array
MinMaxScalar.fit_transform(X)
实操
对 dating.txt 中的数据进行特征预处理
1,请自行建立 txt 文件并放入以下数据
milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
2,代码编写与运行
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 读取 txt 数据
data = pd.read_csv("dating.txt")
print(data)
# 实例化一个转换器类
transfer = MinMaxScaler(feature_range=(0, 1))
# 调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最小值最大值归一化处理的结果:\n", data)
但是归一化公式中需要用到数据的最大值和最小值,但是最大最小值容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景, 标准化可以优化这个问题。
标准化
定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
API
sklearn.preprocessing.StandardScaler()
# 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
# X:numpy array格式的数据[n_samples,n_features]返回值:转换后的形状相同的array
实操
同样对上述的 dating 文件数据进行特征预处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 读取 txt 数据
data = pd.read_csv("dating.txt")
print(data)
# 实例化一个转换器类
transfer = StandardScaler()
# 调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
相比于归一化公式,对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。适用于在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。