Я пытаюсь использовать ансамблевый регрессор для прогнозирования производства на основе нескольких измерений материала. Мои данные ежегодные, начиная с 1965 года. (Некоторые детали удалены и используются случайные данные, потому что это для рабочего проекта с использованием конфиденциальных данных.)
Я сократил свой код до минимума, и я все еще вижу проблему:
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor
from xgboost.sklearn import XGBRegressor
X_past = pd.DataFrame(index = range(1965, 2020), data = dict(
A = np.random.randint(4170, 19091, size = 55),
B = np.random.randint(74, 337, size = 55)
))
X_future = pd.DataFrame(index = range(2020, 2023), data = dict(
A = np.random.randint(4170, 19091, size = 3),
B = np.random.randint(74, 337, size = 3)
))
y_past = pd.DataFrame(index = range(1965, 2020), data = dict(
C = np.random.randint(12163, 42580, size = 55)
))
predictions = None
predictions = pd.DataFrame()
i = 0
while i < 10:
i += 1
reg = None
y_pred = None
X = X_past.values
y = y_past.values.ravel()
#reg = RandomForestRegressor(n_estimators = 300)
reg = GradientBoostingRegressor(n_estimators = 300)
#reg = XGBRegressor(n_estimators = 640, silent = True)
reg.fit(X, y)
y_pred = reg.predict(np.array(X_future))
predictions = predictions.append(pd.Series(y_pred), ignore_index = True,)
predictions.columns = [2020, 2021, 2022]
predictions['Row-wise Duplicates'] = (predictions[2021] == predictions[2022])
predictions
Это дает такие результаты, как:
Как видите, несмотря на то, что на каждой итерации я подгоняю заново, я вижу много повторяющихся значений.
Я также иногда вижу дублирование значений по годам (обычно 2021 год совпадает с 2022 годом, поэтому я рассчитываю столбец дубликатов по строкам):
Что я делаю не так? Почему я вижу такие дубликаты? И как я могу это исправить?
О, упс... Да, склерн. XGBoostingRegressor происходит от xgboost.
Вы даете алгоритму одни и те же обучающие входные данные и одни и те же тестовые входные данные на каждой итерации, почему вы ожидаете другой результат?
Алгоритм, который вы используете, с параметрами, которые вы используете, не имеет случайного внутреннего элемента. Таким образом, предоставление ему одного и того же обучающего набора и одного и того же набора тестов (как вы делаете в своем коде) приведет к тем же результатам.
Вы можете использовать параметр subsample
со значением меньше, чем 1
, чтобы он использовал другую случайную подвыборку для обучения каждого базового ученика (см. документацию https://scikit-learn.org/stable/modules/generated/sklearn.ensemble .GradientBoostingRegressor.html)
Итак, если вы замените свою строку на эту:
reg = GradientBoostingRegressor(n_estimators = 300, subsample = 0.9)
Алгоритм будет использовать случайное подмножество 90% ваших данных для обучения каждого ученика, и вы будете получать разные результаты при каждом вызове. Вы все еще можете сделать результаты воспроизводимыми, если объедините его с параметром random_state
.
Это имеет смысл, но тогда почему иногда это отличается от ряда к ряду? Кроме того, почему иногда дублируются результаты для столбцов 2021 и 2022 годов? Их следует предсказывать по трем различным массивам признаков.
Я не знаю, при вводе вашего вопроса он выдает идентичные строки. Но я запускаю его всего несколько раз.
Вы уверены, что разные строки не создаются, когда вы просто запускаете скрипт несколько раз (в отличие от итерации с i по j)? Потому что это вызвано случайным вводом, который вы создаете... извините, если это тривиально, но иногда простые вещи трудно увидеть :)
Вы должны хотя бы указать, откуда вы импортируете
GradientBoostingRegressor
(я думаю, scikit-learn, но я должен догадываться? :))