多模型智能预测系统

项目简介

本系统是一个集成了15种机器学习与深度学习模型的足彩预测平台。通过多模型集成、自动特征筛选、超参数优化等技术,实现了对比赛结果的智能预测。系统采用模块化设计,支持单模型训练、投票集成、堆叠集成以及加权融合,并提供了完整的预测结果分析和保存功能。

支持的模型

[
  "LightGBM", "XGBoost", "CatBoost", "LogisticRegression",
  "Voting", "Voting_scaled", "Stacking", "Stacking_scaled",
  "RandomForest", "SVM", "NaiveBayes", "GradientBoosting",
  "PyTorch", "DecisionTree", "SequentialKeras"
]

其中:

  • 原生集成Voting(软投票)、Stacking(元学习器为轻量 XGBoost)
  • 标准化版本_scaled 后缀表示使用标准化特征的版本(适用于逻辑回归、SVM、朴素贝叶斯)
  • 深度学习:PyTorch 残差网络、Keras Sequential MLP

效果展示

系统在不同联赛上的测试集 F1 分数(宏平均)以及组合命中率(Top2 概率组合)。其中集成模型(Voting / Stacking)的表现通常优于单个基模型。

核心架构

系统分为两大模块:

1. 训练模块(ModelClassifier

负责数据预处理、特征工程、超参数优化、模型训练与保存。

核心流程

  1. 数据加载:从 DataFrame 读取原始比赛数据。
  2. 特征构建:通过 build_all_features 生成 300+ 维特征(包括主客队历史统计、上下盘统计、欧赔均值等)。
  3. 标签编码:将“胜/平/负”映射为 0/1/2,并计算类别权重。
  4. 数据划分:80% 训练 + 20% 测试,再从训练集中分出 20% 作为验证集(用于早停和超参数优化)。
  5. 特征筛选(针对每个模型独立进行):
    • 使用排列重要性(Permutation Importance)或模型内置 feature_importances_ 计算特征贡献。
    • 保留重要性大于均值的特征,若为空则保留最重要的一个。
  6. 超参数优化:利用 Optuna 框架对每个模型的关键超参数进行贝叶斯搜索(如树模型的最大深度、学习率,线性模型的正则化强度等)。
  7. 模型训练:使用最佳参数在完整训练集上训练,并在验证集上早停(深度学习模型)。
  8. 保存:将模型权重、标准化器(scaler)、特征列表、标签编码器保存到磁盘,供预测使用。

关键优化点

  • 特征重要性驱动:每个模型使用不同的最优特征子集,避免“垃圾特征”干扰。
  • 验证集独立:超参数优化和早停均基于验证集,防止过拟合。
  • 类别权重:自动计算 class_weight='balanced' 缓解结果分布不均衡问题。

2. 预测模块(ModelPredict

加载已训练的模型,对新数据进行预测,并支持多种融合策略。

核心流程

  1. 加载预处理器:读取每个模型的 scalerfeature_names,对齐输入特征(缺失特征填充 0)。
  2. 逐模型预测:根据模型类型选择原始特征或标准化特征,调用模型获得预测类别和概率。
  3. 融合策略(可选):
    • 单联赛融合:对某一联赛类型(如“英超”),若提供了模型准确率字典,则按准确率加权平均概率。
    • 跨联赛综合预测:对多个联赛类型的预测结果进行加权平均(权重可配置),得到最终“综合”预测。
    • 软投票:当没有权重时,简单平均所有模型的概率。
  4. 结果处理
    • 计算命中率、组合命中率(Top2 概率组合是否包含真实结果)。
    • 导出 Excel 文件,并自动添加条件格式(预测错误标红)。
    • 合并多方法预测文件,生成综合对比表。

核心代码片段

特征重要性 + 筛选

def get_best_feature(self, model_type, model, X, y):
    importance_df = self.get_feature_importance(model_type, model, X, y, feature_names)
    threshold = importance_df['importance'].mean()
    best_features = importance_df[importance_df['importance'] > threshold]['feature'].tolist()
    if not best_features:
        best_features = [importance_df.iloc[0]['feature']]
    return best_features

超参数优化示例(逻辑回归)

def objective(trial):
    C = trial.suggest_float('C', 1e-3, 1e3, log=True)
    penalty = trial.suggest_categorical('penalty', ['l1', 'l2', 'elasticnet'])
    l1_ratio = trial.suggest_float('l1_ratio', 0.0, 1.0) if penalty == 'elasticnet' else None
    lr = LogisticRegression(C=C, penalty=penalty, l1_ratio=l1_ratio, ...)
    score = cross_val_score(lr, X_train, y_train, cv=5).mean()
    return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)

集成预测(加权软投票)

if weights:
    weighted_sum = np.zeros_like(all_probas[0])
    for proba, w in zip(all_probas, weights):
        weighted_sum += w * proba
    final_proba = weighted_sum / sum(weights)
    final_pred = np.argmax(final_proba, axis=1)

运行方式

  1. 准备数据:Excel 文件需包含 比赛序号、联赛、主队、客队、比分、结果 等列。
  2. 训练
    classifier = ModelClassifier(model_dir='./models', model_types=model_list, ...)
    for model in model_list:
        classifier.run(model)
    
  3. 预测
    predictor = ModelPredict(model_dir='./models', model_names=model_list, ...)
    results, output_path = predictor.predict(num=26051, predict_out_path='./output')
    

性能分析

  • 单模型:通常 LightGBM / XGBoost 的 F1 在 0.48~0.52 之间,组合命中率(Top2)可达 70% 以上。
  • 集成模型:Voting / Stacking 可将 F1 提升至 0.55~0.60,组合命中率提升至 75% 左右。
  • 耗时:完整的 15 个模型训练(包括超参数优化)约 2~3 小时(取决于数据量)。预测阶段单场比赛耗时 < 1 秒。

技术亮点

  • 自动特征筛选:为每个模型定制最优特征集,避免手动特征工程的繁琐。
  • 高可扩展性:新增模型只需实现 train_XXX 方法并支持 predict_proba 即可无缝接入集成框架。
  • 鲁棒性设计:所有预测过程均包含缺失特征补零、异常值填充、标准化对齐等防御性代码。
  • 生产就绪:模型持久化、多线程/多进程并行预测、结果自动合并和 Excel 美化输出。

未来改进方向

  • 引入时序交叉验证(按比赛时间划分训练/测试集)。
  • 加入泊松回归或贝叶斯模型作为基模型。
  • 开发 Web 界面,实时滚动预测。

本系统完整代码托管于内部仓库,欢迎交流讨论。

预测、结果自动合并和 Excel 美化输出。

未来改进方向

  • 引入时序交叉验证(按比赛时间划分训练/测试集)。
  • 加入泊松回归或贝叶斯模型作为基模型。
  • 开发 Web 界面,实时滚动预测。

本系统完整代码托管于内部仓库,欢迎交流讨论。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