#python #scikit-learn #random-forest
Вопрос:
Я прочитал все предыдущие связанные с этим вопросы и ответы здесь об этой ошибке, возникающей при использовании случайного леса с отсутствием бесконечных значений в наборе данных. Перепробовал все возможности, ни одна не работает. Это мой код:
merge_df.head()
Out[21]:
high low close ... month day hour
timestamp ...
2020-11-13 17:00:00 0.004434 -0.005691 0.004348 ... 11 13 17
2020-11-13 18:00:00 0.002759 -0.002144 0.002122 ... 11 13 18
2020-11-13 19:00:00 0.005888 -0.001588 0.002965 ... 11 13 19
2020-11-13 20:00:00 0.000000 -0.008531 -0.008235 ... 11 13 20
2020-11-13 21:00:00 0.005195 -0.000362 0.004067 ... 11 13 21
[5 rows x 50 columns]
# Prepare training/test DataFrames.
train_end = pd.to_datetime('2021/04/10 12:00:00')
test_start = pd.to_datetime('2021/04/10 13:00:00')
target = 'next'
train_df = merge_df.loc[:train_end]
test_df = merge_df.loc[test_start:]
X_train = train_df.copy().drop(target, axis=1).values
X_test = test_df.copy().drop(target, axis=1).values
y_train = train_df[target].values
y_test = test_df[target].values
X_train[:] = np.nan_to_num(X_train)
# Perform grid search for hyperparameters.
def Grid_Search_CV_RFR(X_train, y_train):
reg = RandomForestRegressor()
param_grid = {
"n_estimators" : [10,50,100,500],
"max_features" : ["auto", "sqrt", "log2"],
"min_samples_leaf" : [1,5,10,20]
}
tss_splits = TimeSeriesSplit(n_splits=10).split(X_train)
grid = GridSearchCV(reg, param_grid, cv=tss_splits, verbose=0)
#grid = GridSearchCV(reg, param_grid, cv=3, verbose=0)
grid.fit(X_train, y_train)
return grid.best_score_ , grid.best_params_
best_score, best_params = Grid_Search_CV_RFR(X_train, y_train)
mf = best_params['max_features']
msl = best_params['min_samples_leaf']
ne = best_params['n_estimators']
# Fit RFR with best parameters from grid search.
rfr = RandomForestRegressor(n_estimators=ne, max_features=mf, min_samples_leaf=msl, random_state=10)
rfr.fit(X_train, y_train)
Когда я запускаю функцию поиска наилучших параметров, она выдает:
ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
Есть какие-нибудь предложения?
Ответ №1:
Похоже, что некоторые из ваших наборов данных содержат, как следует из исключения, значения NaN или бесконечности. Я заметил, что вы ссылаетесь np.nan_to_num
только на свой набор данных поездов X_train
. Возможно, вам захочется добавить X_test[:] = np.nan_to_num(X_test)
перед запуском поиска по сетке.
Вы также можете проверить наличие Hans, запустив train_df.isnull().sum()
программу, которая подсчитывает нулевые значения в каждом столбце, помогая вам отлаживать ваши данные. Вы также можете (или, возможно, обработать) любой столбец типа datetime
.
Ответ №2:
Нашел решение, у меня не было пропущенных значений, кроме бесконечных, и решил с помощью этого:
train_df[train_df==np.inf]=np.nan
train_df.fillna(train_df.mean(), inplace=True)
Комментарии:
1. В частности, мой ответ был правильным, верно? «Похоже, что некоторые из ваших наборов данных содержат, как следует из исключения, значения NaN или бесконечности».