机器学习经典模型简单使用及归一化(标准化)影响测试

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

实验

数据集

这次用到的数据集是跟火电厂有关的,都是匿名特征,数据量为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_split
test_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 stats
dict_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,Ridge
from sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScaler
from sklearn.metrics import mean_squared_error as mse
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
import 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.736200563088036
ridge: 3.264150764935616
svr: 3.505799850945091
RF: 0.24087179220636037
bst: 0.9945862722591914

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

实验结果及原因分析

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

通过对比,可以发现,

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

原文地址:https://www.cnblogs.com/csu-lmw/p/9964855.html

时间: 2024-07-31 06:15:41

机器学习经典模型简单使用及归一化(标准化)影响测试的相关文章

机器学习经典算法详解及Python实现--CART分类决策树、回归树和模型树

摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree),本文介绍了CART用于离散标签分类决策和连续特征回归时的原理.决策树创建过程分析了信息混乱度度量Gini指数.连续和离散特征的特殊处理.连续和离散特征共存时函数的特殊处理和后剪枝:用于回归时则介绍了回归树和模型树的原理.适用场景和创建过程.个人认为,回归树和模型树

机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用

摘要: 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类.总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型:当各特征相关性较小时,朴素贝叶斯分类性能最为良好.另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算.本文详述了朴素贝叶斯分类的统计学

机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法

(一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測,如前面讲过的KNN.决策树.朴素贝叶斯.adaboost.SVM.Logistic回归都是分类算法.回归算法用于连续型分布预測.针对的是数值型的样本,使用回归.能够在给定输入的时候预測出一个数值.这是对分类方法的提升,由于这样能够预測连续型数据而不不过离散的类别标签. 回归的目的就是建立一个回归方程

机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离近期的邻居进行分类推断(投票法)或者回归.假设K=1.那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习.数据都有明白的label(分类针对离散分布,回归针对连续分布),依据机器学习产

机器学习经典算法详解及Python实现--聚类及K均值、二分K-均值聚类算法

摘要 聚类是一种无监督的学习(无监督学习不依赖预先定义的类或带类标记的训练实例),它将相似的对象归到同一个簇中,它是观察式学习,而非示例式的学习,有点像全自动分类.说白了,聚类(clustering)是完全可以按字面意思来理解的--将相同.相似.相近.相关的对象实例聚成一类的过程.机器学习中常见的聚类算法包括 k-Means算法.期望最大化算法(Expectation Maximization,EM,参考"EM算法原理").谱聚类算法(参考机器学习算法复习-谱聚类)以及人工神经网络算法

机器学习经典算法详解及Python实现--线性回归(Linear Regression)算法

(一)认识回归 回归是统计学中最有力的工具之一.机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型.连续性而定义的.顾名思义,分类算法用于离散型分布预测,如前面讲过的KNN.决策树.朴素贝叶斯.adaboost.SVM.Logistic回归都是分类算法:回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签. 回归的目的就是建立一个回归方程用来预测目

Pyhon3实现机器学习经典算法(一)KNN

一.KNN概述 K-(最)近邻算法KNN(k-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一.它具有精度高.对异常值不敏感的优点,适合用来处理离散的数值型数据,但是它具有 非常高的计算复杂度和空间复杂度,需要大量的计算(距离计算). 它的工作原理是:如果已经给定一个带有标签(分类)的数据集(训练集),对于每一个给定的没有标签(分类)的新向量,通过计算该向量与训练集中的每一个向量的距离, 选择前k个最小的距离,在k个距离中出现次数最多的标签(分类)则是新向量的标签(分类).

为什么要做特征归一化/标准化?

目录 写在前面 常用feature scaling方法 计算方式上对比分析 feature scaling 需要还是不需要 什么时候需要feature scaling? 什么时候不需要Feature Scaling? 小结 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 Feature scaling,常见的提法有"特征归一化"."标准化",是数据预处理中的重要技术,有时甚至决定了算法能不能work以及work得好不好.谈到feat

机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.