使用Scikit-learn回归模型预测失效的问题排查求助
解决思路:从数据预处理到特征工程逐一排查
1. 日期特征的错误处理
- 直接把原始
Date字符串(比如"2024-05-20")喂给模型是致命问题:树模型无法解析字符串,会默认把不同日期当成离散类别,导致特征权重完全混乱。 - 正确处理方式:
- 转成连续数值:比如计算日期距离数据集起始日的天数(
df['Date'] = (pd.to_datetime(df['Date']) - pd.to_datetime(df['Date']).min()).dt.days)。 - 提取周期特征:比如年、月、星期几,注意星期几这类循环特征要用独热编码或序数编码,不能直接用数字1-7。
- 转成连续数值:比如计算日期距离数据集起始日的天数(
2. 训练集与测试集的时间拆分错误
- 绝对不能用
train_test_split随机拆分:股票价格是时间序列,未来数据的分布和历史有漂移,随机拆分会导致数据泄露(模型提前看到了未来数据)。 - 正确拆分:严格按时间顺序划分,比如用2023年及之前的数据训练,2024年的数据测试,确保训练数据的时间全部早于测试数据。
3. 特征与目标的相关性验证
- 先做相关性分析:用
df.corr()查看OpenValue、TradeVolume、处理后的日期特征和CloseValue的相关系数。如果相关系数接近0,说明这些特征本身没法有效预测收盘价,必须补充特征。 - 补充特征方向:
- 技术指标:移动平均线(MA5、MA20)、相对强弱指标(RSI)、成交量变化率等。
- 滞后特征:前1天/前3天的收盘价、开盘价(时间序列预测中,滞后特征才是核心)。
4. 测试集数据合理性检查
- 确认测试集的
OpenValue、TradeVolume是否和训练集分布一致:如果测试集成交量突然是训练集的10倍,模型肯定会输出离谱结果。 - 检查缺失值:测试集的特征缺失会导致模型输出异常,提前用均值、中位数或插值法填充。
5. 模型基础参数调优
- 虽然换模型没用,但可以先做基础调整:
- GradientBoosting调小
learning_rate,增加n_estimators,避免过拟合。 - 限制
max_depth,防止模型过度拟合训练集噪声。 - 用
GridSearchCV做简单参数搜索,排除参数不合理的可能。
- GradientBoosting调小
6. 基准线对比
- 先跑个最简单的基准模型:比如预测第二天收盘价等于当天收盘价(随机游走模型)。如果你的模型连这个基准都不如,说明特征或数据处理肯定有问题。
内容的提问来源于stack exchange,提问作者kryer
相关产品推荐
相关产品推荐

