在数据分析领域,模型的构建和验证是一个复杂的过程。曾参与一个模型的构建,虽然贡献不大,但对数据的图形化展示感到非常兴奋。尝试验证了模型的所有假设,最终在700个数据点上构建了5个简单的回归模型。整个练习复杂到足以让任何智商水平的人感到困惑。如今,当回顾那些建立在数百万观察值之上,背后运用复杂统计学的模型时,意识到机器学习与高级工具(如SAS、SPSS、R)的使用让工作变得多么简单。
数据集“鸢尾花”提供了50朵每种鸢尾花的萼片长度和宽度以及花瓣长度和宽度的测量值,分别以厘米为单位。数据集包含150个案例(行)和5个变量(列):萼片长度、萼片宽度、花瓣长度、花瓣宽度和物种。目标是基于4个花的特征变量来预测物种。
首先,将数据集加载到R中,然后查看一些关键统计数据。可以使用以下代码来实现:
data(iris)
# 查看数据集
summary(iris)
# 可视化数据集
qplot(Petal.Length, Petal.Width, colour=Species, data=iris)
三个物种似乎彼此分离得很好。预测边界案例的准确性决定了模型的预测能力。在这种情况下,将安装两个有用的包来制作CART模型。
library(rpart)
library(caret)
加载库后,将人群分为两组:训练和验证。这样做是为了确保不会过度拟合模型。在这种情况下,使用50-50的比例来划分训练和验证。通常,保持训练更重,以确保捕捉到关键特征。可以使用以下代码来实现这种划分。
train.flag <- createDataPartition(y=iris$Species, p=0.5, list=FALSE)
training <- iris[train.flag,]
Validation <- iris[-train.flag,]
一旦有了这两组数据,并且对数据有了基本的了解,现在就构建一个CART模型。使用了“caret”和“rpart”包来构建这个模型。然而,CART模型的传统表示在R上并不具有图形吸引力。因此,使用了一个名为“rattle”的包来构建这个决策树。“Rattle”构建的树更精美、更清晰,可以轻松解释。使用以下代码构建树并图形化检查这个树:
modfit <- train(Species~., method="rpart", data=training)
library(rattle)
fancyRpartPlot(modfit$finalModel)
现在,需要检查刚刚构建的CART模型的预测能力。在这里,以不匹配率(即树中的错误分类数量)作为决策标准。使用以下代码来实现相同的目标:
train.cart <- predict(modfit, newdata=training)
table(train.cart, training$Species)
# 错误分类率 = 3/75
在75个观察值中,只有3个错误分类,表明了良好的预测能力。通常,错误分类率低于30%的模型被认为是好模型。但是,好模型的范围取决于行业和问题的性质。一旦构建了模型,将在同一组数据上验证它。这样做是为了确保没有过度拟合模型。如果确实过度拟合了模型,验证将显示出预测能力的急剧下降。还建议对模型进行时间外验证。这将确保模型不是时间依赖的。例如,在节日期间构建的模型可能在常规时间不适用。为了简单起见,只进行时间内验证。使用以下代码进行时间内验证:
pred.cart <- predict(modfit, newdata=Validation)
table(pred.cart, Validation$Species)
# 错误分类率 = 4/75
从上述计算中,可以看到与训练相比,验证中的预测能力有所下降。这在大多数情况下通常是正确的。原因是,模型是在训练数据集上训练的,并且只是叠加在验证训练集上。但是,如果验证的预测能力低于或高于训练,这并不重要。需要检查的是它们是否足够接近。在这种情况下,确实看到错误分类率非常接近。因此,在这个案例研究中看到了一个稳定的CART模型。
现在,让尝试可视化预测错误的案例。以下是用来找到相同结果的代码:
correct <- pred.cart == Validation$Species
qplot(Petal.Length, Petal.Width, colour=correct, data=Validation)
从图表中,可以看到预测错误的实际上是那些边界案例。已经讨论过,这些案例对于模型的比较至关重要。大多数模型都能够对彼此远离的观察值进行分类。需要一个模型足够敏锐,以区分这些边界案例。
在下一篇文章中,将使用随机森林算法解决相同的问题。希望随机森林能够为这些边界案例做出更好的预测。但是,永远不能概括CART和随机森林之间,或者任何预测算法的预测能力顺序。每个模型都有自己的优势。随机森林通常在训练人群中具有非常高的准确性,因为它使用许多不同的特征进行预测。但是,由于同样的原因,它有时会在数据上过度拟合模型。将在下一篇文章中图形化地看到这些观察结果,并更详细地讨论随机森林或CART成为更好预测模型的场景。
是否觉得这篇文章有用?这篇文章是否解决了任何疑问?是否在任何项目中比较过这两种模型?如果这样做了,请与分享对这个话题的想法。