新2备用网址 新2备用网址 新2备用网址

机器学习 | 使用 LASSO 回归构建您喜欢的模型

对于医生来说,如果有一些“特定功能”来预测患者是否会有未知的结果,那么许多医疗实践或临床决策的模式都会改变。在临床实践中,我们几乎每天都能听到这样的感叹:“如果我能提前知道,我当然不会去做!”。举个简单的例子,如果我们能预测出一个患有恶性肿瘤的病人会对某种化疗药物产生耐药性,那么我们就不会选择给病人用药;如果我们能够预测到患者在手术过程中可能会出现大量出血,那么我们将谨慎行事,并为患者提供充足的血液制品;如果我们能够预测高脂血症患者不会从某些降脂药物中受益,我们就可以避免许多无意义的医疗干预。

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码_股票 预测 模型

作为评估风险和收益的定量工具,临床预测模型正变得越来越普遍,因为它们可以为医生、患者和健康管理者的决策提供更客观和准确的信息。在这种刚性需求下,临床预测模型的研究方兴未艾。

随着数据的维度和深度不断变得复杂,临床研究的变量选择变得越来越困难。在当前的研究背景和研究趋势下,从临床医生的角度来看,目前的临床预测模型研究分为三种类型。

(1)利用传统的临床特征、病理特征、体检结果和实验室检查结果建立临床预测模型。因为预测因子在临床实践中很容易获得,所以这种类型的模型比其他两种类型更可行。

(2)随着放射组学研究方法的发展,越来越多的研究人员意识到图像的某些表现形式或参数可以代表特定的生物学特征。利用这些众多的成像参数,无论是彩色多普勒超声、CT、MR还是PET参数,结合临床特征构建临床预测模型,往往可以进一步提高预测模型的准确性。该类模型需要基于筛选放射组学,因此准备工作量远大于第一类,放射组学参数比临床特征丰富。

(3)随着高通量生物技术(如基因组学和蛋白质组学)的广泛应用,临床研究人员正试图从这些海量的生物信息中挖掘生物标志物特征来构建临床预测模型。这种预测模型是基础医学进入临床医学的一个很好的切入点。如TCGA和GEO中的大量组学数据。

股票 预测 模型_基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码

由于第二类和第三类模型中存在大量与“组学”相关的特征,因此变量选择非常困难。很难使用传统的变量选择方法。那么,有没有更好的解决方案?答案是肯定的。本节介绍的正则化方法是解决方案之一。正则化可以限制回归系数,甚至将它们减少到零。现在,有很多算法或算法组合可以用来实现正则化。在本节中,我们将关注 LASSO 回归。

背景知识

LASSO的全称是Least absolute shrinkage and selection operator。为了理解 Lasso 回归,首先我们需要了解什么叫做正则化。首先,一般线性模型是 Y = β0 + β1X1 + … + βnXn + e,最佳拟合试图最小化残差平方和 (RSS)。RSS 是实际数字与估计数字之差的平方和,可以表示为 e12 + e22 + … + en2。我们可以使用正则化在 RSS 最小化过程中添加一个新参数,称为收缩惩罚项。惩罚项包含 λ 和 β 系数和权重的归一化结果。不同的正则化技术有不同的权重归一化方法。简而言之,我们将模型中的 RSS 替换为 RSS + λ(归一化系数)。我们选择λ,这在建模中称为调整参数。如果 λ=0,则模型等效于最小二乘法 (OLS),因为所有归一化项都是偏移的。

正则化有什么好处?首先,正则化方法的计算效率非常高。如果我们使用正则化方法,我们只需要为每个 λ 拟合一个模型,因此效率会大大提高。第二个是偏差/方差权衡。在线性模型中,因变量和预测变量之间的关系接近线性,最小二乘估计几乎是无偏的,但可能具有高方差,这意味着训练集的微小变化可能导致最小二乘系数估计大变化。正则化可以适当地选择一个合适的λ来优化偏差/方差的权衡临床预测模型代码临床预测模型代码,从而提高回归模型的适应度。最后,系数的正则化也可用于解决由多重共线性引起的过度拟合。所谓的正则化,通俗地说,就是用某种形式的全纯参数来表示平面不可约代数曲线。这里我简单画一个参考图。

股票 预测 模型_基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码

