我正在研究数据集中有 30k 行的回归问题,决定使用 XGBoost 主要是为了避免为快速原始模型处理数据。而且我在进行交叉验证时注意到,火车的 R² 和 CV 的 R² 之间存在显着差异 => 明显的过度拟合迹象。这是我的 CV 代码:
oof_train = np.zeros((len(train_maisons)))
ind = 0
cv_scores = []
train_scores=[]
for ind,(ind_train,ind_val) in (enumerate (kfolds.split(X,y))):
#ind=+1
X_train,X_val = X.iloc[ind_train],X.iloc[ind_val]
y_train,y_val = y.iloc[ind_train],y.iloc[ind_val]
xgb = XGBRegressor(colsample_bytree=0.6,gamma=0.3,learning_rate=0.1,max_depth=8,min_child_weight=3,subsample=0.9,n_estimators=1000,objective='reg:squarederror',eval_metric='rmse')
xgb.fit(X_train,y_train)
val_pred = xgb.predict(X_val)
train_pred = xgb.predict(X_train)
oof_train[ind_val] += val_pred
score_fold_validation=np.sqrt(mean_squared_error(y_val, val_pred))
score_fold_train=np.sqrt(mean_squared_error(y_train, train_pred))
train_scores.append(score_fold_train)
cv_scores.append(score_fold_validation)
#r2_score(y_val, grid.best_estimator_.predict(X_val))
print('Iteration : {} - CV Score : {} - R² Score CV : {} - Train Score : {} - R² Score train : {}'.format(str(ind+1),score_fold_validation,r2_score(y_val, val_pred),score_fold_train,r2_score(y_train,train_pred)))
end_train_score=np.mean(train_scores)
train_scores.append(end_train_score)
end_cv_score=np.mean(cv_scores)
使用 SquaredError 作为目标(损失函数),使用 RMSE 和 R² 进行评估,以下是指标的输出:
CV Score : 96416.84137549331 - R² Score CV : 0.6545903695464426 - Train Score : 30605.655815355676 - R² Score train : 0.9730563148067477
我的问题:这是否被认为是一个压倒性的过度拟合问题?还是温和?我应该做更多的特征工程还是更多地调整超参数?(将 GridSearchCV 用于当前的超参数)。最后一件事,我在 X_train 上的结果是否表明我的特征信息量足以学习目标?还是R²火车分数有偏差?
注意:在这段代码中,我对 CV 使用了10 折。用过3 折给了我一个更好的简历结果,如果有人也能解释一下,那就太好了。