归一化也称标准化, 是处理数据挖掘的一项基础工作, 使用归一化的原因大体如下:
数据存在不同的评价指标, 其量纲或量纲单位不同, 处于不同的数量级. 解决特征指标之间的可比性, 经过归一化处理后, 各指标处于同一数量级, 便于综合对比. 求最优解的过程会变得平缓, 更容易正确收敛. 即能提高梯度下降求最优解时的速度. 提高计算精度. 适合进行综合对比评价.
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)的大小来得出结论
部分代码及结果
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- #data = pd.read_csv('路径')
- data = data.sort_values(by='time',ascending=True)
- data.reset_index(inplace=True,drop=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().T
- std_feature = feature_describe_T[feature_describe_T['std']<1].index
- feature = [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 stats
- dict_corr = {
- 'spearman' : [],
- 'pearson' : [],
- 'kendall' : [],
- 'columns' : []
- }
- for i in data.columns:
- corr_pear,pval = stats.pearsonr(data[i],target)
- corr_spear,pval = stats.spearmanr(data[i],target)
- corr_kendall,pval = 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 LinearRegression,Lasso,Ridge
- from sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScaler
- from sklearn.metrics import mean_squared_error as mse
- from sklearn.svm import SVR
- mm = 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_ans,target2) )##lr
- ridge = 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_ans,target2 ))#ridge
- svr = SVR(kernel='rbf',C=100,epsilon=0.1).fit(mm.fit_transform(data1[new_fea]),target1)
- svr_ans = svr.predict(mm.transform(data2[new_fea]))
- print("svr :",mse(svr_ans,target2) )#svr
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.model_selection import train_test_split
- X_train, X_test, y_train, y_test = train_test_split(data[new_fea],target,test_size=0.25,random_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_train,y_train)
- predict_lr = estimator_lr.predict(ss_x_test)
- print('Lssao:',mse(predict_lr,y_test))
- estimator_rg = Ridge(alpha=0.5).fit(ss_x_train,y_train)
- predict_rg = estimator_rg.predict(ss_x_test)
- print('Ridge:',mse(predict_rg,y_test))
- estimator_svr = SVR(kernel='rbf',C=100,epsilon=0.1).fit(ss_x_train,y_train)
- predict_svr = estimator_svr.predict(ss_x_test)
- print('SVR:',mse(predict_svr,y_test))
- estimator_RF = RandomForestRegressor().fit(ss_x_train,y_train)
- predict_RF = estimator_RF.predict(ss_x_test)
- print('RF:',mse(predict_RF,y_test))
- 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)
- predict_XG.fit(ss_x_train,y_train)
- predict_XG_ans=predict_XG.predict(ss_x_test)
- print("predict_XG :", mse(predict_XG_ans,y_test))
结果:
结论:
对于 Lasso 模型, 使用 MaxAbsScaler 方式时, mse 增大十分明显, 且归一化后结果高于不进行归一化时;
对于 Redige 模型, 归一化结果也明显高于不归一化时的结果;
对于 SVR 模型, 不进行归一化时, 其 MSE 会非常大;
对于 RandomForest 和 XGBoost 来说, 是否进行归一化对结果影响不大;
来源: https://www.cnblogs.com/songorz/p/9966397.html