机器学习——模型构建/特征筛选(2)
在R中创建模型
线性回归模型输出:
library(caret)
lm_lm <- lm(Sale_Price ~ ., data = ames)
lm_glm <- glm(Sale_Price ~ ., data = ames,
family = gaussian)
lm_caret <- train(Sale_Price ~ ., data = ames,
method = "lm")
lm()和glm()是两个不同的算法引擎,可用于拟合线性模型,caret::train()是一个元引擎(聚合器),允许应用几乎任何直接引擎与method = "<method-name>"。
使用直接引擎计算预测类概率的语法。
元引擎使您在指定输入和提取输出的方式上更加一致,但不如直接引擎灵活。
重采样方法
重采样方法提供了一种替代方法,它允许重复的将感兴趣的模型拟合到部分训练数据并测试其在其他部分上的性能。两种最常用的重采样方法包括k-fold cross validation和bootstrapping。
k-折交叉验证
k-折交叉验证(k-fold cross-validation)是一种常用于评估机器学习模型性能的技术。它将数据集分成k个子集,然后进行k轮训练和测试。在每一轮中,模型会在k-1个子集上进行训练,并在剩下的一个子集上进行测试。这个过程重复k次,每次使用不同的子集作为测试集,其余的作为训练集。最终,得到k个性能评估的平均值,这些评估通常是精度、准确率、召回率等指标。
Bootstrapping
Bootstrapping是一种统计学上的重抽样技术,用于通过从原始数据集中有放回地抽取样本来估计统计量的分布。该技术可以用于估计参数的置信区间、模型评估等。Bootstrapping的基本思想是通过对原始数据的重复采样来近似地生成大量可能的抽样分布,从而更好地了解估计量的性质。
偏差方差权衡
预测误差可以分解为两个重要的子成分:“偏差”引起的误差和“方差”引起的误差。模型最小化偏差和方差的能力之间通常存在权衡。了解不同的错误来源如何导致偏差和方差有助于我们改进数据拟合过程,从而产生更准确的模型。
偏差
偏差是我们模型的预期(或平均)预测与我们试图预测的正确值之间的差异。它衡量的是模型的预测与正确值之间的总体差距有多远,这提供了一个模型与数据底层结构的符合程度的感觉。
超参数调优
超参数(又名调整参数)是“旋转旋钮” ,用于控制机器学习算法的复杂性,从而控制偏差-方差权衡。并非所有算法都有超参数(例如,普通最小二乘法);但是,大多数至少有一个或多个。
具有不同k值的k最近邻模型k近邻模型的网格搜索结果,评估的k值范围为2-150。当k较小时,我们会看到由于高模型方差导致的高误差值,当k较大时,我们也会看到由于高模型偏差而导致的高误差值;在k = 46处找到最佳模型。
模型评价
评估模型性能的更合理方法是通过损失函数评估预测准确性。损失函数是将预测值与实际值进行比较的指标(损失函数的输出通常称为误差或伪残差). 在执行重采样方法时,我们评估验证集的预测值与实际目标值的比较。例如,在回归中,一种测量误差的方法是取给定观察值的实际值和预测值之间的差值(这是普通线性回归中残差的通常定义)。模型的整体验证误差是通过汇总整个验证数据集的误差来计算的。
回归模型
MSE:均方误差是平方误差的平均值。
RMSE:均方根误差。这只是取MSE 指标的平方根。
偏差:平均残差的缩写。本质上,它提供了模型在使用最大似然估计时解释一组数据的变化的程度。
MAE:平均绝对误差。
RMSLE:均方根对数误差
R2:这是一个流行的指标,表示可从自变量预测的因变量方差的比例。
分类模型
错误分类:这是整体错误。
Mean per class error:这是每个类的平均错误率。
MSE:均方误差。
交叉熵(又名对数损失或偏差):类似于MSE,但它包含预测概
率乘以真实类别的对数。
基尼指数:主要用于基于树的方法,通常称为纯度度量,其中较小的值表示节点主要包含来自单个类的观察值。
在应用分类模型时,我们经常使用混淆矩阵来评估某些性能指标。混淆矩阵只是一个将实际分类水平(或事件)与预测分类水平进行比较的矩阵。
准确性:总体而言,分类器正确的频率是多少?
精度:分类器预测事件的准确度如何?该指标与最大化真阳性与假阳性比率有关。
灵敏度(又名召回率):分类器对实际事件的分类准确度如何?该指标与最大化真阳性与假阴性的比率有关。
特异性:分类器对实际非事件的分类准确度如何?
示例
library(pROC)
library(plotROC)
# 创建数据
set.seed(123)
response <- rbinom(200, size = 1, prob = .5)
set.seed(123)
curve1 <- rnorm(200, mean = response, sd = .40)
set.seed(123)
curve2 <- rnorm(200, mean = response, sd = .75)
set.seed(123)
curve3 <- rnorm(200, mean = response, sd = 2.0)
df <- tibble(response, curve1, curve2, curve3)
ggplot(df) +
geom_roc(aes(d = response, m = curve1), n.cuts = 0, size = .5, color = "#1E56F9") +
geom_roc(aes(d = response, m = curve2), n.cuts = 0, size = .5, color = "#7194F9") +
geom_roc(aes(d = response, m = curve3), n.cuts = 0, size = .5, color = "#B6C7F9") +
geom_abline(lty = 'dashed') +
annotate("text", x = .48, y = .46, label = c("No better than guessing"),
vjust = 1, angle = 34) +
annotate("text", x = .3, y = .6, label = c("Ok"),
vjust = 1, angle = 33, color = "#B6C7F9") +
annotate("text", x = .20, y = .75, label = c("Better"),
vjust = 1, angle = 33, color = "#7194F9") +
annotate("text", x = .10, y = .96, label = c("Best"),
vjust = 1, angle = 33, color = "#1E56F9") +
xlab("False positive rate") +
ylab("True positive rate")
整合流程
为了说明此过程如何通过R 代码协同工作,让我们对住房数据进行简单评估
1.重采样方法:我们使用10-fold CV 重复5 次。
-
网格搜索:我们指定要评估的超参数值(k=2个,3个,4个,…,25).
-
模型训练和验证:我们使用预先指定的重采样过程( )、网格搜索( ) 和首选损失函数( ) 训练k最近邻( ) 模型。
示例
set.seed(123)
split <- initial_split(ames, prop = 0.7, strata = "Sale_Price")
ames_train <- training(split)
ames_test <- testing(split)
# 指定重采样策略
library(caret)
cv <- trainControl(
method = "repeatedcv",
number = 10,
repeats = 5
)
# 创建超参数值网格
hyper_grid <- expand.grid(k = seq(2, 25, by = 1))
# 使用网格搜索调整 knn 模型
knn_fit <- train(
Sale_Price ~ .,
data = ames_train,
method = "knn",
trControl = cv,
tuneGrid = hyper_grid,
metric = "RMSE"
)
knn_fit
ggplot(knn_fit)
Ames数据评估k 值范围为2-25 的k 最近邻模型的网格搜索结果
分享此片推文即可获取代码