python-3.x - 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
现在,当我将此问题更改为分类问题时,我确实得到了相对较好的符号预测。但是,当我将其更改为回归时,我会得到一个固定的结果。有什么建议可以改进吗?
解决方案
很可能的情况是,只有两个特征,没有足够的信息来进行数字预测(即回归);在“较温和”的分类设置中(如您所说,仅预测符号)您取得了一些成功。
功能数量少并不是唯一可能的问题。从您发布的几个样本来看,可以很容易地看到,例如,您的前 5 个样本具有相同的[1.0, 0.0002]
特征(另一方面,您的样本 #3 ( ) 和 #29587 ( ) 看起来非常不同,但它们最终具有相同的值。y
[-0.0002, 0.0003]
[1.0, 0.0002]
[30.0, 0.0022]
y
0.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
.
推荐阅读
- python - 在 Python 中将字符串从 sha1 Hash 转换为 base 64,根据 VBA 示例返回结果
- laravel - Laravel Eloquent:一对多的关系与不同的
- node.js - Angular 通用慢速 TTFB - npm run serve:ssr
- amazon-web-services - 使用 AWS CDK 创建 AWS DMS 任务
- javafx - JavaFX 字体中的抗锯齿(字体呈现非常清晰锐利但不平滑)
- javascript - 分享对话 - Facebook SDK
- python - Python 库在 Mac 上的终端中不起作用
- amazon-web-services - AWS dynamoDb 分页限制
- linear-regression - 使用线性系统 Ax =b 的预处理器减少误差
- javascript - 客户端可以修改javascript代码吗?