AdaBoostClassifier结合SVC报错及训练耗时优化咨询
错误原因明确:SAMME.R算法要求基学习器必须支持predict_proba方法输出类别概率,但当前SVC实例设置了probability=False,未开启概率计算功能。有两种直接修复方案:
方案1:开启SVC的概率计算功能
修改SVC初始化参数,将probability设为True,让SVC生成predict_proba方法以满足SAMME.R要求:
clf_SVM = SVC(probability=True, kernel='linear') clf_adaboost_boostAcc = AdaBoostClassifier(n_estimators=20, algorithm='SAMME.R', base_estimator=clf_SVM, learning_rate=1)
方案2:改用SAMME算法
若不想开启SVC的概率计算(概率计算会增加训练耗时),可将AdaBoost的算法改为SAMME,该算法仅需基学习器输出类别标签,无需概率:
clf_adaboost_boostAcc = AdaBoostClassifier(n_estimators=20, algorithm='SAMME', base_estimator=clf_SVM, learning_rate=1)
除你已尝试的StandardScaler和OneVsRestClassifier,还有以下实用优化方法:
替换为LinearSVC:使用线性核时,
LinearSVC是专门优化的实现,比SVC(kernel='linear')训练速度快得多,尤其适合数据量较大的场景:from sklearn.svm import LinearSVC clf_SVM = LinearSVC(C=1.0, dual=False) # 样本数大于特征数时,dual=False更高效特征降维/选择:当前使用19个特征,可能存在冗余或低贡献特征,可通过以下方式减少特征数量:
- 用
SelectKBest筛选与目标变量相关性最高的K个特征 - 用
PCA进行主成分分析,将高维特征压缩到低维空间
特征数量减少后,SVC计算量会显著降低。
- 用
调整正则化参数C:减小C值会增强正则化强度,让模型更简单、训练更快。可从0.1、0.01等较小值开始尝试,平衡速度与性能。
用SGDClassifier模拟SVM:
SGDClassifier支持hinge损失函数模拟线性SVM行为,基于随机梯度下降,训练速度远快于传统SVM,适合大规模数据集:from sklearn.linear_model import SGDClassifier clf_SVM = SGDClassifier(loss='hinge', penalty='l2', max_iter=1000)样本抽样:若数据集规模极大,可随机抽取部分样本训练,在可接受的性能损失范围内大幅缩短训练时间。
硬件加速:若有GPU资源,可使用支持GPU加速的机器学习库(如cuML)中的SVC实现,训练速度会有数量级提升。
内容的提问来源于stack exchange,提问作者Shahalan

