首页 > 解决方案 > RandomForestRegressor 仅吐出 1 个预测

问题描述

我正在尝试使用 RandomForestRegressor。使用 RandomForestClassifier 我似乎能够收到 +/-1 的可变结果。但是,使用 RandomForestRegressor 时,我只能在尝试预测时得到一个常数值。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from pandas_datareader import data
import csv
import statsmodels.api as sm
data = pd.read_csv('C:\H\XPA.csv')
data['pct move']=data['XP MOVE']
# Features construction
data.dropna(inplace=True)
# X is the input variable
X = data[[ 'XPSpread', 'stdev300min']]
# Y is the target or output variable
y = data['pct move']
# Total dataset length
dataset_length = data.shape[0]
# Training dataset length
split = int(dataset_length * 0.75)
# Splitiing the X and y into train and test datasets
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
clf = RandomForestRegressor(n_estimators=1000)
# Create the model on train dataset
model = clf.fit(X_train, y_train)
from sklearn.metrics import accuracy_score
data['strategy_returns'] = data['pct move'].shift(-1) * -model.predict(X)
print(model.predict(X_test))

输出:

[4.05371547e-07 4.05371547e-07 4.05371547e-07 ... 4.05371547e-07
 4.05371547e-07 4.05371547e-07]

输出是固定的,而 y 数据是这样的:

0       -0.0002
1        0.0000
2       -0.0002
3        0.0002
4        0.0003
          ...  
29583    0.0014
29584    0.0010
29585    0.0046
29586    0.0018
29587    0.0002

x-数据:

       XPSpread  stdev300min
0           1.0       0.0002
1           1.0       0.0002
2           1.0       0.0002
3           1.0       0.0002
4           1.0       0.0002
...         ...          ...
29583       6.0       0.0021
29584       6.0       0.0021
29585      19.0       0.0022
29586       9.0       0.0022
29587      30.0       0.0022

现在,当我将此问题更改为分类问题时,我确实得到了相对较好的符号预测。但是,当我将其更改为回归时,我会得到一个固定的结果。有什么建议可以改进吗?

标签: python-3.xmachine-learningscikit-learnrandom-forest

解决方案


很可能的情况是,只有两个特征,没有足够的信息来进行数字预测(即回归);在“较温和”的分类设置中(如您所说,仅预测符号)您取得了一些成功。

功能数量少并不是唯一可能的问题。从您发布的几个样本来看,可以很容易地看到,例如,您的前 5 个样本具有相同的[1.0, 0.0002]特征(另一方面,您的样本 #3 ( ) 和 #29587 ( ) 看起来非常不同,但它们最终具有相同的值。y[-0.0002, 0.0003][1.0, 0.0002][30.0, 0.0022]y0.0002

如果您的数据集的其余部分具有相似的特征,则它可能不适合像样的回归建模。

最后但并非最不重要的一点是,如果您的数据以任何方式沿着某些特征“排序”(它们看起来像,但当然我不能确定这么小的样本),情况会变得更糟。我建议使用 拆分您的数据train_test_split,而不是手动进行:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
     X, y, test_size=0.25, shuffle=True)

希望由于洗牌,这将导致更有利的分裂。您可能希望在改组和拆分之前从数据框中删除重复的行(它们从来都不是一个好主意) - 请参阅pandas.DataFrame.drop_duplicates.


推荐阅读