R语言之建模

模型

前言

为了帮助大家更好的使用R语言进行建模分析,本文将借助波士顿房价数据集来展示常见的模型。本章节学习的目的是帮助大家了解模型的适用范围以及如何建模,不会对模型的底层原理进行深入的研究。

  • 回归模型: 回归模型是一种有监督的、预测性的建模技术,它研究的是因变量和自变量之间的关系。

  • 分类模型: 分类模型也是一种有监督的机器学习模型。与回归模型不同的是,其标签(因变量)通常是有限个数的定类变量。最常见的是二分类模型。

我们主要使用波士顿房价数据集来实现各种模型。因此我们使用2021作为种子值生成70%的数据作为训练集,其余数据作为测试集。下面展示来各个数据集的大小。

# 导入BostonHousing数据
library(mlbench)
data(BostonHousing)
# 设置种子值,方便复现
set.seed(2021)
# 生成训练集的索引,用来划分训练集和测试集
train_index <- sample(dim(BostonHousing)[1], 0.7 * dim(BostonHousing)[1])
BostonHousingTrain <- BostonHousing[train_index, ]
BostonHousingTest <- BostonHousing[-train_index, ]
# 查看数据集的size
dim(BostonHousing)
dim(BostonHousingTrain)
dim(BostonHousingTest)
# 查看数据集包含的变量名称
names(BostonHousing)

在这里插入图片描述
##回归模型
回归模型有很多主要有Linear Regression、Polynomial Regression、Stepwise Regression、Ridge Regression、Lasso Regression、ElasticNet等。

本部分主要介绍有Linear Regression、以及Stepwise Regression三种回归模型的实现。

Linear Regression

多元线性回归是一种最为基础的回归模型,其使用多个自变量和一个因变量利用OLS完成模型训练。下面我们将使用medv作为因变量,剩余变量作为自变量构建模型。

