一、为什么需要进行特征缩放?
因为对于大多数的机器学习算法和优化算法来说,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为1~10,第二个特征的取值范围为1~10000。在梯度下降算法中,代价函数为最小平方误差函数,所以在使用梯度下降算法的时候,算法会明显的偏向于第二个特征,因为它的取值范围更大。在比如,k近邻算法,它使用的是欧式距离,也会导致其偏向于第二个特征。对于决策树和随机森林以及XGboost算法而言,特征缩放对于它们没有什么影响。
二、常用的特征算法缩放有哪些?
常用的特征缩放算法有两种,归一化(normalization)和标准化(standardization)。归一化算法是通过特征的最大最小值将特征缩放到[0,1]区间范围内,而多于许多机器学习算法,标准化也许会更好,标准化是通过特征的平均值和标准差将特征缩放成一个标准的正态分布,均值为0,方差为1。接下来我们就通过scikit-learn提供的方法对于葡萄酒的数据集进行标准化处理。
三、归一化(normalization)
归一化是利用特征的最大最小值,将特征的值缩放到[0,1]区间,对于每一列的特征使用min-max函数进行缩放,计算公式如下
利用UCI提供的葡萄酒数据集,一个有178条数据,每一条数据有13个样本
数据下载地址:https://download.csdn.net/download/sinat_29957455/10274582
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
if __name__ == "__main__":
#读取葡萄酒数据集
data = pd.read_csv("G:/dataset/wine.csv")
#获取第二列Alcohol
x =data["Alcohol"]
#获取数据的基本情况
print(x.describe())
minMax = MinMaxScaler()
#将数据进行归一化
x_std = minMax.fit_transform(x)
print(x_std)
四、标准化(standardization)
标准化比归一化要更加实用,因为像逻辑斯蒂回归和支持向量机算法,刚开始训练的时候会将参数初始化为0或趋于0的随机极小值,如果是标准化的数据(均值为0,方差为1)对于它们而言,这更加容易利于权重的更新。将特征列标准化的计算公式如下
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
if __name__ == "__main__":
# 读取葡萄酒数据集
data = pd.read_csv("G:/dataset/wine.csv")
# 获取第二列Alcohol
x = data["Alcohol"]
std = StandardScaler()
#将x进行标准化
x_std = std.fit_transform(x)
print(x_std)