You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Scikit-learn随机森林回归器多输出预测仅返回单值问题求助

解决Random Forest Regressor双变量预测仅返回单值的问题

嘿,我看到你遇到了Random Forest多输出预测的问题,其实根源出在目标变量的构造方式错误,导致scikit-learn无法识别这是一个双输出回归任务。让我一步步帮你排查和修复:

1. 核心问题:目标变量的参数传递错误

你创建目标变量的代码:

y = np.array(mastertable["CTV_CONCORDATO_BIS2"], mastertable["CTV_CONCORDATO_BIS3"]).T

这里犯了一个关键的参数传递错误:np.array()的第一个参数需要是一个数组型的序列(比如列表),但你把两列数据当成了两个独立参数传入。第二个参数实际是dtype(数据类型)参数,这就导致生成的y只是第一列的单变量数组,形状是(n_samples,),而非预期的(n_samples, 2)二维数组——模型自然只会按单变量任务处理。

2. 修正目标变量的构造方式

有两种简单的正确方式来生成双输出目标变量:

  • 方式一:把两列放在列表中传入np.array
    y = np.array([mastertable["CTV_CONCORDATO_BIS2"], mastertable["CTV_CONCORDATO_BIS3"]]).T
    
  • 方式二:直接从DataFrame提取多列并转成数组(更简洁)
    y = mastertable[["CTV_CONCORDATO_BIS2", "CTV_CONCORDATO_BIS3"]].values
    

修正后,你可以先检查y_train的形状确认:

print(y_train.shape)

正常输出应该是(训练样本数量, 2),说明模型能识别这是双输出任务。

3. 修正后的完整代码示例

import numpy as np
from sklearn.ensemble import RandomForestRegressor
import time

# 正确构造双输出目标变量
y = mastertable[["CTV_CONCORDATO_BIS2", "CTV_CONCORDATO_BIS3"]].values
# 假设X_train、X_test、y_train、y_test已完成数据集拆分
print("y_train形状:", y_train.shape)  # 确认是(n_samples, 2)

# 拟合模型(注意random_state用整数更规范,避免歧义)
forest = RandomForestRegressor(random_state=42, max_depth=15, n_estimators=50)
start = time.time()
forest.fit(X_train, y_train)
end = time.time()
print(f"拟合耗时: {end - start:.2f}秒")

# 训练集预测验证
y_pred_train = forest.predict(X_train)
print("训练集预测结果形状:", y_pred_train.shape)  # 应为(n_train_samples, 2)

# 单样本预测
a = X.iloc[1, :]  # X是DataFrame时,用iloc取行更安全
Xnew = [a.values]  # 转换成模型可接受的格式
ynew = forest.predict(Xnew)
print(f"预测结果: {ynew[0]}")  # 现在会输出两个值,比如[val1, val2]

4. 额外小提示

  • 确保X_trainX_test(n_samples, n_features)的二维数组,避免维度不匹配;
  • random_state建议传入整数(比如42),False会被强制转为0,用整数可读性更强;
  • 提取样本时,如果X是DataFrame,优先用iloc/loc,避免直接索引导致的维度错误。

这样修改后,模型就能正确输出双变量的预测结果了。

内容的提问来源于stack exchange,提问作者Niccolò Gava

火山引擎 最新活动