您现在的位置是:网站首页> 内容页

标准化和归一化对机器学习经典模型的影响

  • 大奖手机网页版登录
  • 2019-01-15
  • 349人已阅读
简介归一化归一化也称标准化,是处理数据挖掘的一项基础工作使用归一化的原因大体如下:数据存在不同的评价指标,其量纲或量纲单位不同,处于不同的数量级。解决特征指标之间的可比性,经过归一化处理后

归一化

归一化也称标准化,是处理数据挖掘的一项基础工作使用归一化的原因大体如下:

数据存在不同的评价指标,其量纲或量纲单位不同,处于不同的数量级。解决特征指标之间的可比性,经过归一化处理后,各指标处于同一数量级,便于综合对比。求最优解的过程会变得平缓,更容易正确收敛。即能提高梯度下降求最优解时的速度。提高计算精度。适合进行综合对比评价。

MinMaxScaler

线性归一化,也称为离差标准化,是对原始数据的线性变换,MinMax标准化方法的缺陷在当有新数据加入时,可能会导致X.max和X.min的值发生变化,需要重新计算。其转换函数如下:

StandardScaler

标准差归一化,也叫Z-score标准化,这种方法给予原始数据的均值(mean,μ)和标准差(standard deviation,σ)进行数据的标准化。经过处理后的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:

MaxAbsScaler

原理与MinMaxScaler很像,只是数据会被规模化到[-11]之间。也就是特征中,所有数据都会除以最大值。这个方法对那些已经中心化均值维0或者稀疏的数据有意义。

模型

本次实验使用了5个模型,分别为Lasso、Redige、SVR、RandomForest、XGBoost。

方法:

以不同方式划分数据集和测试集使用不同的归一化(标准化)方式使用不同的模型通过比较MSE(均方误差,mean-square error)的大小来得出结论

部分代码及结果

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt#data = pd.read_csv("路径")data = data.sort_values(by="time"ascending=True)data.reset_index(inplace=Truedrop=True)target = data["T1AOMW_AV"]del data["T1AOMW_AV"]  

数据处理

   去除缺失值

# 没有缺失值All_NaN = pd.DataFrame(data.isnull().sum()).reset_index()All_NaN.columns = ["name""times"]All_NaN.describe()

  

 

所有数据中,干掉 方差小于1的属性

feature_describe_T = data.describe().Tstd_feature = feature_describe_T[feature_describe_T["std"]<1].indexfeature = [column for column in data.columns if column not in std_feature] # 筛选方差大于1的属性 data = data[feature]del data["time"]

  

test_data = data[:5000]data1 = data[5000:16060]target1 = target[5000:16060]data2 = data[16060:]target2 = target[16060:]import scipy.stats as statsdict_corr = { "spearman" : [] "pearson" : [] "kendall" : [] "columns" : []}for i in data.columns: corr_pearpval = stats.pearsonr(data[i]target) corr_spearpval = stats.spearmanr(data[i]target) corr_kendallpval = stats.kendalltau(data[i]target) dict_corr["pearson"].append(abs(corr_pear)) dict_corr["spearman"].append(abs(corr_spear)) dict_corr["kendall"].append(abs(corr_kendall)) dict_corr["columns"].append(i) # 筛选新属性 dict_corr =pd.DataFrame(dict_corr)new_fea = list(dict_corr[(dict_corr["pearson"]>0.32) & (dict_corr["spearman"]>0.48) & (dict_corr["kendall"]>0.44)]["columns"].values)# 选取原则,选取25%分位数 以上的相关性系数dict_corr.describe()len(new_fea)

 

  

各种模型的测试:

from sklearn.linear_model import LinearRegressionLassoRidgefrom sklearn.preprocessing import MinMaxScalerStandardScalerMaxAbsScalerfrom sklearn.metrics import mean_squared_error as msefrom sklearn.svm import SVRmm = MinMaxScaler()lr = Lasso(alpha=0.5)lr.fit(mm.fit_transform(data1[new_fea]) target1)lr_ans = lr.predict(mm.transform(data2[new_fea]))print("LR : " mse(lr_anstarget2) )##lrridge = Ridge(alpha=0.5)ridge.fit(mm.fit_transform(data1[new_fea])target1)ridge_ans = ridge.predict(mm.transform(data2[new_fea]))print("ridge : "mse(ridge_anstarget2 ))#ridgesvr = SVR(kernel="rbf"C=100epsilon=0.1).fit(mm.fit_transform(data1[new_fea])target1)svr_ans = svr.predict(mm.transform(data2[new_fea]))print("svr : "mse(svr_anstarget2) )#svrfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import train_test_splitX_train X_test y_train y_test = train_test_split(data[new_fea]targettest_size=0.25random_state=12345)ss = MaxAbsScaler()ss_x_train = ss.fit_transform(X_train)ss_x_test = ss.transform(X_test)estimator_lr = Lasso(alpha=0.5).fit(ss_x_trainy_train)predict_lr = estimator_lr.predict(ss_x_test)print("Lssao:"mse(predict_lry_test))estimator_rg = Ridge(alpha=0.5).fit(ss_x_trainy_train)predict_rg = estimator_rg.predict(ss_x_test)print("Ridge:"mse(predict_rgy_test))estimator_svr = SVR(kernel="rbf"C=100epsilon=0.1).fit(ss_x_trainy_train)predict_svr = estimator_svr.predict(ss_x_test)print("SVR:"mse(predict_svry_test))estimator_RF = RandomForestRegressor().fit(ss_x_trainy_train)predict_RF = estimator_RF.predict(ss_x_test)print("RF:"mse(predict_RFy_test))predict_XG = xgb.XGBRegressor(learn_rate=0.1n_estimators = 550max_depth = 4min_child_weight = 5seed=0subsample=0.7gamma=0.1reg_alpha=1reg_lambda=1)predict_XG.fit(ss_x_trainy_train)predict_XG_ans=predict_XG.predict(ss_x_test)print("predict_XG : " mse(predict_XG_ansy_test))

 结果:

 

 

 结论:

对于Lasso模型,使用MaxAbsScaler方式时,mse增大十分明显,且归一化后结果高于不进行归一化时对于Redige模型,归一化结果也明显高于不归一化时的结果对于SVR模型,不进行归一化时,其MSE会非常大对于RandomForest和XGBoost来说,是否进行归一化对结果影响不大

 

文章评论

Top