数据预处理。数据中不同特征的维度可能不一致,值之间的差异可能很大。处理失败可能会影响数据分析的结果。因此,数据需要按照一定的比例进行缩放,使其落在特定的区域进行综合分析。常用的方法有两种:maximum-minimumnormalization:对原始数据进行线性变换,将数据映射到[0,1]区间Z-Scorestandardization:将原始数据映射到均值为0和0的分布标准偏差为1为什么要标准化/归一化?提高模型精度:经过标准化/归一化后,不同维度之间的特征在数值上具有可比性,可以大大提高分类器的精度。加速模型收敛:标准化/归一化后,最优解的优化过程明显变得更加平滑,更容易正确收敛到最优解。如下图:哪些机器学习算法需要标准化和归一化1)需要使用梯度下降和计算距离的模型需要归一化,因为不进行归一化,收敛路径会呈锯齿状减少,导致收敛路径为太慢了,而且不容易找到最优解。归一化后,梯度下降寻找最优解的速度加快,精度可能会提高。例如线性回归、逻辑回归、adaboost、xgboost、GBDT、SVM、NeuralNetwork等。需要计算距离的模型需要归一化,如KNN、KMeans等。2)概率模型和树结构模型不需要需要归一化,因为他们不关心变量的值,而是变量的分布和变量之间的条件概率,比如决策树和随机森林。彻底理解标准化和归一化示例数据集包含一个自变量(purchased)和三个因变量(country、age和salary),可以看出salary的范围远大于age,如果直接拿数据做machineLearning模型(如KNN、KMeans),该模型将完全以薪资为主导。#导入数据importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspddf=pd.read_csv('Data.csv')填充缺失值均值,处理字符变量df['Salary'].fillna((df['Salary'].mean()),inplace=True)df['Age'].fillna((df['Age'].mean()),inplace=True)df['Purchased']=df['Purchased'].apply(lambdax:0ifx=='No'else1)df=pd.get_dummies(data=df,columns=['Country'])最大最小归一化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()scaler.fit(df)scaled_features=scaler.transform(df)df_MinMax=pd.DataFrame(data=scaled_features,columns=["Age","Salary","Purchased","Country_France","Country_Germany","Country_spain"])Z-Score标准化fromsklearn.preprocessingimportStandardScalersc_X=StandardScaler()sc_X=sc_X.fit_transform(df)sc_X=pd.DataFrame(data=sc_X,columns=["Age","Salary","Purchased","Country_France","Country_Germany","Country_spain"])importseabornassnsimportmatplotlib.pyplotaspltimportstatisticsplt.rcParams['font.sans-serif']=['微软雅黑']fig,axes=plt.subplots(2,3,figsize=(18,12))sns.distplot(df['Age'],ax=axes[0,0])sns.distplot(df_MinMax['Age'],ax=axes[0,1])axes[0,1].set_title('归一化方差:%s'%(statistics.stdev(df_MinMax['Age'])))sns.distplot(sc_X['Age'],ax=axes[0,2])axes[0,2].set_title('标准化方差:%s'%(statistics.stdev(sc_X['Age'])))sns.distplot(df['工资'],ax=axes[1,0])sns.distplot(df_MinMax['工资'],ax=axes[1,1])axes[1,1].set_title('MinMax:工资')axes[1,1].set_title('归一化方差:%s'%(statistics.stdev(df_MinMax['Salary'])))sns.distplot(sc_X['Salary'],ax=axes[1,2])axes[1,2].set_title('StandardScaler:Salary')axes[1,2].set_title('标准化方差:%s'%(statistics.stdev(sc_X['Salary'])))可以看出归一化产生的标准偏差小于标准化方法产生的标准偏差。如果使用归一化来缩放数据,数据将更加集中在均值周围。这是因为normalizedscaling被“拉平”并统一到区间(仅由极值决定),而standardizedscaling更“弹性”和“动态”,与整体样本的分布有很大关系.所以归一化不能很好地处理异常值,而归一化对异常值具有鲁棒性,并且在许多情况下,它优于归一化。参考:https://towardsdatascience.co...
