XGBoost 无法预测简单的正弦函数

问题描述 投票:0回答:0

我创建了一个非常简单的函数来测试 XGBoost。

X 是一个数组,每行包含 1000 行“7*np.pi”。 Y 就是“1 + 0.5*np.sin(x)

我将数据集分成 800 行训练行和 200 行测试行。 Shuffle 必须为 False 以模拟未来的事件,确保最后 200 行保留用于测试。

import numpy as np
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt 
from sklearn.metrics import mean_squared_error as MSE
from xgboost import XGBRegressor

N = 1000                       # 1000 rows
x = np.linspace(0, 7*np.pi, N) # Simple function
y = 1 + 0.5*np.sin(x)          # Generate simple function sin(x) as y

# Train-test split, intentionally use shuffle=False to simulate time series
X = x.reshape(-1,1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, shuffle=False)
### Interestingly, model generalizes well if shuffle=False
#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, shuffle=False)

XGB_reg = XGBRegressor(random_state=42)
XGB_reg.fit(X_train,y_train)

# EVALUATE ON TRAIN DATA
yXGBPredicted = XGB_reg.predict(X_train)
rmse = np.sqrt(MSE(y_train, yXGBPredicted))
print("RMSE TRAIN XGB: % f" %(rmse))

# EVALUATE ON TEST DATA
yXGBPredicted = XGB_reg.predict(X_test)
# METRICAS XGB
rmse = np.sqrt(MSE(y_test, yXGBPredicted))
print("RMSE TEST XGB: % f" %(rmse))

# Predict full dataset
yXGB = XGB_reg.predict(X)

# Plot and compare
plt.style.use('fivethirtyeight')
plt.rcParams.update({'font.size': 16})
fig, ax = plt.subplots(figsize=(10,5))
plt.plot(x, y)
plt.plot(x, yXGB)
plt.ylim(0,2)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

我在前 800 行上训练模型,然后预测接下来的 200 行。

我期待测试数据有很好的 RMSE,但它没有发生。

我很惊讶地看到 XGBoost 简单地在预测的所有行上重复了训练集的最后一个值(见图表)。

知道为什么这不起作用吗?

Test data in BLUE; Predictions in RED

xgboost
© www.soinside.com 2019 - 2024. All rights reserved.