歸一化
歸一化也稱標准化,是處理數據挖掘的一項基礎工作,使用歸一化的原因大體如下:
數據存在不同的評價指標,其量綱或量綱單位不同,處於不同的數量級。解決特征指標之間的可比性,經過歸一化處理后,各指標處於同一數量級,便於綜合對比。求最優解的過程會變得平緩,更容易正確收斂。即能提高梯度下降求最優解時的速度。提高計算精度。適合進行綜合對比評價。
MinMaxScaler
線性歸一化,也稱為離差標准化,是對原始數據的線性變換,MinMax標准化方法的缺陷在當有新數據加入時,可能會導致X.max和X.min的值發生變化,需要重新計算。其轉換函數如下:
StandardScaler
標准差歸一化,也叫Z-score標准化,這種方法給予原始數據的均值(mean,μ)和標准差(standard deviation,σ)進行數據的標准化。經過處理后的數據符合標准正態分布,即均值為0,標准差為1,轉化函數為:
MaxAbsScaler
原理與MinMaxScaler很像,只是數據會被規模化到[-1,1]之間。也就是特征中,所有數據都會除以最大值。這個方法對那些已經中心化均值維0或者稀疏的數據有意義。
模型
本次實驗使用了5個模型,分別為Lasso、Redige、SVR、RandomForest、XGBoost。
方法:
- 以不同方式划分數據集和測試集
- 使用不同的歸一化(標准化)方式
- 使用不同的模型
- 通過比較MSE(均方誤差,mean-square error)的大小來得出結論
部分代碼及結果

1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 5 #data = pd.read_csv('路徑') 6 7 data = data.sort_values(by='time',ascending=True) 8 data.reset_index(inplace=True,drop=True) 9 10 target = data['T1AOMW_AV'] 11 del data['T1AOMW_AV'] 12
數據處理:
去除缺失值

1 # 沒有缺失值 2 All_NaN = pd.DataFrame(data.isnull().sum()).reset_index() 3 All_NaN.columns = ['name','times'] 4 All_NaN.describe()
所有數據中,干掉 方差小於1的屬性

1 feature_describe_T = data.describe().T 2 std_feature = feature_describe_T[feature_describe_T['std']<1].index 3 feature = [column for column in data.columns if column not in std_feature] # 篩選方差大於1的屬性 4 data = data[feature] 5 6 del data['time']

1 test_data = data[:5000] 2 3 data1 = data[5000:16060] 4 target1 = target[5000:16060] 5 data2 = data[16060:] 6 target2 = target[16060:] 7 8 import scipy.stats as stats 9 dict_corr = { 10 'spearman' : [], 11 'pearson' : [], 12 'kendall' : [], 13 'columns' : [] 14 } 15 16 for i in data.columns: 17 corr_pear,pval = stats.pearsonr(data[i],target) 18 corr_spear,pval = stats.spearmanr(data[i],target) 19 corr_kendall,pval = stats.kendalltau(data[i],target) 20 21 dict_corr['pearson'].append(abs(corr_pear)) 22 dict_corr['spearman'].append(abs(corr_spear)) 23 dict_corr['kendall'].append(abs(corr_kendall)) 24 25 dict_corr['columns'].append(i) 26 27 # 篩選新屬性 28 dict_corr =pd.DataFrame(dict_corr) 29 new_fea = list(dict_corr[(dict_corr['pearson']>0.32) & (dict_corr['spearman']>0.48) & (dict_corr['kendall']>0.44)]['columns'].values) 30 # 選取原則,選取25%分位數 以上的相關性系數 31 dict_corr.describe() 32 len(new_fea)
各種模型的測試:

1 from sklearn.linear_model import LinearRegression,Lasso,Ridge 2 from sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScaler 3 from sklearn.metrics import mean_squared_error as mse 4 from sklearn.svm import SVR 5 6 mm = MinMaxScaler() 7 lr = Lasso(alpha=0.5) 8 9 lr.fit(mm.fit_transform(data1[new_fea]), target1) 10 lr_ans = lr.predict(mm.transform(data2[new_fea])) 11 12 print("LR : ", mse(lr_ans,target2) )##lr 13 ridge = Ridge(alpha=0.5) 14 ridge.fit(mm.fit_transform(data1[new_fea]),target1) 15 ridge_ans = ridge.predict(mm.transform(data2[new_fea])) 16 17 print("ridge : ",mse(ridge_ans,target2 ))#ridge 18 svr = SVR(kernel='rbf',C=100,epsilon=0.1).fit(mm.fit_transform(data1[new_fea]),target1) 19 svr_ans = svr.predict(mm.transform(data2[new_fea])) 20 print("svr : ",mse(svr_ans,target2) )#svr 21 from sklearn.ensemble import RandomForestRegressor 22 from sklearn.model_selection import train_test_split 23 X_train, X_test, y_train, y_test = train_test_split(data[new_fea],target,test_size=0.25,random_state=12345) 24 25 ss = MaxAbsScaler() 26 ss_x_train = ss.fit_transform(X_train) 27 ss_x_test = ss.transform(X_test) 28 29 estimator_lr = Lasso(alpha=0.5).fit(ss_x_train,y_train) 30 predict_lr = estimator_lr.predict(ss_x_test) 31 print('Lssao:',mse(predict_lr,y_test)) 32 33 estimator_rg = Ridge(alpha=0.5).fit(ss_x_train,y_train) 34 predict_rg = estimator_rg.predict(ss_x_test) 35 print('Ridge:',mse(predict_rg,y_test)) 36 37 estimator_svr = SVR(kernel='rbf',C=100,epsilon=0.1).fit(ss_x_train,y_train) 38 predict_svr = estimator_svr.predict(ss_x_test) 39 print('SVR:',mse(predict_svr,y_test)) 40 41 estimator_RF = RandomForestRegressor().fit(ss_x_train,y_train) 42 predict_RF = estimator_RF.predict(ss_x_test) 43 print('RF:',mse(predict_RF,y_test)) 44 45 predict_XG = xgb.XGBRegressor(learn_rate=0.1,n_estimators = 550,max_depth = 4,min_child_weight = 5,seed=0,subsample=0.7,gamma=0.1,reg_alpha=1,reg_lambda=1) 46 predict_XG.fit(ss_x_train,y_train) 47 predict_XG_ans=predict_XG.predict(ss_x_test) 48 print("predict_XG : ", mse(predict_XG_ans,y_test)) 49 50 結果:
結論:
- 對於Lasso模型,使用MaxAbsScaler方式時,mse增大十分明顯,且歸一化后結果高於不進行歸一化時;
- 對於Redige模型,歸一化結果也明顯高於不歸一化時的結果;
- 對於SVR模型,不進行歸一化時,其MSE會非常大;
- 對於RandomForest和XGBoost來說,是否進行歸一化對結果影響不大;