第二天的学习:
对于特征的预处理
有些模型在各个维度进行不均匀伸缩后,最优解与原来不等价,例如SVM。对于这样的模型,除非本来各维数据的分布范围就比较接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据dominate。
有些模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression。对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太“扁”,迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型,最好也进行数据标准化。
公式:
min: 对于特征值对应的一列值得最小值
max: 对于特征值对应的一列值得最大值
[mx,mi]: 对于归一化的范围,默认范围是(0,1)
对特征的归一化操作需要
from sklearn.preprocessing import MinMaxScaler
preprocessing这个预处理的包中的MinMaxScaler来进行归一化的操作
def minmax():
"""
预处理归一化处理
:return: None
"""
mm=MinMaxScaler()
data=mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
if __name__=="__main__":
minmax()
代码实现了对于特征值得预处理的归一化处理,得到的结果如下:
[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
归一化处理可以将特征值归到默认[0,1]之间,在MinMaxSclar()有个参数,
feature_range=(1,2)
控制最后的结果归到哪个区间之间;
以上的操作是对数据的归一化。
特征值的归一化的作用是为了不让某个特征对最终结果有特别大的影响,这是它的优点,但它的鲁棒性差,所以它只适合小型的
精准的数据。
但是,归一化的操作会因为数据的异常而造成归一结果变换特别明显,所以就提出了标准化的操作。
注释: 作用于每一列,mean为每一列的平均值,σ为标准差
其中方差表示了数据的稳定性;
def mm():
st=StandardScaler()
data=st.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
print(data)
if __name__=="__main__":
mm()
结果如下:
[[-1.06904497 -1.35873244 0.98058068]
[-0.26726124 0.33968311 0.39223227]
[ 1.33630621 1.01904933 -1.37281295]]
对于数据每列特征值的加起来基本都为0
这些数据就是有些算法需要用到的。