本文研究数值型数据的预测。葡萄酒酿造是一个充满挑战和竞争力的行业,他为巨大的利润提供了可能。然而,也有诸多因素有助于提升一个葡萄酒酿造厂的盈利能力。作为一种农产品,有包括天气和生长环境在内的多个变量影响特定品种的葡萄酒酿造的酒的质量。装瓶和生产同样会影响风味,是更好还是更差。甚至产品进入市场的方式,从瓶身的设计到零售价,都会影响顾客的味道感受。
如今,机器学习已经用来发现来自不同地区的葡萄酒化学成分的主要差异,或者用来确定葡萄酒味道更甜的化学因素。
我们使用葡萄牙的白色Vinho Verde案例,数据来源于UCI机器学习数据仓库,数据包含4898个葡萄酒案例的11种化学特性的信息。实验室分析测量的特性包括酸性、含糖量、氯化物含量、硫的含量、酒精度、pH值和密度。另外,样本由不少于3名鉴定者组成的小组以盲品的方式进行评级,质量尺度从0(很差)到10(极好)。如果鉴定者对于评级没有达成一致意见,就会使用中间值。
Data preparation
读取葡萄酒数据:
wine = read.table("./whitewines.csv",header = T,sep = ";")
wine数据包含11个特征,且所有特征都是数值型的,并且没有缺失值:
str(wine)
## 'data.frame': 4898 obs. of 12 variables:
## $ fixed.acidity : num 7 6.3 8.1 7.2 7.2 8.1 6.2 7 6.3 8.1 ...
## $ volatile.acidity : num 0.27 0.3 0.28 0.23 0.23 0.28 0.32 0.27 0.3 0.22 ...
## $ citric.acid : num 0.36 0.34 0.4 0.32 0.32 0.4 0.16 0.36 0.34 0.43 ...
## $ residual.sugar : num 20.7 1.6 6.9 8.5 8.5 6.9 7 20.7 1.6 1.5 ...
## $ chlorides : num 0.045 0.049 0.05 0.058 0.058 0.05 0.045 0.045 0.049 0.044 ...
## $ free.sulfur.dioxide : num 45 14 30 47 47 30 30 45 14 28 ...
## $ total.sulfur.dioxide: num 170 132 97 186 186 97 136 170 132 129 ...
## $ density : num 1.001 0.994 0.995 0.996 0.996 ...
## $ pH : num 3 3.3 3.26 3.19 3.19 3.26 3.18 3 3.3 3.22 ...
## $ sulphates : num 0.45 0.49 0.44 0.4 0.4 0.44 0.47 0.45 0.49 0.45 ...
## $ alcohol : num 8.8 9.5 10.1 9.9 9.9 10.1 9.6 8.8 9.5 11 ...
## $ quality : int 6 6 6 6 6 6 6 6 6 6 ...
sum(complete.cases(wine))
## [1] 4898
分割原始数据,得到训练集和测试集:
set.seed(1234)
index <- sample(nrow(wine),round(0.7*nrow(wine)),replace = F)
train <- wine[index, ]
test <- wine[-index, ]
Multiple regression(多元回归)
多元线性回归研究多个自变量与因变量的线性关系,并且假设因变量是连续的。
多元线性回归的优点和缺点如下表所示:
优点 | 缺点 |
---|---|
* 迄今为止。它是数值型建模最常用的方法 | * 对数据做出很强的假设 |
* 可适用于几乎所有的数据 | * 不能很好的处理缺失数据 |
* 提供了特征(变量)与结果之间关系的强 | * 对于因子型变量需要额外的处理 |
度与大小的估计 | * 需要一些统计知识来理解模型 |
R中使用stas添加包中的lm()函数拟合训练数据:
m.multi <- lm(quality ~ .,data = train)
summary(m.multi)
##
## Call:
## lm(formula = quality ~ ., data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.7170 -0.4930 -0.0282 0.4690 2.8018
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.329e+02 2.109e+01 6.300 3.35e-10 ***
## fixed.acidity 4.767e-02 2.409e-02 1.979 0.04793 *
## volatile.acidity -2.015e+00 1.363e-01 -14.788 < 2e-16 ***
## citric.acid 5.283e-03 1.141e-01 0.046 0.96306
## residual.sugar 7.832e-02 8.603e-03 9.105 < 2e-16 ***
## chlorides -5.581e-01 6.480e-01 -0.861 0.38920
## free.sulfur.dioxide 3.007e-03 1.001e-03 3.005 0.00267 **
## total.sulfur.dioxide 4.236e-05 4.519e-04 0.094 0.92532
## density -1.325e+02 2.140e+01 -6.194 6.57e-10 ***
## pH 5.423e-01 1.246e-01 4.354 1.37e-05 ***
## sulphates 5.916e-01 1.184e-01 4.998 6.09e-07 ***
## alcohol 2.263e-01 2.729e-02 8.292 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.75 on 3417 degrees of freedom
## Multiple R-squared: 0.2915, Adjusted R-squared: 0.2892
## F-statistic: 127.8 on 11 and 3417 DF, p-value: < 2.2e-16
使用前向分步法得到最终模型:
m.multi <-step(m.multi,direction = 'forward')
## Start: AIC=-1960.95
## quality ~ fixed.acidity + volatile.acidity + citric.acid + residual.sugar +
## chlorides + free.sulfur.dioxide + total.sulfur.dioxide +
## density + pH + sulphates + alcohol
预测测试集,并用平均绝对误差度量模型性能:
p.multi <- predict(m.multi,test,type = "response")
sum(abs(p.multi - test$quality))/nrow(test)
## [1] 0.5892737
Decision tree
决策树用于数值预测分为两类。第一类称为回归树(regression tree),回归树并没有使用线性回归的方法,而是基于到达叶节点的案例的平均值做出预测。第二类称为模型树(model tree),模型树和回归树以大致相同的方式生长,但是在每个叶节点,根据到达该节点的案例建立多元线性回归模型。
回归树和模型树的优点与缺点如下表:
优点 | 缺点 |
---|---|
* 将决策树的优点与对数值型数据建立模型的能力相结合 | * 需要大量的训练数据 |
* 能自动选择特征,允许该方法与大量特征一起使用 | * 可能比回归模型更难解释 |
* 不需要使用者事先制定模型 | * 难以确定单个特征对于结果 |
* 拟合某些类型的数据可能比线性回归好得多 | * 的总体净影响 |
* 不要求用统计的知识来解释模型 | * 不像线性回归那样常用 |
regression tree
rpart添加包提供了像CART(分类回归树)最可靠的回归树实现:
library(rpart)
library(rpart.plot)
m.rpart <- rpart(quality ~ .,data = train)
观察生成树的基本信息:
m.rpart
## n= 3429
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 3429 2712.82600 5.874307
## 2) alcohol< 10.85 2156 1270.07400 5.593692
## 4) volatile.acidity>=0.2525 1148 548.62720 5.348432
## 8) free.sulfur.dioxide< 17.5 168 68.70833 4.958333 *
## 9) free.sulfur.dioxide>=17.5 980 449.97040 5.415306 *
## 5) volatile.acidity< 0.2525 1008 573.74600 5.873016 *
## 3) alcohol>=10.85 1273 985.44230 6.349568
## 6) free.sulfur.dioxide< 11.5 83 93.42169 5.373494 *
## 7) free.sulfur.dioxide>=11.5 1190 807.42940 6.417647
## 14) alcohol< 12.08333 721 474.87100 6.266297 *
## 15) alcohol>=12.08333 469 290.65250 6.650320 *
可视化决策树:
rpart.plot(m.rpart,digits = 2,fallen.leaves = T,extra = 1,type = 3)
预测测试集,并用平均绝对误差度量模型性能:
p.rpart <- predict(m.rpart,test,type = "vector")
sum(abs(p.rpart - test$quality))/nrow(test)
## [1] 0.6056653
model tree
为了提高学习算法的性能,我们尝试构建一棵模型树,模型树中最先进的算法是有Wang and Witten提出的M5’算法,可以通过RWeka添加包和M5P()函数实现:
library(RWeka)
m.m5p <- M5P(quality ~ .,data = train)
与回归树的一个关键区别在于节点是以一个线性模型终止:
summary(m.m5p)
##
## === Summary ===
##
## Correlation coefficient 0.6581
## Mean absolute error 0.5262
## Root mean squared error 0.67
## Relative absolute error 77.8265 %
## Root relative squared error 75.3248 %
## Total Number of Instances 3429
预测测试集,并用平均绝对误差度量模型性能:
p.m5p <- predict(m.m5p,test)
sum(abs(p.m5p - test$quality))/nrow(test)
## [1] 0.5655924
Conclusion
最后,比较几种方法的结果:
Methods | outcome |
---|---|
Multi-regression | 0.5892737 |
regression tree | 0.6056653 |
model tree | 0.5655924 |