一、引言
机器学习是人工智能的核心领域之一,其重要性体现在其能够从数据中自动学习并改进的能力上。在实际问题中,机器学习已经被广泛应用于各个领域,包括但不限于金融、医疗、电子商务、社交网络等。例如,在金融领域,机器学习被用于风险评估、交易预测等;在医疗领域,机器学习可用于疾病诊断、药物研发等。这些应用不仅提高了工作效率,还为决策提供了数据支持,促进了各行业的发展与进步。
本文将探讨两个在机器学习领域中备受关注的主题:Adaboost。Adaboost是一种集成学习算法,通过组合多个弱分类器来构建一个强分类器,具有很高的预测准确性和泛化能力。本文旨在帮助读者更好地理解和应用机器学习技术,从而在实际问题中取得更好的应用效果。
二、Adaboost算法的介绍
2.1 Adaboost基本原理和工作方式
Adaboost(Adaptive Boosting)是一种集成学习算法,通过串行训练多个弱分类器并将它们组合成一个强分类器。其基本原理如下:
-
初始化权重:给每个训练样本赋予相等的权重 -
迭代训练:对于每一轮迭代: -
使用当前样本权重训练一个弱分类器(例如,决策树、支持向量机等) -
计算弱分类器的错误率以及其在总体分类中的权重 -
更新样本权重,增加被错误分类的样本的权重,减少被正确分类的样本的权重
-
-
组合弱分类器:根据每个弱分类器的权重,将它们组合成一个强分类器。 -
输出结果:通过组合的强分类器进行预测。
Adaboost的核心思想是每一轮迭代都关注被前一轮分类错误的样本,通过提高它们的权重来改进分类器。这种逐步迭代的方式能够聚焦于难以分类的样本,最终构建出一个在整个数据集上表现很好的强分类器。
2.2 Adaboost的优缺点以及适用场景
-
「优点」: -
Adaboost能够在相对简单的弱分类器基础上构建出高准确率的强分类器。 -
对于处理大量数据集和高维特征的问题,Adaboost表现出色。 -
由于每个弱分类器的权重与其性能相关,Adaboost对于异常值和噪声数据具有一定的鲁棒性。
-
-
「缺点」: -
Adaboost对噪声数据和过拟合敏感,容易受到异常值的影响。 -
对于数据分布不均匀或存在类别不平衡的情况,Adaboost的效果可能不佳。 -
训练过程中每一轮都需要重新计算样本权重,计算量较大。
-
-
「适用场景」: -
二分类或多分类问题中,适用于处理大规模数据集和高维特征。 -
数据集相对均匀,类别平衡或能够通过数据重采样等方式处理类别不平衡问题时。 -
适用于需要较高分类准确率的应用场景,如人脸识别、文本分类等。
-
Adaboost是一种强大的分类器,但在实际应用中需要考虑数据质量、异常值处理等因素,以充分发挥其优势。
三、Adaboost操作步骤
-
数据准备 -
加载数据集 -
数据预处理和特征工程
-
-
模型训练 -
使用adabag包中的adaboost函数训练Adaboost模型 -
设置参数并进行模型训练
-
-
模型评估 -
对模型进行交叉验证或者使用测试集进行评估 -
分析模型的性能指标,如准确率、召回率等
-
-
模型优化与调参 -
调整参数以优化模型性能 -
使用网格搜索或其他方法进行参数调优
-
四、示例演示
-
「数据集准备」
library(survival)
head(gbsg)
结果展示:
pid age meno size grade nodes pgr er hormon rfstime status
1 132 49 0 18 2 2 0 0 0 1838 0
2 1575 55 1 20 3 16 0 0 0 403 1
3 1140 56 1 40 3 3 0 0 0 1603 0
4 769 45 0 25 3 1 0 4 0 177 0
5 130 65 1 30 2 5 0 36 1 1855 0
6 1642 48 0 52 2 11 0 0 0 842 1
-
「示例数据集介绍」
> str(gbsg)
'data.frame': 686 obs. of 10 variables:
$ age : int 49 55 56 45 65 48 48 37 67 45 ...
$ meno : int 0 1 1 0 1 0 0 0 1 0 ...
$ size : int 18 20 40 25 30 52 21 20 20 30 ...
$ grade : int 2 3 3 3 2 2 3 2 2 2 ...
$ nodes : int 2 16 3 1 5 11 8 9 1 1 ...
$ pgr : int 0 0 0 0 0 0 0 0 0 0 ...
$ er : int 0 0 0 4 36 0 0 0 0 0 ...
$ hormon : int 0 0 0 0 1 0 0 1 1 0 ...
$ rfstime: int 1838 403 1603 177 1855 842 293 42 564 1093 ...
$ status : Factor w/ 2 levels "0","1": 1 2 1 1 1 2 2 1 2 2 ...
age:患者年龄
meno:更年期状态(0表示未更年期,1表示已更年期)
size:肿瘤大小
grade:肿瘤分级
nodes:受累淋巴结数量
pgr:孕激素受体表达水平
er:雌激素受体表达水平
hormon:激素治疗(0表示否,1表示是)
rfstime:复发或死亡时间(以天为单位)
status:事件状态(0表示被截尾,1表示事件发生)
-
「划分训练集和测试集」
# 划分训练集和测试集
data <- gbsg[,c(-1)]
library(h2o)
h2o.init()
# 转换成h2o需要的数据格式
data <- as.h2o(data)
data$status <- h2o.asfactor(data$status)
data$meno <- h2o.asfactor(data$meno)
data$grade <- h2o.asfactor(data$grade)
data$hormon <- h2o.asfactor(data$hormon)
y <- "status"
x <- setdiff(names(data),y)
# 划分数据集为训练集和测试集
splits <- h2o.splitFrame(data, ratios = c(0.65, 0.3), seed = 123)
train <- splits[[1]]
test <- splits[[2]]
-
「模型拟合」
adaboost_model <- h2o.adaBoost(nlearners=50,
learn_rate = 0.5,
weak_learner = "DRF",
x = x,
y = y,
training_frame = train)
# 预测
pred <- h2o.predict(adaboost_model, train)
结果展示:
> h2o.predict(adaboost_model, train)
|===================================================================| 100%
predict p0 p1
1 0 0.8945913 0.1054087
2 1 0.1208220 0.8791780
3 0 0.6866856 0.3133144
4 0 0.7532780 0.2467220
5 1 0.1807224 0.8192776
6 1 0.2444292 0.7555708
[434 rows x 3 columns]
-
「模型评估」
perf <- h2o.performance(adaboost_model, test)
perf
h2o.auc(perf)
plot(perf)
结果展示:
H2OBinomialMetrics: adaboost
MSE: 0.2061091
RMSE: 0.4539924
LogLoss: 0.6077034
Mean Per-Class Error: 0.2895257
AUC: 0.7400362
AUCPR: 0.6404273
Gini: 0.4800725
Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
0 1 Error Rate
0 90 42 0.318182 =42/132
1 24 68 0.260870 =24/92
Totals 114 110 0.294643 =66/224
Maximum Metrics: Maximum metrics at their respective thresholds
metric threshold value idx
1 max f1 0.349462 0.673267 92
2 max f2 0.072062 0.798246 174
3 max f0point5 0.465848 0.651709 79
4 max accuracy 0.465848 0.714286 79
5 max precision 0.951895 1.000000 0
6 max recall 0.039011 1.000000 189
7 max specificity 0.951895 1.000000 0
8 max absolute_mcc 0.349462 0.414249 92
9 max min_per_class_accuracy 0.385054 0.695652 86
10 max mean_per_class_accuracy 0.349462 0.710474 92
11 max tns 0.951895 132.000000 0
12 max fns 0.951895 91.000000 0
13 max fps 0.022880 132.000000 194
14 max tps 0.039011 92.000000 189
15 max tnr 0.951895 1.000000 0
16 max fnr 0.951895 0.989130 0
17 max fpr 0.022880 1.000000 194
18 max tpr 0.039011 1.000000 189
Gains/Lift Table: Extract with `h2o.gainsLift(<model>, <data>)` or `h2o.gainsLift(<model>, valid=<T/F>, xval=<T/F>)`
*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」