常用的有几种特征缩放的方法:包括标准化、数据的压缩(也叫归一化),以及规范化等。
特征缩放对于机器学习特别重要,可以让机器在读取数据的时候感觉更“舒服”,训练起来效率更高。
这里就对数据进行归一化。归一化是按比例的线性缩放。数据归一化之后,数据分布不变,但是都落入一个小的特定区间,比如0~1或者-1~+1。
常见的一个归一化公式如下:
通过 Sklearn库中preprocessing(数据预处理)工具中的MinMaxScaler可以实现数据的归一化。
下面用自定义函数体验一下其中细节:
def scaler(train, test):#定义归一化函数,进行数据压缩
min = train.min(axis=0)#训练集最小值
max = train.max(axis=0)#训练集最大值
gap = max - min#最大值和最小值的差
train -= min #所有数据减去最小值
train /= gap #所有数据除以最大值和最小值的差 test -- min把训练集最小值应用于测试集
test /= gap#把训练集最大值和最小值的差应用于测试集
return train, test#返回压缩后的数据
这个函数的功能也等价于下面的伪代码:
#数据的归一化
x_norm = (x_data - np.min(x_data))/(np.max(x_data)- np.min(x_data)).values
上面的代码中,特别需要注意的是归一化过程中的最大值(max)、最小值(min),以及最大值和最小值之间的差(gap),全都来自训练集。不能使用测试集中的数据信息进行特征缩放中间步骤中任何值的计算。举例来说,如果训练集中的广告投放金额最大值是350,测试集中的广告投放金额最大值是380,尽管380大于350,但归一化函数还是要以350作为最大值,来处理训练集和测试集的所有数据。
为什么非要这样做呢?因为,在建立机器学习模型时,理论上测试集还没有出现,所以这个
步骤一定要在拆分数据集之后进行。有很多人先对整个数据集进行特征缩放,然后拆分数据集这种做法是不谨慎的,会把测试集中的部分信息泄露到机器学习的建模过程之中。下面的代码使用刚才定义的归一化函数对特征和标签进行归一化。
x_train,x_test = scaler(X_train, x_test) #对特征归一化
y_train, y_test = scaler(y_train, y_test)#对标签也归一化
下面的代码显示数据被压缩处理之后的散点图,形状和之前的图完全一致,只是数值已被限制在一个较小的区间:
#用之前已经导入的matplotlib.pyplot 中的plot方法显示散点图
plt.plot(X_train, y_train, 'r.', label='Training data')#显示训练数据 plt.xlabel('wechat')#x轴标签
plt.ylabel('sales')#y轴标签
plt.legend()显示图例
plt.show() #显示绘图结果
如果根据这个散点图手工绘制一条线,大概如下图所示的样子,这显示出微信公众号广告投放金额和销售额的线性关系
参考资料:零基础学机器学习