期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能

机器学习算法数据库

picture.image

✨ 欢迎关注 ✨

本节介绍:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,付费成员可在交流群中获取下载。需要的朋友可关注公众文末提供的购买方式。 购买前请咨询,避免不必要的问题。

✨ 文献信息 ✨

picture.image

该模型流程包含两个阶段:第一阶段通过多个管道进行二分类优化,分别对“正常与非正常”、“轻微与非轻微”、“轻度与非轻度”和“中度与非中度”进行分类,并选择最佳的管道;第二阶段将这些最佳管道的输出进行集成,通过逻辑回归进行多类分类,最终对“正常”、“轻微”、“轻度”和“中度”四个类别进行预测

picture.image

这里展示集成模型的详细推理过程,其中通过逻辑回归、随机森林和梯度提升分类器对不同的分类任务进行处理,结合数据标准化、特征选择和特征提取等步骤,以实现对“正常、轻微、轻度、中度”四个类别的预测,当然文献原始数据是语音,接下来按照这个流程模拟实现正常使用xlsx数据

✨ 基础代码 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
  
path = r"2025-6-16公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
# 对“class”列进行one-hot编码  
df_encoded = pd.get_dummies(df, columns=['class'], prefix='class', dtype=int)  
df_encoded

picture.image

对原始数据集中的“class”列进行one-hot编码,将其转化为四个新的二进制列,并保留原始数据的其余部分,最终输出一个新的数据框。原始数据维度是452行279列(特征),是一个四分类数据集

  
# 提取每个编码结果对应的数据集  
df_class_0 = df_encoded.drop(['class_1', 'class_2', 'class_3'], axis=1)    
df_class_1 = df_encoded.drop(['class_0', 'class_2', 'class_3'], axis=1)   
df_class_2 = df_encoded.drop(['class_0', 'class_1', 'class_3'], axis=1)   
df_class_3 = df_encoded.drop(['class_0', 'class_1', 'class_2'], axis=1)

根据one-hot编码后的结果,将原始数据集分别拆分成四个子集,每个子集只保留与某一类别相关的列,其余类别的列被删除

picture.image

这张图展示对类别0数据进行RFE特征选择的结果,最终选择了六个最重要特征,有些读者可能会疑问,为什么一些靠后的特征柱状图仍然较高。这是因为RFE特征选择的动态过程所致。这里所指的“特征贡献度”是指在每次训练模型时的贡献度。由于在RFE的迭代过程中,每次都会删除不同的特征子集,因此某些特征在不同迭代中的贡献度可能会有所波动,导致这种情况的出现

  
# 划分训练集和测试集  
X_train = X.loc[X_train_wz.index][selection_results.iloc[0:6]['Feature']]  
X_test = X.loc[X_test_wz.index][selection_results.iloc[0:6]['Feature']]  
from sklearn.preprocessing import StandardScaler  
# 初始化 StandardScaler(归一化器)  
scaler = StandardScaler()  
# 对训练集进行归一化  
X_train_scaled = scaler.fit_transform(X_train)  
# 使用训练集的归一化器对测试集进行归一化  
X_test_scaled = scaler.transform(X_test)

从选定的特征中划分训练集和测试集,然后使用StandardScaler对训练集进行归一化,并将训练集的归一化参数应用于测试集,确保两者使用相同的尺度