对于同一组数据,我们可以有不同的拟合方法,那么哪种拟合方法可以满足我们的实际情况呢?也就是说,它既不会太粗糙,也不会太精细。把图转换成公式就是让θ3和θ4更小,这样就接近我们之间的模型了。

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码_股票 预测 模型

为了解决这个问题,数学家引入了参数 lambda,它定义了模型的惩罚项

股票 预测 模型_临床预测模型代码_基于隐马尔可夫模型和计算智能的股票价格时间序列预测

这很复杂,不是吗?为了简化它,

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_股票 预测 模型_临床预测模型代码

这个等式是不是很眼熟?我研究过|x| + |y| = 1 在高中数学中,J0 的求解过程可以表示为

股票 预测 模型_临床预测模型代码_基于隐马尔可夫模型和计算智能的股票价格时间序列预测

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_股票 预测 模型_临床预测模型代码

Lasso回归可以使某些特征的系数变小,甚至可以使某些绝对值较小的系数直接变为0,从而增强模型的泛化能力。对于高维特征数据,特别是线性关系稀疏的情况下,使用Lasso回归,或者在一堆特征中寻找主要特征,那么Lasso回归是首选。好了,关于基本的背景,我们先讲到这里。如果你还是不明白上面的“天书”,别着急,记住一件事:什么时候用 Lasso?当您有太多变量可供选择时!

示例钻

说了这么多,接下来就是大家最关心的部分了。如何将 Lasso 回归应用于您自己的数据?下面就带大家来操作吧!首先加载我们的数据:

这是来自威斯康星医院的 MASS 包中的乳腺癌活检数据。本研究的目的是确定活检结果是良性还是恶性。研究人员使用细针抽吸 (FNA) 收集样本并进行活检以确定诊断(恶性或良性)。我们的任务是开发最准确的预测模型来确定肿瘤的性质。该数据集包含来自 699 名患者的组织样本,并存储在具有 11 个变量的数据框中。此数据框包含以下列:

ID 样品编号(不唯一).V1 团块厚度.V2 细胞大小均匀性.V3 细胞形状均匀性.V4 边缘粘附.V5 单上皮细胞大小.V6 裸核(16 个值缺失).V7 乏味染色质.V8 正常核仁。V9 有丝分裂。分类“良性”或“恶性”。

好了,了解了我们的实例数据之后,接下来就是开始我们的操作了。第一步始终是读入数据并验证数据。然后,我们进入教程的关键部分,对数据进行分段。我们的数据集中有 699 个样本。我们需要将其随机分为训练集和测试集。一般样本比例为2:1,即用2/3的患者进行训练,训练出准确的模型。,剩下的 1/3 患者用于测试,以验证我们的模型是否可靠。拆分数据的代码如下,整个过程是随机的:

1# 分割数据
2set.seed(123)
3ind <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
4
5# 训练集
6train <- data[ind==1, ] #the training data set
7# 测试集
8test <- data[ind==2, ] #the test data set

分配完样本(即数据行)后,下一步就是分配收集到的信息(即数据列)。在我们的测试数据中,前面的V1-V9是采集到的样本信息,最后一列是我们的诊断,也就是良恶性肿瘤。接下来,我们将样本信息与样本诊断分开:

1# Convert data to generate input matrices and labels:
2# x相当于临床信息

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码_股票 预测 模型

3x <- as.matrix(train[, 1:9]) 4# y是临床结局 5y <- train[, 10]

首先,我们尝试进行 K 折交叉验证。λ 值是使用 glmnet 包中的 cv.glmnet() 估计的,glmnet 默认使用 10 折交叉验证。所谓K-fold cross-validation就是把数据分成k个相同的子集(folded subsets),每次用k-1个子集拟合模型,然后用剩下的子集作为测试集,最后用k个结果. 组合(通常是平均值)以确定最终参数。在这种方法中,每个子集仅用作测试集一次。在 glmnet 包中使用 K-fold 交叉验证非常容易。结果包括每个对应的 MSE 值和对应的 λ。这里我们将训练集的k值设置为5,做5折交叉验证,也是常用的。

1# 5-fold交叉验证,找出最佳lambda值
2fitCV <- cv.glmnet(x, y, family = "binomial",
3                   type.measure = "class",
4                   nfolds = 5)
5plot(fitCV)

临床预测模型代码_基于隐马尔可夫模型和计算智能的股票价格时间序列预测_股票 预测 模型

