我正在使用Python v3.7和xgboost v0.81。从2015年到2019年,我每个星期都有美国州的连续数据(y)。我正在尝试将以下功能回归到y:年,月,周,地区(已编码)。我将火车设置为2018年8月及之前,测试时间为2018年9月及以后。当我以这种方式训练模型时,会发生两件事:
将任何功能都固定到单个变量可以使模型进行适当的训练,并且先前遇到的两个奇怪的问题都消失了。例如年== 2017或地区== 28
X = df[['year', 'month', 'week', 'region_encoded']]
display(X)
y = df.target
display(y)
X_train, X_test, y_train, y_test = train_test_split(X.values, y.values, test_size=0.1)
model = XGBRegressor(n_jobs=-1, n_estimators=1000).fit(X_train, y_train)
display(model.predict(X_test)[:20])
display(model.feature_importances_)
year month week region_encoded
0 2015 10 40 0
1 2015 10 40 1
2 2015 10 40 2
3 2015 10 40 3
4 2015 10 40 4
0 272.0
1 10.0
2 290.0
3 46.0
4 558.0
Name: target, dtype: float64
array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], dtype=float32)
array([nan, nan, nan, nan], dtype=float32)
答案 0 :(得分:1)
如果目标变量中只有NaN
,即使只有一个,也足以打破许多机器学习算法。这通常是因为在许多ML算法(例如计算派生类)的更新步骤中,目标变量中存在未处理的NaN
时,NaN
会传播。虽然,我不能过多地说明XGBoost的哪个步骤。
例如,线性回归的解析解。
import numpy as np
import numpy.linalg as la
from scipy import stats
y = np.array([0, 1, 2, 3, np.nan, 5, 6, 7, 8, 9])
x = stats.norm().rvs((len(y), 3))
# Main effects estimate
m_hat = la.inv(x.T @ x) @ x.T @ y
>>> [nan nan nan]