多元线性回归模型使用lm()命令, 其中medv~.是回归公式,data=BostonHousingTrain是回归数据。对回归公式的构建进行一些补充,~左侧表示因变量,~右侧表示自变量,多个自变量使用+依次叠加。这里右侧使用了.,该符号的含义是除左侧变量外所有的变量。因此,medv~.等价于`medv~crim + zn + indus + chas + nox + rm + age + dis + rad + tax + ptratio + b + lstat。

# 构建模型,medv~.表示回归方程
lr_model <- lm(medv ~ ., data = BostonHousingTrain)
# summary输出模型汇总
summary(lr_model)

在这里插入图片描述
运用plot命令对模型进行诊断,各图含义参考 https://www.cnblogs.com/lafengdatascientist/p/5554167.html

plot(lr_model)

predict命令能够基于已经训练好的模型进行预测。

# 根据模型对新数据进行预测
BostonHousingTest$lr_pred <- predict(lr_model, newdata = BostonHousingTest)

Stepwise Regression

利用逐步回归分析可以对模型中的变量进行优化。R语言中的step()命令,是以AIC信息统计量为准则,通过选择最小的AIC信息统计量来达到提出或添加变量的目的。

对于逐步回归,一般有前向、后向、双向等逐步方式。本部分将基于已经实现的lr_model进行双向逐步回归。前向和后向回归只需要更改step()命令行中的direstion参数即可。具体内容参照 https://blog.csdn.net/qq_38204302/article/details/86567356
在这里插入图片描述

分类模型

在进行分类模型前,我们需要构建分类标签。我们使用medv的中位数进行划分,其中1表示高房价,0表示低房价。通过这样的转化将原本的数值型变量转化为二元标签。并使用相同的种子值划分测试集和训练集。

# 将连续变量转化成二分类变量
BostonHousing$medv <- as.factor(ifelse(BostonHousing$medv > median(BostonHousing$medv), 1, 0))
# 查看两种变量类别的数量
summary(BostonHousing$medv)
# 使用相同的种子值,复现训练集合测试集的划分
set.seed(2021)
train_index <- sample(dim(BostonHousing)[1], 0.7 * dim(BostonHousing)[1])
BostonHousingTrain <- BostonHousing[train_index, ]
BostonHousingTest <- BostonHousing[-train_index, ]

在这里插入图片描述
同时引入两个计算函数,用来计算AUC指标值。

# 引入auc计算函数
library("ROCR")
calcAUC <- function(predcol, outcol) {
  perf <- performance(prediction(predcol, outcol == 1), "auc")
  as.numeric(perf@y.values)
}

Logistics Regression

逻辑回归利用sigmode将线性回归结果转化成概率的形式。下面展示了利用glm()构建逻辑回归的过程。

# 逻辑回归模型构建
lr_model <- glm(medv ~ ., data = BostonHousingTrain, family = binomial(link = "logit"))
summary(lr_model)
# 分别对训练集和测试集进行预测
lr_pred_train <- predict(lr_model, newdata = BostonHousingTrain, type = "response")
lr_pred_test <- predict(lr_model, newdata = BostonHousingTest, type = "response")
# 计算训练集和测试集的auc
calcAUC(lr_pred_train, BostonHousingTrain$medv)
calcAUC(lr_pred_test, BostonHousingTest$medv)

在这里插入图片描述
在这里插入图片描述
通过计算,训练集上的auc取值为0.9554211,测试集上的auc取值为0.9506969,说明模型效果整体不错。

KNN

KNN模型是一种简单易懂、可以用于分类和回归的模型。其中 K 表示在新样本点附近(距离)选取 K 个样本数据,通过在 K 个样本进行投票来判断新增样本的类型。

KNN模型较难的一点是确定超参数K,这里使用k=25进行建模。KNN模型在测试集上的auc值为0.875784,相比于逻辑回归效果较差。

# 导入knn模型的包
library(kknn)
# 构建knn模型
knn <- kknn(medv ~ ., BostonHousingTrain, BostonHousingTest, k = 25)
# 预测并计算测试集上的auc取值
knn_pred_test <- predict(knn, newdata = BostonHousingTest)
calcAUC(as.numeric(knn_pred_test), BostonHousingTest$medv)

在这里插入图片描述

Decision Tree

决策树是一种基于树模型进行划分的分类模型,通过一系列if then决策规则的集合,将特征空间划分成有限个不相交的子区域,对于落在相同子区域的样本,决策树模型给出相同的预测值。下面构建了决策树的分类模型

# 导入包
library(tree)
# 构建决策树模型函数,medv~.是决策树公式,用来表明变量。
# summary输出模型汇总信息
dt_model <- tree(medv ~ ., BostonHousingTrain)
summary(dt_model)
# plot可以对树模型进行绘制,但可能会出现书分支过多的情况。
plot(dt_model)
text(dt_model)

在这里插入图片描述
在构建决策树模型的基础上,分别对训练集和测试集进行预测并计算auc取值。该模型在训练集上的auc取值为0.9308756,在测试集上的auc取值为0.8789199。训练集和测试集间存在抖动,说明该模型可能出现过拟合。

# 预测
dt_pred_train <- predict(dt_model, newdata = BostonHousingTrain, type = "class")
dt_pred_test <- predict(dt_model, newdata = BostonHousingTest, type = "class")
# 计算auc取值
calcAUC(as.numeric(dt_pred_train), BostonHousingTrain$medv)
calcAUC(as.numeric(dt_pred_test), BostonHousingTest$medv)

在这里插入图片描述

Random Forest

随机森林是一个包含多个决策树的分类器,可以用于分类和回归问题。在解决分类问题是,其输出的类别是由个别树输出的类别的众数而定。相比于单树模型,随机森林具有更好地泛化能力。

使用randomForest()构建模型的过程中,可以通过ntree设定随机森林中包含的决策树数量。由于随机森林是对样本和变量的随机,因此可以通过important展示变量的重要性排序。通过模型预测,随机森林模型在训练集上的auc为 0.9675499,在测试集上的auc为0.9236934。

# 导入随机森林包
library(randomForest)
# 随机森林模型
rf_model <- randomForest(medv ~ ., BostonHousingTrain, ntree = 100, nodesize = 10, importance = T)
# 展示模型变量的重要性
importance(rf_model)
# 预测
rf_pred_train <- predict(rf_model, newdata = BostonHousingTrain, type = "class")
rf_pred_test <- predict(rf_model, newdata = BostonHousingTest, type = "class")
# 计算auc取值
calcAUC(as.numeric(rf_pred_train), BostonHousingTrain$medv)
calcAUC(as.numeric(rf_pred_test), BostonHousingTest$medv)

在这里插入图片描述

参考资料

感谢Datawhale对开源学习的贡献!

  • 7
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值