RandomForestRegressor выплевывает только 1 прогноз - PullRequest
0 голосов
/ 30 марта 2020

Я делаю первые шаги в машинном обучении и пытаюсь работать с 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-data:

       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

Теперь, когда я изменяю эту задачу на задачу классификации, я получаю относительно хорошее предсказание знака. Однако, когда я изменяю это на регрессию, я получаю стационарный результат. Любые предложения, как я могу улучшить это?

С уважением

1 Ответ

0 голосов
/ 31 марта 2020

Вполне может быть, что при наличии только двух признаков недостаточно информации для предсказания чисел c (т. Е. Регрессии); в то время как в «более мягкой» классификации (предсказывая только знак, как вы говорите) у вас есть некоторый успех.

Небольшое количество функций - не единственно возможная проблема; Судя по нескольким сэмплам, которые вы разместили, легко увидеть, что, например, ваши первые 5 сэмплов имеют идентичные функции ([1.0, 0.0002]), в то время как их соответствующие значения y могут быть где угодно в [-0.0002, 0.0003] - и ситуация аналогично для ваших образцов # 29583 и 29584. С другой стороны, ваши образцы # 3 ([1.0, 0.0002]) и # 29587 ([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.

...