尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

机器学习预测算法实战:KNN、决策树、随机森林与SVM的竞赛级应用指南

机器学习预测算法实战:KNN、决策树、随机森林与SVM的竞赛级应用指南 1. 项目概述从华为杯赛题到机器学习预测实战去年带队参加华为杯数学建模竞赛的经历让我对“预测”这两个字有了更深的理解。赛题往往不会直接告诉你“请用随机森林预测一下”而是会给你一堆看似杂乱无章的数据比如某地区的经济指标、气象历史记录或者社交媒体上的用户行为序列然后让你去“预测未来趋势”或“识别潜在模式”。这时候手里有几套靠谱的机器学习预测算法就像木匠有一套顺手的工具心里不慌。这个项目就是把我当时在实战中梳理、应用并调优的一套以KNN、随机森林、决策树和支持向量机SVM为核心的预测算法工具箱结合Python代码实现完整地复盘出来。它不是简单的库函数调用教学而是聚焦于“如何根据赛题数据特征选择并调优最合适的预测模型”这一核心命题。对于参加数模竞赛的同学或者刚接触机器学习预测任务的朋友这个内容的价值在于提供一条清晰的路径看到数据后如何快速评估用KNN还是SVM决策树模型怎么调参才不会过拟合随机森林的“随机”到底随机在哪里又如何影响结果我会结合竞赛场景中常见的数据类型小样本、高维度、时序特征、类别不平衡等拆解每种算法的适用场景、核心参数背后的数学直觉以及用Python主要是scikit-learn实现时的关键步骤和避坑指南。最终你不只会得到几段可以“抄作业”的代码更能建立起一套针对预测类问题的算法选型与优化思维。2. 核心算法选型逻辑与竞赛场景适配在数学建模竞赛的高压环境下盲目尝试所有算法是时间管理上的灾难。正确的做法是先对数据和任务进行“快速诊断”再匹配算法。这部分的逻辑直接决定了你三天时间是手忙脚乱还是游刃有余。2.1 任务本质与数据特征的“第一眼诊断”接到预测任务我首先会问两个问题预测什么回归预测连续值还是分类预测离散标签以及数据长什么样样本量、特征维度、特征类型、是否存在缺失或异常。样本量 vs. 特征数这是黄金准则。如果样本数量n远大于特征数量p例如你有几千条数据几十个特征那么SVM、随机森林、决策树甚至深度学习都有发挥空间。但如果特征数接近甚至多于样本数“高维小样本”问题在基因数据、文本初期向量化中常见线性模型容易过拟合这时支持向量机SVM凭借其最大化间隔的思想和核技巧往往表现出更强的泛化能力。而KNN在这种场景下基本是“灾难”因为距离度量在高维空间会失效这就是所谓的“维度诅咒”。特征类型与关系如果你的特征大多是连续数值型且与目标变量之间存在复杂的非线性关系决策树及其集成方法随机森林是天生的好手它们能自动捕获交互效应。如果特征中有大量类别型变量One-Hot编码后维度激增树模型处理起来很自然而SVM则需要谨慎选择核函数。对于KNN它极度依赖特征尺度如果存在量纲差异巨大的特征如“年龄”和“年薪”必须进行标准化否则距离计算会被大数值特征主导。对异常值的敏感度竞赛数据常包含“脏数据”。决策树/随机森林对异常值不敏感因为它基于分区。SVM尤其是带有软间隔的SVM对异常值有一定容忍度但位于间隔带附近的异常点可能显著影响决策边界。KNN则比较脆弱一个异常值的k个近邻可能会带偏局部预测。注意在竞赛中数据探索性分析EDA的时间不能省。用pandas_profiling或简单的describe()、可视化查看分布、相关矩阵这半小时的投入能为你后续三天的模型选择省下大量试错时间。2.2 四大预测算法的核心定位与竞赛角色基于以上诊断我们可以为这四个算法贴上清晰的“竞赛标签”K最近邻KNN—— 快速基线模型与局部模式探测器核心思想“物以类聚”。预测一个点的值由其特征空间中最邻近的k个点的值多数票或平均值决定。竞赛角色永远不要首先用它来冲高分但一定要用它来建立基线。它的实现简单无需训练过程惰性学习是检验特征工程是否有效的“试金石”。如果精心设计特征后KNN的性能比随机猜测好不了多少那就要回头检查特征了。此外对于具有明显局部聚类特性的数据如某些地理或社会经济学数据KNN能提供直观的预测。决策树Decision Tree—— 可解释性冠军与模型基础组件核心思想通过一系列“if-else”规则对特征空间进行矩形划分追求划分后子集的“纯度”最高基尼系数或信息熵最小。竞赛角色单棵决策树容易过拟合不稳定在竞赛中直接使用通常不是最优解。但它有两个不可替代的作用一是提供无与伦比的可解释性你可以将生成的树规则直接呈现在论文中解释关键决策路径这非常符合数模论文“模型清晰”的要求二是作为随机森林和梯度提升树的基学习器。理解决策树是理解一切树集成模型的基础。随机森林Random Forest—— 稳健的“万金油”与性能基准核心思想Bagging 随机特征子空间。构建多棵决策树每棵树用自助采样Bootstrap的数据和随机选取的部分特征进行训练最终通过投票或平均得到预测结果。竞赛角色这通常是你在竞赛中第一个应该认真调优的强预测模型。它通过集成有效降低了方差防止过拟合对超参数相对不敏感默认参数下往往就能得到不错的结果。它既能处理回归也能处理分类能给出特征重要性排序为特征选择提供依据。在时间紧迫时花时间调优一个随机森林比尝试多个不稳定的模型更划算。支持向量机SVM—— 高维小样本的利器与边界追求者核心思想寻找一个超平面使得两类样本之间的“间隔”最大化。对于非线性问题通过核函数将数据映射到高维空间使其线性可分。竞赛角色当你的数据呈现“高维小样本”特点或者类别边界看起来比较清晰时SVM是王牌。它在图像、文本等领域的分类问题上传统表现很强。但它的调参惩罚系数C、核函数及参数更为复杂计算开销随样本量增大而急剧上升不适合百万级数据。在竞赛中如果数据规模适中且维度不低SVM是冲击更高分类精度的有力候选。2.3 网格搜索Grid Search模型调优的“自动化导航”选定算法后如何设定超参数凭感觉是竞赛大忌。网格搜索Grid Search就是我们的系统化调参工具。它的思想很简单为每个待调参数预设一个候选值列表计算所有这些参数组合的笛卡尔积然后用交叉验证评估每一组参数的性能选出最佳组合。在竞赛中网格搜索的使用策略至关重要粗搜与精搜首先进行大范围、步长较大的粗搜定位性能较好的参数区域。然后在该区域附近进行小步长、密集的精搜。参数空间设计不是所有参数都同等重要。对于随机森林n_estimators树的数量和max_depth树的最大深度是关键对于SVMC惩罚系数和gamma核函数参数如RBF核是核心。根据算法原理设计网格。计算成本权衡网格搜索的计算量是参数组合数乘以交叉验证折数。在时间有限的竞赛中要合理控制参数网格的大小。有时使用随机搜索RandomizedSearchCV在更大参数空间进行采样效率更高。3. 核心细节解析与Python实现要点理解了选型逻辑我们进入实操环节。这部分会深入每个算法的关键细节并给出scikit-learn实现时的核心代码片段和注意事项。3.1 KNN距离度量与K值选择的艺术KNN的核心在于两点如何定义“近邻”距离度量和“近邻”的数量K值。距离度量欧氏距离最常用但对量纲敏感因此数据标准化如Z-score标准化是KNN预处理的规定动作。曼哈顿距离对异常值更鲁棒。如果特征是二进制的汉明距离更合适。在sklearn中通过metric参数指定。K值选择这是KNN最大的调参点。K值过小如K1模型复杂对噪声和异常点极度敏感容易过拟合决策边界崎岖。K值过大模型变简单学习的近似误差增大可能欠拟合容易忽略数据中的局部细节。选择方法最可靠的方法是绘制误差曲线。在训练集或通过交叉验证上计算不同K值对应的误差如分类错误率或回归的MSE选择误差最低点对应的K。通常K值会取一个较小的奇数避免平票。from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler from sklearn.model_selection import cross_val_score, train_test_split import matplotlib.pyplot as plt import numpy as np # 假设 X, y 是你的特征和目标变量 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 1. 标准化标准化标准化 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 注意用训练集的参数转换测试集 # 2. 寻找最佳K值 k_range range(1, 31) cv_scores [] for k in k_range: knn KNeighborsClassifier(n_neighborsk) scores cross_val_score(knn, X_train_scaled, y_train, cv5, scoringaccuracy) cv_scores.append(scores.mean()) # 3. 可视化 plt.plot(k_range, cv_scores) plt.xlabel(Value of K for KNN) plt.ylabel(Cross-Validated Accuracy) plt.show() # 4. 选择最佳K并评估 best_k k_range[np.argmax(cv_scores)] print(fBest K: {best_k}) final_knn KNeighborsClassifier(n_neighborsbest_k).fit(X_train_scaled, y_train) test_score final_knn.score(X_test_scaled, y_test) print(fTest set accuracy: {test_score:.4f})实操心得KNN的预测速度在测试阶段很慢因为它需要计算待测样本与所有训练样本的距离。如果训练集很大1万预测会成为瓶颈。可以考虑使用KD-Tree或Ball Tree数据结构sklearn中通过algorithm参数设置来加速近邻搜索尤其是在特征维度不高20时效果显著。3.2 决策树剪枝与防止过拟合的关键单棵决策树如果不加限制会一直生长直到每个叶子节点都“纯”只包含一类样本这必然导致对训练数据的过拟合。剪枝Pruning是核心控制手段在sklearn中主要通过以下参数实现max_depth树的最大深度。这是最常用、最有效的预剪枝参数。从3、5、10开始尝试。min_samples_split一个节点至少需要多少个样本才能继续分裂。增大此值可以防止树在样本稀少的区域过度生长。min_samples_leaf一个叶子节点至少需要多少个样本。可以平滑模型对回归问题尤其重要。max_features寻找最佳分裂时考虑的最大特征数。可以引入随机性是随机森林的思想基础。from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.metrics import classification_report # 创建并训练决策树使用预剪枝参数 dt_clf DecisionTreeClassifier(max_depth5, # 控制树深 min_samples_split10, # 节点最小样本数 min_samples_leaf5, # 叶节点最小样本数 random_state42) dt_clf.fit(X_train, y_train) # 可视化决策树对于深度不大的树非常有用可放入论文附录 plt.figure(figsize(20,10)) plot_tree(dt_clf, feature_namesfeature_names, class_namestarget_names, filledTrue, roundedTrue) plt.show() # 评估 y_pred dt_clf.predict(X_test) print(classification_report(y_test, y_pred)) # 查看特征重要性可用于特征筛选 importances dt_clf.feature_importances_ indices np.argsort(importances)[::-1] print(Feature ranking:) for i in range(X.shape[1]): print(f{i1}. {feature_names[indices[i]]} ({importances[indices[i]]:.4f}))注意事项决策树对数据旋转敏感因为分裂轴是平行于坐标轴的对训练数据的微小变化也可能产生完全不同的树结构这就是其“高方差”特性。因此在竞赛中几乎从不单独使用未剪枝的决策树作为最终模型它的主要价值在于可解释性和作为基学习器。3.3 随机森林集成力量与特征重要性的深度利用随机森林是决策树的集成其强大源于两个随机性数据随机Bootstrap采样和特征随机随机特征子集。这保证了每棵树都有差异集成后能有效降低方差。关键参数解析n_estimators森林中树的数量。越多越好但计算成本也越高。通常从100开始增加到性能不再显著提升为止。竞赛中200-500是常见范围。max_depth每棵树的最大深度。与单棵树不同随机森林中的树通常允许生长得更深一些或设为None因为集成本身可以防止过拟合。但适当限制深度可以加速训练。min_samples_split/min_samples_leaf同决策树控制单棵树的复杂度。max_features每棵树分裂时随机考虑的特征数。这是随机森林最重要的参数之一对于分类问题默认值是sqrt(n_features)对于回归问题默认是n_features。调小此值可以增加树的多样性但可能增加偏差调大则相反。常用尝试值有sqrt,log2, 0.5, 0.8等。bootstrap是否使用Bootstrap采样。默认为True。如果设为False则将使用整个数据集构建每棵树但这样会降低多样性。from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, confusion_matrix # 初始化随机森林 rf_clf RandomForestClassifier(n_estimators200, max_depth15, min_samples_split5, min_samples_leaf2, max_featuressqrt, # 尝试调优 bootstrapTrue, n_jobs-1, # 使用所有CPU核心加速 random_state42, oob_scoreTrue) # 开启袋外估计 rf_clf.fit(X_train, y_train) # 袋外分数OOB Score是一个很好的无需额外验证集的泛化能力估计 print(fOOB Score: {rf_clf.oob_score_:.4f}) # 预测与评估 y_pred_rf rf_clf.predict(X_test) print(fTest Accuracy: {accuracy_score(y_test, y_pred_rf):.4f}) print(confusion_matrix(y_test, y_pred_rf)) # 特征重要性分析 - 随机森林的宝贵副产品 feature_importances pd.DataFrame({ feature: feature_names, importance: rf_clf.feature_importances_ }).sort_values(importance, ascendingFalse) print(feature_importances.head(10)) # 可以基于重要性进行特征筛选简化模型实操心得oob_score是随机森林一个非常实用的特性。它利用Bootstrap采样中未被选中的样本约37%作为每棵树的验证集综合起来得到一个对模型泛化性能的估计。在竞赛初期数据划分不确定时这个分数可以作为快速参考。另外设置n_jobs-1能充分利用多核CPU大幅提升训练速度。3.4 支持向量机SVM核函数与惩罚系数的博弈SVM的调参核心围绕着两个概念“间隔”的软硬由C控制和数据到高维空间的映射由核函数控制。关键参数解析C惩罚系数/正则化参数。C越大模型越不能容忍分类错误硬间隔越容易过拟合C越小对误分类的惩罚越小允许更多样本落在间隔内软间隔模型越简单可能欠拟合。它是SVM最重要的参数通常在对数尺度上进行搜索如[0.001, 0.01, 0.1, 1, 10, 100]。kernel核函数。线性核linear适用于近似线性可分的数据多项式核poly能力更强但参数多径向基函数核rbf是最常用的非线性核适用于大多数情况Sigmoid核在某些特定场景有用。竞赛中90%的情况从RBF核开始调优是稳妥的选择。gammaRBF核/Poly核参数定义了单个训练样本的影响范围。gamma值越大影响范围越小决策边界越曲折越可能过拟合gamma值越小影响范围越大决策边界越平滑可能欠拟合。通常也在对数尺度搜索如[0.001, 0.01, 0.1, 1, 10]。sklearn中默认是scale即1 / (n_features * X.var())这是一个不错的起点。degreecoef0多项式核参数分别控制多项式的次数和常数项。from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler # SVM对尺度敏感必须标准化 scaler StandardScaler() X_train_scaled_svm scaler.fit_transform(X_train) X_test_scaled_svm scaler.transform(X_test) # 创建一个基础的SVM模型RBF核 svm_clf SVC(kernelrbf, C1.0, gammascale, # 使用默认的scale random_state42, probabilityTrue) # 如果需要预测概率则设为True svm_clf.fit(X_train_scaled_svm, y_train) y_pred_svm svm_clf.predict(X_test_scaled_svm) print(fSVM Test Accuracy: {accuracy_score(y_test, y_pred_svm):.4f})重要提示SVM对特征尺度极度敏感因为它的优化目标依赖于特征向量间的点积或距离。如果一个特征的数值范围是0-10000另一个是0-1那么前者将完全主导决策边界。因此对SVM使用标准化StandardScaler或归一化MinMaxScaler是强制性的且必须用训练集的参数去转换测试集这是数据泄露的常见陷阱点。4. 网格搜索自动化调优实战手动调参效率低下且难以找到最优组合。下面我们以随机森林和SVM为例展示如何用GridSearchCV进行系统化调优。4.1 为随机森林构建参数网格对于随机森林我们重点调优树的数量、深度和分裂时考虑的特征数。from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid_rf { n_estimators: [100, 200, 300], max_depth: [10, 15, 20, None], # None表示不限制深度 min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], max_features: [sqrt, log2, 0.8] # 尝试不同策略 } # 创建基础模型 rf_base RandomForestClassifier(random_state42, n_jobs-1, oob_scoreTrue) # 创建GridSearchCV对象 # cv5表示5折交叉验证 scoring指定评估指标分类常用accuracy/f1回归用neg_mean_squared_error grid_search_rf GridSearchCV(estimatorrf_base, param_gridparam_grid_rf, cv5, scoringaccuracy, verbose2, # 输出详细过程 n_jobs-1) # 并行计算 # 在训练集上执行网格搜索 grid_search_rf.fit(X_train, y_train) # 输出最佳参数和最佳得分 print(fBest Parameters: {grid_search_rf.best_params_}) print(fBest Cross-Validation Score: {grid_search_rf.best_score_:.4f}) # 使用最佳模型在测试集上评估 best_rf_model grid_search_rf.best_estimator_ y_pred_best_rf best_rf_model.predict(X_test) print(fTest Set Accuracy with Best Model: {accuracy_score(y_test, y_pred_best_rf):.4f}) # 查看所有参数组合的结果可选 results_df pd.DataFrame(grid_search_rf.cv_results_) print(results_df[[params, mean_test_score, rank_test_score]].sort_values(rank_test_score).head())4.2 为SVMRBF核构建参数网格对于SVM我们主要调优C和gamma。from sklearn.svm import SVC # 确保数据已经标准化 # X_train_scaled_svm, X_test_scaled_svm 来自之前的标准化步骤 # 定义参数网格C和gamma在对数空间搜索 param_grid_svm { C: [0.01, 0.1, 1, 10, 100], gamma: [0.001, 0.01, 0.1, 1, scale, auto], # 包含scale和auto默认选项 kernel: [rbf] # 我们固定使用RBF核进行搜索 } svm_base SVC(random_state42, probabilityTrue) grid_search_svm GridSearchCV(estimatorsvm_base, param_gridparam_grid_svm, cv5, scoringaccuracy, verbose1, n_jobs-1) grid_search_svm.fit(X_train_scaled_svm, y_train) print(fSVM Best Parameters: {grid_search_svm.best_params_}) print(fSVM Best CV Score: {grid_search_svm.best_score_:.4f}) best_svm_model grid_search_svm.best_estimator_ y_pred_best_svm best_svm_model.predict(X_test_scaled_svm) print(fSVM Test Set Accuracy: {accuracy_score(y_test, y_pred_best_svm):.4f})4.3 网格搜索的进阶技巧与时间管理在竞赛中网格搜索非常耗时尤其是参数组合多、数据量大、模型复杂如SVM时。以下技巧可以帮助你高效管理先粗后精先用大跨度、少参数进行第一轮搜索锁定表现较好的区域。例如SVM的C先试[0.1, 1, 10]gamma先试[0.01, 0.1, 1]。利用热力图可视化对于两个核心参数如C和gamma可以将交叉验证的平均得分绘制成热力图直观看到性能最好的“山谷”或“高原”。# 以SVM为例假设我们已经有了一个粗略搜索的结果DataFrame cv_results pivot pd.pivot_table(results_df, valuesmean_test_score, indexparam_C, columnsparam_gamma) plt.figure(figsize(10,8)) sns.heatmap(pivot, annotTrue, fmt.3f, cmapviridis) plt.title(Grid Search CV Score Heatmap) plt.show()考虑随机搜索RandomizedSearchCV当参数空间很大时例如有连续型参数随机搜索在固定尝试次数下探索的范围更广有时比网格搜索更快找到近似最优解。并行计算确保GridSearchCV的n_jobs参数设置为-1使用所有CPU核心并考虑将交叉验证的cv参数设置为一个生成器以减少内存复制开销。早停策略对于迭代模型虽然决策树/随机森林不是迭代的但对于像XGBoost这类模型可以设置早停轮数。在网格搜索中可以将其作为一个参数来优化。5. 竞赛实战流程与模型融合思路在实际的数学建模竞赛中单纯调优一个模型往往不够。一个稳健的流程和模型融合策略能显著提升最终成绩。5.1 从数据到提交的端到端流程数据理解与清洗第1天上午仔细阅读赛题明确预测目标。进行缺失值处理删除、填充、异常值检测与处理、重复值处理。对于分类问题检查目标变量是否平衡。探索性数据分析与特征工程第1天下午-第2天上午这是提升模型性能最关键的一步。可视化数据分布、相关性。创造新特征如多项式特征、交互项、分组统计量、时间序列的滞后项等。对类别特征进行编码One-Hot, Label Encoding。将特征工程的结果应用于KNN建立基线模型快速验证特征的有效性。模型选型与初步训练第2天下午根据数据特征见第2章选择2-3个核心模型如随机森林、XGBoost、SVM。使用默认参数或简单参数进行快速训练和5折交叉验证比较它们的初步性能。此时可以开始运行一个粗粒度的网格搜索例如在随机森林上让它后台计算。模型调优与验证第2天晚上-第3天上午针对表现最好的1-2个模型进行精细化的网格搜索或随机搜索。使用交叉验证评估并观察是否过拟合训练得分远高于验证得分。务必保留一个完全独立的测试集或使用组委会提供的测试集用于最终评估不要在调参过程中用到它。模型融合与集成第3天下午如果时间允许尝试将调优好的不同模型进行融合。最简单的方法是投票法分类或加权平均法回归。例如将调优好的随机森林、SVM和梯度提升树的预测结果进行投票。from sklearn.ensemble import VotingClassifier # 假设我们已经有了调优好的三个模型 best_rf grid_search_rf.best_estimator_ best_svm grid_search_svm.best_estimator_ # 假设还有一个调好的XGBoost模型 best_xgb voting_clf VotingClassifier( estimators[(rf, best_rf), (svm, best_svm), (xgb, best_xgb)], votingsoft # 软投票使用预测概率 ) voting_clf.fit(X_train, y_train) final_accuracy voting_clf.score(X_test, y_test)结果分析与论文撰写全程第3天集中记录每一步的操作、参数选择的原因、模型性能的对比。将特征重要性、调参过程的热力图、模型性能对比表等关键图表放入论文。用决策树规则或特征重要性来解释你的模型这比黑箱模型更能获得评委青睐。5.2 常见陷阱与排查技巧实录即使流程正确实操中也会踩坑。以下是我和队友们用“熬夜”换来的经验问题1网格搜索跑了一天一夜还没结果排查检查参数网格大小。如果有5个参数每个参数有5个候选值那就是5^53125种组合乘以5折交叉验证就是15625次模型拟合对于SVM或大数据集这是灾难。解决大幅减少参数组合。优先调最重要的1-2个参数如RF的n_estimators和max_featuresSVM的C和gamma其他参数先用经验值固定。使用RandomizedSearchCV替代。问题2训练集准确率99%测试集只有60%明显过拟合了。排查首先检查是否有数据泄露比如在特征工程或标准化时错误地使用了测试集的信息。然后检查模型复杂度是否太高决策树深度太深、SVM的C太大/gamma太大。解决确保预处理如标准化、缺失值填充的拟合fit操作只针对训练集然后用训练集得到的参数去转换transform测试集。增加正则化强度减小C增大gamma的倒数限制树深度增加min_samples_split等。问题3SVM训练速度奇慢无比。排查样本量是否过大1万特征维度是否过高解决对于大数据集考虑使用线性核kernellinear或使用SGDClassifier损失函数设置为hinge来近似线性SVM。也可以使用特征选择如基于随机森林的重要性排序降低维度。sklearn的SVC默认使用基于libsvm的算法对于大规模数据确实较慢。问题4多分类问题中某个类别始终预测不准。排查检查类别是否不平衡。使用value_counts()查看各类别样本数。解决对于树模型可以设置class_weightbalanced让算法自动调整类别权重。对于SVM可以在SVC中设置class_weight参数。更根本的方法是使用过采样如SMOTE或欠采样技术来处理数据本身。问题5模型在本地交叉验证很好但提交后线上成绩很差。排查最可能的原因是本地验证集分布与线上测试集分布不一致。你的交叉验证划分是随机的可能没有很好地代表真实的数据分布特别是时间序列数据不能随机划分。解决对于时间序列预测必须使用前向验证TimeSeriesSplit。对于其他数据可以尝试分层抽样StratifiedKFold来保持类别比例。如果可能向组委会了解测试集的构建方式尽可能模拟其分布来划分本地验证集。最后再分享一个在竞赛最后关头提升成绩的小技巧堆叠Stacking。如果你有几个表现不错且差异性较大的模型比如树模型、SVM、神经网络可以尝试用它们的预测结果作为新特征训练一个次级模型通常用简单的逻辑回归或线性回归。这往往能比简单的投票法获得更好的效果但实现更复杂且要小心过拟合。在华为杯这种级别的竞赛中一个精心设计的Stacking模型往往是冲刺一等奖的“杀手锏”。实现时务必使用交叉验证的方式生成次级模型的训练数据防止数据泄露。这个过程就像让几个各有所长的专家基模型先独立判断然后再请一位资深裁判元模型来综合他们的意见做出最终裁决。
返回列表