Я пытаюсь применить машинное обучение к прогнозированию акций и сталкиваюсь с проблемой масштабирования будущей невидимой (намного более высокой) стоимости закрытия акций.
Допустим, я использую случайную форрест-регрессию при прогнозировании цены акций. Я разбиваю данные на набор поездов и набор тестов.
Для набора поездов, я использую стандартную шкалу, и подгоняю и трансформирую
И тогда я использую регрессор, чтобы соответствовать
Для набора тестов я использую стандартное средство масштабирования и выполняю преобразование
А затем я использую регрессор для прогнозирования и сравниваю с тестовой меткой
Если я нанесу прогноз и метку теста на график, прогноз будет максимальным или максимальным. Проблема в том, что стандартизатор подходит для набора поездов, набор тестов (позднее на временной шкале) имеет гораздо более высокое значение, алгоритм не знает, что делать с этими экстремальными данными
def test(X, y):
# split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, shuffle=False)
# preprocess the data
pipeline = Pipeline([
('std_scaler', StandardScaler()),
])
# model = LinearRegression()
model = RandomForestRegressor(n_estimators=20, random_state=0)
# preprocessing fit transform on train data
X_train = pipeline.fit_transform(X_train)
# fit model on train data with train label
model.fit(X_train, y_train)
# transform on test data
X_test = pipeline.transform(X_test)
# predict on test data
y_pred = model.predict(X_test)
# print(np.sqrt(mean_squared_error(y_test, y_pred)))
d = {'actual': y_test, 'predict': y_pred}
plot_data = pd.DataFrame.from_dict(d)
sns.lineplot(data=plot_data)
plt.show()
Что делать с масштабированием?
Это то, что я получил для построения прогноза, фактическая цена закрытия против времени