博客
关于我
机器学习经典模型简单使用及归一化(标准化)影响
阅读量:426 次
发布时间:2019-03-06

本文共 4014 字,大约阅读时间需要 13 分钟。

俗话说的好,不动手就永远不知道该怎么做,上次一听说要做这个的时候人都懵了,听了几次似乎都摸不到门道,这次花了几天时间去写了写,总算是摸到了点门道。

实验

数据集

这次用到的数据集是跟火电厂有关的,都是匿名特征,数据量为20160*170,做到最后发现只根据时间顺序就能做的比较好。

归一化

先来讲讲归一化。归一化也称标准化,是数据挖掘的一项基础工作,使用归一化的原因大体如下

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

MinMaxScaler

线性归一化,也称为离差标准化,是对原始数据的线性变换,min-max标准化方法的缺陷在当有新数据加入时,可能会导致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)的大小来得出结论

部分代码及结果

数据预处理

#按时间排序sort_data = data.sort_values(by = 'time',ascending = True)sort_data.reset_index(inplace = True,drop = True)target = data['T1AOMW_AV']sort_target = sort_data['T1AOMW_AV']del data['T1AOMW_AV']del sort_data['T1AOMW_AV']from sklearn.model_selection import train_test_splittest_sort_data = sort_data[16160:]test_sort_target = sort_target[16160:]_sort_data = sort_data[:16160]_sort_target = sort_target[:16160]sort_data1 = _sort_data[:(int)(len(_sort_data)*0.75)]sort_data2 = _sort_data[(int)(len(_sort_data)*0.75):]sort_target1 = _sort_target[:(int)(len(_sort_target)*0.75)]sort_target2 = _sort_target[(int)(len(_sort_target)*0.75):]import scipy.stats as statsdict_corr = {    'spearman' : [],    'pearson' : [],    'kendall' : [],    'columns' : []}for i in data.columns:    corr_pear,pval = stats.pearsonr(sort_data[i],sort_target)    corr_spear,pval = stats.spearmanr(sort_data[i],sort_target)    corr_kendall,pval = stats.kendalltau(sort_data[i],sort_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.41) & (dict_corr['spearman']>0.45) & (dict_corr['kendall']>0.29)]['columns'].values)# 选取原则,选取25%分位数 以上的相关性系数

模型测试

from sklearn.linear_model import LinearRegression,Lasso,Ridgefrom sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScalerfrom sklearn.metrics import mean_squared_error as msefrom sklearn.svm import SVRfrom sklearn.ensemble import RandomForestRegressorimport xgboost as xgb#最大最小归一化mm = MinMaxScaler()lr = Lasso(alpha=0.5)lr.fit(mm.fit_transform(sort_data1[new_fea]), sort_target1)lr_ans = lr.predict(mm.transform(sort_data2[new_fea]))print('lr:',mse(lr_ans,sort_target2))ridge = Ridge(alpha=0.5)ridge.fit(mm.fit_transform(sort_data1[new_fea]),sort_target1)ridge_ans = ridge.predict(mm.transform(sort_data2[new_fea]))print('ridge:',mse(ridge_ans,sort_target2))svr = SVR(kernel='rbf',C=100,epsilon=0.1).fit(mm.fit_transform(sort_data1[new_fea]),sort_target1)svr_ans = svr.predict(mm.transform(sort_data2[new_fea]))print('svr:',mse(svr_ans,sort_target2))estimator_RF = RandomForestRegressor().fit(mm.fit_transform(sort_data1[new_fea]),sort_target1)predict_RF = estimator_RF.predict(mm.transform(sort_data2[new_fea]))print('RF:',mse(predict_RF,sort_target2))bst = xgb.XGBRegressor(learning_rate=0.1, n_estimators=550, max_depth=4, min_child_weight=5, seed=0,subsample=0.7, colsample_bytree=0.7, gamma=0.1, reg_alpha=1, reg_lambda=1)bst.fit(mm.fit_transform(sort_data1[new_fea]),sort_target1)bst_ans = bst.predict(mm.transform(sort_data2[new_fea]))print('bst:',mse(bst_ans,sort_target2))

结果

lr: 7.736200563088036ridge: 3.264150764935616svr: 3.505799850945091RF: 0.24087179220636037bst: 0.9945862722591914

上面的这段代码测试的是最大最小归一化情况下的结果,测试其他标准化时只需要改动mm = MinMaxScaler(),这段代码即可。

实验结果及原因分析

经过多次测试,统计结果如下

通过对比,可以发现,

  • 对于Lasso模型,使用MaxAbsScaler方式时,MSE增大十分明显,且归一化后结果高于不进行归一化时(可能是数据的问题),
  • 对于Redige模型,归一化结果也明显高于不归一化时的结果。
  • 对于SVR模型,不进行归一化时,其MSE会非常大,是因为svm实质上选择的是分割两类数据最远的超平面,由于错分类造成了影响,不进行归一化会造成对平面的影响,导致得到的划分平面不准确测试集成功率低。
  • 对于RandomForest和XGBoost来说,是否进行归一化对结果影响不大。这也是树模型的一大特征。

 

转载地址:http://uywuz.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>