# 特征工程(一):前向逐步回归(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")

52 篇文章29 人订阅

0 条评论

## 相关文章

31920

20840

454130

12040

34040

39450

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

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

16120

57690

12820