介绍
在本文中,我将向您介绍集成建模的基础知识。 另外,为了向您提供有关集成建模的实践经验,我们将使用R进行集成。最近我们被客户要求撰写关于集成模型的研究报告,包括一些图形和统计输出。
1.什么是集成?
通常,集成是一种组合两种或多种类似或不同类型算法的技术,称为基础学习模型。这样做是为了建立一个更加健壮的系统,其中包含了所有基础学习模型的预测。可以理解为多个交易者的会议室会议,以决定股票的价格是否会上涨。
由于他们都对股票市场有不同的理解。因此,他们应该根据自己对市场的理解对股票价格做出各种预测。
相关视频:Boosting集成学习原理与R语言提升回归树BRT预测短鳍鳗分布生态学实例
Boosting集成学习原理与R语言提升回归树BRT预测短鳍鳗分布生态学实例
,时长10:25
2.集合的类型
在进一步详细介绍之前,一些基本概念是:
- 平均:它被定义为 在回归问题的情况下或在预测分类问题的概率时从模型中获取预测的平均值。
- 多数投票:它被 定义为 在预测分类问题的结果的同时,从多个模型预测中以最大投票/推荐进行预测。
- 加权平均值:在此,不同的权重应用于来自多个模型的预测,然后取平均值 。
一些主要使用的技术:
- Bagging: Bagging也称为bootstrap聚合。
增强的一些例子是XGBoost,GBM,ADABOOST等。
- 堆叠:在堆叠多层机器时,学习模型彼此叠加,每个模型将其预测传递给上面层中的模型,顶层模型根据模型下面的模型输出做出决策。
3.集合的优点和缺点
3.1优点
- 集成是一种经过验证的方法,可以提高模型的准确性,适用于大多数情况。
- 集成使模型更加稳健和稳定,从而确保在大多数情况下测试用例具有良好的性能。
- 您可以使用集成来发现数据中的线性和非线性复杂关系。可以通过使用两个不同的模型形成两个集合来完成。
3.2缺点
- 集成减少了模型的可解释性,并且很难在最后得到关键的业务见解。
- 非常耗时,因此不是实时应用程序的最佳选择。
4.在R中实施集合的实用指南
#让我们看一下数据集数据的结构
'data.frame':614 obs。13个变量:
$ ApplicantIncome:int 5849 4583 3000 2583 6000 5417 2333 3036 4006 12841 ...
$ CoapplicantIncome:num 0 1508 0 2358 0 ...
$ LoanAmount:int NA 128 66 120 141 267 95 158 168 349 ...
$ Loan_Amount_Term:int 360 360 360 360 360 360 360 360 360 360 ...
$ Credit_History:int 1 1 1 1 1 1 1 0 1 1 ...
#使用中位数填充缺失值
preProcValues < - preProcess(data,method = c(“medianImpute”,“center”,“scale”))
#Spliting训练根据结果分为两部分:75%和25%
index < - createDataPartition(data_processed $ Loan_Status,p = 0.75,list = FALSE)
trainSet < - data_processed [index,]
testSet < - data_processed [-index,]
我将数据分成两部分,我将用它来模拟训练和测试操作。我们现在定义训练以及预测变量和结果变量:
#定义多个模型的训练参数
fitControl < - trainControl(
method =“cv”, savePredictions ='final',
classProbs = T)
我们开始训练随机森林并在我们创建的测试集上测试其准确性:
#检查随机森林模型的准确性
Confusion matrix and statistics
reference
Forecast N Y.
N 28 20
Y 9 96
Accuracy: 0.8105
95% CI: (0.7393,0.8692)
No information rate: 0.7582
P value[Acc> NIR]: 0.07566
Kappa: 0.5306
Mcnemar's test P value: 0.06332
Sensitivity: 0.7568
Specificity: 0.8276
Pos Pred value: 0.5833
Neg Pred value: 0.9143
Prevalence rate: 0.2418
Detection rate: 0.1830
Detection prevalence rate: 0.3137
Balance accuracy: 0.7922
我们使用随机森林模型获得了0.81的准确度。看看KNN的表现:
#训练knn模型
#使用knn模型预测
testSet $ pred_knn <-predict(object = model_knn,testSet [,predictors])
#检查随机森林模型的准确性
reference
Forecast N Y.
N 29 19
Yes 2 103
Accuracy: 0.8627
95% CI: (0.7979, 0.913)
No information rate: 0.7974
P value[Acc> NIR]: 0.0241694
Kappa: 0.6473
Mcnemar's test P value: 0.0004803
Sensitivity: 0.9355
Specificity: 0.8443
Pos Pred value: 0.6042
Neg Pred value: 0.9810
Prevalence rate: 0.2026
Detection rate: 0.1895
Detection prevalence rate: 0.3137
Balance accuracy: 0.8899
我们能够通过单独的KNN模型获得0.86的准确度。Logistic回归的表现:
#训练Logistic回归模型
#预测使用knn模型
testSet $ pred_lr <-predict(object = model_lr,testSet [,predictors])
#检查随机森林模型的准确性
Confusion matrix and statistics
reference
Forecast N Y.
N 29 19
Yes 2 103
Accuracy: 0.8627
95% CI: (0.7979, 0.913)
No information rate: 0.7974
P value[Acc> NIR]: 0.0241694
Kappa: 0.6473
Mcnemar's test P value: 0.0004803
Sensitivity: 0.9355
Specificity: 0.8443
Pos Pred value: 0.6042
Neg Pred value: 0.9810
Prevalence rate: 0.2026
Detection rate: 0.1895
Detection prevalence rate: 0.3137
Balance accuracy: 0.8899
逻辑回归也给出了0.86的准确度。
现在,让我们尝试用这些模型形成集合的不同方法,如我们所讨论的:
平均
我们将平均三个模型的预测。由于预测是“Y”或“N”,因此平均值对于此二进制分类没有多大意义。但是,我们可以对观察概率的平均值进行平均处理。
#预测概率
testSet $ pred_rf_prob <-predict(object = model_rf,testSet [,predictors],type ='prob')
testSet $ pred_knn_prob <-predict(object = model_knn,testSet [,predictors],type ='prob')
testSet $ pred_lr_prob <-predict(object = model_lr,testSet [,predictors],type ='prob')
多数表决:在多数表决中,我们将为大多数模型预测的观察指定预测。
多数投票加权平均值
我们可以采用加权平均值,而不是采用简单平均值。通常,对于更准确的模型,预测的权重很高。让我们将0.5分配给logistic回归,将0.25分配给KNN和随机森林。
之前我们在顶层使用了简单的公式。相反,我们可以使用另一种机器学习模型,这就是堆叠。我们可以使用线性回归来建立线性公式,用于在回归问题中进行预测,以便在分类问题的情况下将底层模型预测映射到结果或逻辑回归。
在同一个例子中,让我们尝试将逻辑回归和GBM设置为顶层模型。请记住,我们将采取以下步骤:
- 在训练数据上训练各个基础层模型。
- 预测使用每个基础层模型来训练数据和测试数据。
- 现在,再次对顶层模型进行训练,对底层模型进行训练数据的预测。
- 最后,使用顶层模型预测底层模型的预测。
-
步骤1:在训练数据上训练各个基础层模型
#定义参数
fitControl < - trainControl(
method =“cv”, savePredictions ='final',#保存最佳参数组合的预测
classProbs = T#保存预测的类概率
)
#训练随机森林模型
#训练knn模型
#训练逻辑回归模型
-
步骤2:使用每个基础层模型预测训练数据和测试数据
#预测训练数据的概率
#预测测试数据的概率
-
步骤3:现在再次训练顶层模型对底层模型的预测,对训练数据进行预测
首先,让我们从GBM模型开始作为顶层模型。
#顶层模型用于预测的变量
predictors_top <-c( 'OOF_pred_rf', 'OOF_pred_knn', 'OOF_pred_lr')
#GBM作为顶层模型
同样,我们也可以使用逻辑回归创建一个集合作为顶层模型。
#Logistic回归作为顶层模型
model_glm < -
( [,predictors_top], trControl = fitControl,tuneLength = 3)
-
步骤4:最后,使用顶层模型预测
#使用GBM顶层模型预测
测试集$ gbm_stacked <-predict(model_gbm,测试集[,predictors_top])
#使用logictic回归顶层模型预测
测试集$ glm_stacked <-predict(model_glm,测试集[,predictors_top])
选择模型非常重要,然后才能从整体中获得最佳效果。