如何基于模型名称列表在Python中实现分层级流水线式模型训练?
基于模型名称参数的两层训练流水线实现
你说的这种分层模型训练方式本质是堆叠(Stacking)集成学习,可以通过模型名称与实例的映射关系优雅实现,下面是基于scikit-learn的简洁代码示例:
核心思路
- 建立模型名称到对应模型实例的映射字典
- 批量训练第一层模型,用它们的预测结果(分类任务推荐用概率输出)生成新特征
- 将新特征与原始特征拼接,作为第二层模型的输入进行训练
完整代码实现
from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neural_network import MLPClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import numpy as np # 定义分层模型名称列表 model_level1 = ['svm','decision_tree','logistic_regression'] model_level2 = ['random_forest','neural_network'] # 模型名称到实例的映射,可根据需求调整模型参数 model_map = { 'svm': SVC(probability=True), # 开启概率输出,提供更丰富的特征信息 'decision_tree': DecisionTreeClassifier(random_state=42), 'logistic_regression': LogisticRegression(max_iter=1000, random_state=42), 'random_forest': RandomForestClassifier(random_state=42), 'neural_network': MLPClassifier(max_iter=1500, random_state=42) } # 加载示例数据,替换为你的数据集即可 data = load_iris() X, y = data.data, data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # ---------------------- 训练第一层模型,生成第二层输入特征 ---------------------- level1_train_preds = [] for model_name in model_level1: model = model_map[model_name] model.fit(X_train, y_train) # 用分类概率作为特征(比直接输出类别更鲁棒) train_proba = model.predict_proba(X_train) level1_train_preds.append(train_proba) # 拼接原始特征与第一层预测特征,作为第二层训练集 X_train_level2 = np.hstack([X_train] + level1_train_preds) # ---------------------- 训练第二层模型并评估 ---------------------- for model_name in model_level2: model = model_map[model_name] model.fit(X_train_level2, y_train) # 生成测试集的第二层输入特征 level1_test_preds = [] for l1_model_name in model_level1: l1_model = model_map[l1_model_name] test_proba = l1_model.predict_proba(X_test) level1_test_preds.append(test_proba) X_test_level2 = np.hstack([X_test] + level1_test_preds) # 输出模型性能 test_acc = model.score(X_test_level2, y_test) print(f"第二层模型 {model_name} 测试准确率: {test_acc:.4f}")
关键细节说明
- 分类任务中优先使用
predict_proba输出概率值作为特征,相比直接输出类别标签,能保留更多模型决策的不确定性信息,提升第二层模型的学习效果 - 如果是回归任务,将
predict_proba替换为predict即可 - 若要避免过拟合,可以用交叉验证生成第一层特征(比如
sklearn.model_selection.cross_val_predict),而不是直接用训练集的预测结果 - 可根据需求选择是否拼接原始特征,部分场景下仅用第一层模型的预测特征也能得到不错的效果
内容的提问来源于stack exchange,提问作者cloudscomputes
相关产品推荐
相关产品推荐