这里使用训练集的统计指标(如均值和标准差)对测试集进行归一化,从而避免数据泄露。通过先划分数据集,再对训练集进行归一化,并将训练集的归一化参数应用到测试集,确保测试集的数据不会影响到训练过程,而不是先归一化在划分数据集

  
from sklearn.linear_model import LogisticRegression  
from sklearn.model_selection import GridSearchCV, StratifiedKFold  
from sklearn.metrics import roc_auc_score  
# 创建逻辑回归模型  
lr_model = LogisticRegression(random_state=42)  
# 定义超参数网格  
param_grid = {  
    'C': [0.1, 1, 10, 100],  # 正则化强度的超参数  
    'penalty': ['l2'],  # L2正则化  
    'solver': ['liblinear', 'lbfgs'],  # 使用的求解器  
    'max_iter': [100, 200]  # 最大迭代次数  
}  
# 创建StratifiedKFold对象,进行K折交叉验证  
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)  
# 使用GridSearchCV进行网格搜索和K折交叉验证  
grid_search = GridSearchCV(  
    estimator=lr_model,   
    param_grid=param_grid,   
    cv=cv,   
    scoring='roc_auc',  # 使用ROC-AUC作为评价指标  
    n_jobs=-1,  # 使用所有可用的CPU核心  
    verbose=1  
)  
# 训练网格搜索模型  
grid_search.fit(X_train_scaled, y_train)  
# 输出最佳参数和最佳得分  
print("Best Parameters from Grid Search:", grid_search.best_params_)  
print("Best Cross-Validation ROC-AUC:", grid_search.best_score_)  
# 在测试集上评估模型  
best_lr_model = grid_search.best_estimator_  
y_pred_proba = best_lr_model.predict_proba(X_test_scaled)[:, 1]  
# 计算ROC-AUC值  
roc_auc = roc_auc_score(y_test, y_pred_proba)  
print("Test ROC-AUC:", roc_auc)

通过网格搜索和K折交叉验证对逻辑回归模型的超参数进行优化,选择最佳参数并训练模型,然后在测试集上评估并计算ROC-AUC值,最终输出最佳参数、最佳交叉验证得分和测试集的ROC-AUC值

  
Fitting 5 folds for each of 16 candidates, totalling 80 fits  
Best Parameters from Grid Search: {'C': 10, 'max_iter': 100, 'penalty': 'l2', 'solver': 'liblinear'}  
Best Cross-Validation ROC-AUC: 0.7725441900898291  
Test ROC-AUC: 0.7986050566695728

输出结果表示,通过网格搜索和交叉验证,逻辑回归模型的最佳超参数为:C=10,max_iter=100,penalty='l2',solver='liblinear',并且在交叉验证中取得了0.773的ROC-AUC值;在测试集上的ROC-AUC值为0.799

  
# 使用best_lr_model对训练集进行预测  
y_train_pred_lr = best_lr_model.predict(X_train_scaled)  
# 使用best_lr_model对测试集进行预测  
y_test_pred_lr = best_lr_model.predict(X_test_scaled)  
  
# 将训练集预测结果和测试集预测结果分别转换为DataFrame  
train_pred_0 = pd.DataFrame({'Index': X_train.index, 'Prediction': y_train_pred_lr})  
test_pred_0 = pd.DataFrame({'Index': X_test.index, 'Prediction': y_test_pred_l})  
train_pred_0

picture.image

使用优化后的逻辑回归模型best_lr_model对训练集和测试集进行预测,并将预测结果分别转换为DataFrame,保存预测值及对应的索引,生成的结果将作为后续集成学习的输入数据集

picture.image

接下来,对于类别1、2、3的数据,将执行与类别0相同的步骤,包括特征筛选、数据归一化和模型构建。将分别使用RF、RF和GBDT模型进行训练,并保存每个类别的预测结果。需要注意的是,这里是和文献中采用一样的模型,但在实际应用中,读者应尝试使用多种不同的模型,以确保性能达到最优

  
# 合并四个模型的预测结果为训练集和测试集的DataFrame  
train_pred_combined = pd.concat([train_pred_0['Prediction'], train_pred_1['Prediction'], train_pred_2['Prediction'], train_pred_3['Prediction']], axis=1)  
train_pred_combined.columns = ['LR Prediction', 'RF Prediction', 'RF2 Prediction', 'GBDT Prediction']  
train_pred_combined['class'] = np.array(df['class'].loc[X_train_wz.index])  
test_pred_combined = pd.concat([test_pred_0['Prediction'], test_pred_1['Prediction'], test_pred_2['Prediction'], test_pred_3['Prediction']], axis=1)  
test_pred_combined.columns = ['LR Prediction', 'RF Prediction', 'RF2 Prediction', 'GBDT Prediction']  
test_pred_combined['class'] = np.array(df['class'].loc[X_test_wz.index])  
train_pred_combined

picture.image