上图称为 CV 图,与 glmnet 中的其他图有很大不同,它显示了 λ 的对数与均方误差和模型中的变量个数之间的关系。图中的两条垂直虚线表示最小均方误差的对数λ(左虚线)和最小距离的标准误差的对数λ(右虚线)。如果存在过拟合问题,从最小值到标准误差位置的距离是解决问题的一个很好的起点。可以看出,我们可以选择两个lambda值,具体的lambda值取决于我们自己的实验设计。lambda.min 是最优值,而 lambda.1se 是双 SE 内更紧凑的模型。这也涉及临床模型的一个非常重要的考虑因素。是选择准确率高但复杂的模型,还是放弃部分准确率,选择变量少、更有可能具有应用价值的模型?在这个例子中,我们选择了最好的 lambda 值。然后让我们看看随着 lambda 值的变化,每个观测值的系数趋势。

1# check the coef
2fit <- glmnet(x, y, family = "binomial", alpha = 1) # make sure alpha = 1
3plot(fit, xvar="lambda",label = TRUE)
4abline(v = log(lambda.min,10), lty = 3,
5       lwd = 2,
6       col = "black")

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码_股票 预测 模型

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_临床预测模型代码_股票 预测 模型

该图表明,随着 λ 的减小,压缩参数减小,系数的绝对值增大。文章中应该如何描述这个模型?让我们输出系数:

1# get the coef
2coef.min = coef(fitCV, s = "lambda.min") 
3coef.min

然后生成每个变量对应的系数,我们也可以用这个系数来描述模型。

股票 预测 模型_临床预测模型代码_基于隐马尔可夫模型和计算智能的股票价格时间序列预测

好了,模型搭建好了,接下来就是检查模型是否能在测试数据中表现出更好的性能。我们分别在训练集和测试集上进行测试,然后用 ROC 曲线来描述模型的统计功效。

 1# 开始进行模型检验
 2#首先是训练集
 3predCV.train <- predict(fitCV, newx = as.matrix(train[,1:9]),
 4                        s = "lambda.min",
 5                        type = "response")
 6actuals.train <- ifelse(train$class == "malignant", 1, 0)
 7
 8#其次是测试集
 9predCV.test  <- predict(fitCV, newx = as.matrix(test[,1:9]),

基于隐马尔可夫模型和计算智能的股票价格时间序列预测_股票 预测 模型_临床预测模型代码

10 s = "lambda.min", 11 type = "response") 12actuals.test <- ifelse(test$class == "malignant", 1, 0)

我们可以通过predict函数来预测模型。fitCV 对象是我们建立的模型,分别在训练和测试数据集中进行评估。那么评估结果如何呢?最直接的方法是看ROC曲线,比较AUC值。

 1## plot ROC 
 2x1<-plot.roc(actuals.train,predCV.train,
 3             smooth=F,
 4             lwd=2,
 5             ylim=c(0,1),
 6             xlim=c(1,0),
 7             legacy.axes=T,
 8             main="",
 9             col="red")
10x2<-plot.roc(actuals.test,predCV.test,
11             smooth=F,
12             add=T,
13             lwd=2,
14             ylim=c(0,1),

股票 预测 模型_临床预测模型代码_基于隐马尔可夫模型和计算智能的股票价格时间序列预测

15 xlim=c(1,0), 16 legacy.axes=T, 17 main="", 18 col="seagreen3") 19# check ROC 20x1[["auc"]] 21x2[["auc"]] 22 23# add figure legend 24legend.name <- c(paste("Train:AUC",sprintf("%.4f",x1[["auc"]])), 25 paste("Test:AUC",sprintf("%.4f",x2[["auc"]]))) 26legend("bottomright", 27 legend=legend.name, 28 lwd = 2, 29 col = c("red","seagreen3"), 30 bty="n")

临床预测模型代码_股票 预测 模型_基于隐马尔可夫模型和计算智能的股票价格时间序列预测

可以看出,该模型在训练集和测试集上都表现不错,AUC值都在0.99以上。很神奇,不是吗!我在哪里可以找到这么好的诊断模型?感觉有了这段代码,分分钟就会出很多文章。

此外,我们已经在另一个系列中深入讲述了 ROC 曲线的故事。通过我们研猫出品的“ROC曲线终结者”代码,我们不仅可以自动绘制各组模型曲线,还可以实现不同模型之间的成对比较,见【研猫统计】ROC曲线(二):一码到最后。

LASSO 回归在这里。同名微信公众号联系客服领取验证码和测试数据。