特征工程(一):前向逐步回归(R语言)

建模过程中,选择合适的特征集合,可以帮助控制模型复杂度,防止过拟合等问题。为了选取最佳的特征集合,可以遍历所有的列组合,找出效果最佳的集合,但这样需要大量的计算。本文介绍的前向逐步回归法是针对最小二乘法的修改。相对于要将所有组合情况遍历一遍,前向逐步回归可以大大节省计算量,选择最优的特征集合,从而解决过拟合问题。

  • 前向逐步回归

前向逐步回归的过程是:遍历属性的一列子集,选择使模型效果最好的那一列属性。接着寻找与其组合效果最好的第二列属性,而不是遍历所有的两列子集。以此类推,每次遍历时,子集都包含上一次遍历得到的最优子集。这样,每次遍历都会选择一个新的属性添加到特征集合中,直至特征集合中特征个数不能再增加。

  • 实例代码

1、数据导入并分组。导入数据,将数据集抽取70%作为训练集,剩下30%作为测试集。特征与标签分开存放。

target.url <- "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv" data <- read.csv(target.url,header = T,sep=";") #divide data into training and test sets index <- which((1:nrow(data))%%3==0) train <- data[-index,] test <- data[index,] #arrange date into list and label sets trainlist <- train[,1:11] testlist <- test[,1:11] trainlabel <- train[,12] testlabel <- test[,12]

2、前向逐步回归构建输出特征集合。通过for循环,从属性的一个子集开始进行遍历。第一次遍历时,该子集为空。每一个属性被加入子集后,通过线性回归来拟合模型,并计算在测试集上的误差,每次遍历选择得到误差最小的一列加入输出特征集合中。最终得到输出特征集合的关联索引和属性名称。

#build list of attributes one-at-a-time, starting with empty attributeList<-as.numeric() index<-1:ncol(trainlist) indexSet<-as.numeric() oosError<-as.numeric() for(i in index){ #attributes not in list already attTry<-setdiff(index,attributeList) #try each attribute not in set to see which one gives least oos error errorList<-as.numeric() attTemp<-as.numeric() for(ii in attTry){ attTemp<-append(attTemp,attributeList) attTemp<-append(attTemp,ii) xTrainTemp<-as.data.frame(trainlist[,attTemp]) xTestTemp<-as.data.frame(testlist[,attTemp]) names(xTrainTemp)<-names(trainlist[attTemp]) names(xTestTemp)<-names(testlist[attTemp]) lm.mod <- lm(trainlabel~.,data=xTrainTemp) rmsError<-rmse(testlabel,predict(lm.mod,(xTestTemp))) errorList<-append(errorList,rmsError) attTemp<-as.numeric() } iBest<-which.min(errorList) attributeList<-append(attributeList,attTry[iBest]) oosError<-append(oosError,errorList[iBest]) } cat("Best attribute indices: ", attributeList, "\n","Best attribute names: \n",names(trainlist[attributeList]))

索引与名称如下:

Best attribute indices: 11 2 10 7 6 9 1 8 4 3 5 Best attribute names: alcohol volatile.acidity sulphates total.sulfur.dioxide free.sulfur.dioxide pH fixed.acidity density residual.sugar citric.acid chlorides

属性名列表的顺序也是属性的重要性排序,了解属性重要性,可以增加模型的解释性。

3、模型效果评估。分别画出RMSE与属性个数之间的关系,前向逐步预测算法对数据预测对错误直方图,和真实标签与预测标签散点图。

plot(oosError,type = "l",xlab = "Number of Attributes",ylab = "ERMS",main = "error versus number of attributes") finaltrain<-trainlist[,attributeList[1:which.min(oosError)]] finaltest<-testlist[,attributeList[1:which.min(oosError)]] lm.finalmol<-lm(trainlabel~.,data = finaltrain) finalpre<-predict(lm.finalmol,finaltest) errorVector<-testlabel-finalpre hist(errorVector) plot(predict(lm.finalmol,finaltest),testlabel,xlab = "Predicted Taste Score",ylab = "Actual Taste Score")

从图上可以看出,使用前9个属性,误差值一直在降低,加入第十个属性后,误差值开始增加。因此,我们选取输出特征集合的前9项,作为最终的最优特征集合。从散点图上看,得分在5、6时,预测情况非常好,因为区域的颜色深度可以反映点的堆积程度,一般情况下,机器学习算法对边缘数据预测效果不好。由于真正的标签是整数,所以散点图呈水平状分布。后两张图,均可通过分析图像形态,指出模型性能提升途径。


原文发布于微信公众号 - 机器学习养成记(chenchenwings)

原文发表时间:2017-12-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海天一树

决策树

决策树是一种特殊的树形结构,一般由节点和有向边组成。其中,节点表示特征、属性或者一个类。而有向边包含有判断条件。如图所示,决策树从根节点开始延伸,经过不同的判断...

31920
来自专栏张俊红

Sklearn参数详解—GBDT

这篇介绍Boosting的第二个模型GBDT,GBDT和Adaboost都是Boosting模型的一种,但是略有不同,主要有以下两点不同:

20840
来自专栏机器之心

教程 | 基础入门:深度学习矩阵运算的概念和代码实现

选自Medium 机器之心编译 参与:蒋思源 本文从向量的概念与运算扩展到矩阵运算的概念与代码实现,对机器学习或者是深度学习的入门者提供最基础,也是最实用的教...

454130
来自专栏iOSDevLog

决策树

12040
来自专栏杨熹的专栏

神经网络 之 线性单元

本文结构: 什么是线性单元 有什么用 代码实现 ---- 1. 什么是线性单元 线性单元和感知器的区别就是在激活函数: ? 感知器的 f 是阶越函数: ? 线性...

34040
来自专栏张俊红

决策树-CART算法

总第80篇 01|前言: 本篇接着上一篇决策树详解,CART是英文“classification and regression tree”的缩写,翻译过来是分...

39450
来自专栏iOSDevLog

估计器接口小结摘自:《Python 机器学习基础教程》 第3章 无监督学习与预处理(三)

scikit-learn 中的所有算法——无论是预处理、监督学习还是无监督学习算法——都被实现为类。这些类在 scikit-learn 中叫作估计器(estim...

16120
来自专栏数值分析与有限元编程

可视化 | MATLAB划分均匀矩形网格

之前发过一个划分均匀三角形网格的例子。下面结合一个悬臂梁说说如何在规则区域划分均匀矩形网格。 ? 将一个矩形平面区域划分成相同大小的矩形。X方向等分nex,Y方...

57690
来自专栏拂晓风起

验证码去噪 分离背景 分离文字 最大类间方差

12820
来自专栏机器学习养成记

Twitter情感分析CNN+word2vec(翻译)

Rickest Ricky 对Twitter内容做了一系列的文本分析处理,并把内容整理成博文发布到:https://medium.com/@rickykim78...

27510

扫码关注云+社区

领取腾讯云代金券