将四个模型(LR、RF、RF2、GBDT)的预测结果合并为训练集和测试集的DataFrame,并添加真实的类别标签,生成的DataFrame将作为第二层集成模型的输入数据

  
X_train = train_pred_combined.drop(['class'], axis=1)    
y_train = train_pred_combined['class']  
X_test = test_pred_combined.drop(['class'], axis=1)    
y_test = test_pred_combined['class']  
from sklearn.metrics import accuracy_score  
# 创建逻辑回归模型  
lr = LogisticRegression(random_state=42)  
  
# 定义网格搜索超参数  
param_grid = {  
    'C': [0.1, 1, 10, 100],  # 正则化强度的超参数  
    'penalty': ['l2'],  # L2正则化  
    'solver': ['lbfgs'],  # 使用的求解器,适用于多分类  
    'multi_class': ['ovr', 'multinomial'],  # 使用的多分类策略  
}  
  
# 创建StratifiedKFold对象,进行K折交叉验证  
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)  
  
# 使用GridSearchCV进行网格搜索和K折交叉验证  
grid_search = GridSearchCV(  
    estimator=lr,  
    param_grid=param_grid,  
    cv=cv,  
    scoring='accuracy',  # 使用准确率作为评价指标  
    n_jobs=-1,  # 使用所有可用的CPU核心  
    verbose=1  
)  
  
# 训练网格搜索模型  
grid_search.fit(X_train, y_train)  
  
# 输出最佳参数和最佳得分  
print("Best Parameters from Grid Search:", grid_search.best_params_)  
print("Best Cross-Validation Accuracy:", grid_search.best_score_)  
  
# 在测试集上评估模型  
best_lr = grid_search.best_estimator_  
y_pred = best_lr.predict(X_test)  
  
# 计算准确率  
accuracy = accuracy_score(y_test, y_pred)  
print("Test Accuracy:", accuracy)

对第二层逻辑回归模型进行超参数优化,通过网格搜索和K折交叉验证选择最佳的参数和多分类策略,并在测试集上进行预测,最终输出该多分类数据集的预测结果及准确率

  
Fitting 5 folds for each of 8 candidates, totalling 40 fits  
Best Parameters from Grid Search: {'C': 1, 'multi_class': 'ovr', 'penalty': 'l2', 'solver': 'lbfgs'}  
Best Cross-Validation Accuracy: 0.9588293650793652  
Test Accuracy: 0.7426470588235294

这里同样返回模型的成绩,接下来对这个集成模型进行混淆矩阵绘制

picture.image

混淆矩阵展示堆叠模型在4分类任务中的预测效果。模型在预测“正常”类时表现最佳,准确率为93.2%,但在预测“严重”类时存在较多误分类。从结果来看,模型在某些类别(如“轻微”和“中度”)的预测较为平衡。需要强调的是,这个结果基于模拟数据,并按照文献中的流程进行实现,实际应用中,使用不同的数据集时,模型的性能提升不一定就是提升,和数据质量会相关

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 购买介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,购买作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用,包括但不限于ChatGPT、Deepseek、Claude等。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 购买前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!

往期推荐

机器学习在临床数据分析中的应用:从数据预处理到Web应用实现的完整流程教学

期刊配图:基于SHAP算法的驱动因子相互作用贡献矩阵图

期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比

XGBoost模型优化:基于相关系数剔除多重共线性与穷举法进行特征选择

Geographical-XGBoost:一种基于梯度提升树的空间局部回归的新集成模型实现

因果推断:利用EconML实现双重机器学习估计条件平均处理效应 (CATE)

期刊复现:基于部分线性模型的双重机器学习方法

期刊复现:基于XGBoost模型的网页工具SHAP力图解释单样本预测结果

期刊配图:nature cities通过ALE(累积局部效应)解析特征对模型影响

期刊复现:结合因果推断与SHAP可解释性的机器学习实现应用流程

期刊配图:一区SCI常用数据缺失率展示图可视化

因果推断:注册行为对后续消费影响的因果推断分析案例

nature communications:基于LightGBM与随机森林结合的多模型特征选择方法

因果推断与机器学习结合:探索酒店预订取消的影响因素

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论