问题:
之前在lightgbm中使用了早停early_stopping参数,于是我也想在xgboost中使用类似的方法进行早停,从其他地方找到的代码大致都是这样写的:
from xgboost import XGBClassifier
param = {"objective": "multi:softmax",
"num_class": 5}
clf = XGBClassifier(**param)
clf.fit(X_train, y_train, eval_set=[(x_val, y_val)], early_stopping_rounds=100)
preds = model.predict(X_val)
acc = accuracy_score(y_val, preds)
此时出现了错误,错误为
WARNING: ../auc.cc:330: Dataset is empty, or contains only positive or negative samples.
(数据集为空,或仅包含正样本或负样本。)
可能的原因:
在处理分类问题时,错误地设置了类别数。例如,在处理二分类问题时,误将n_classs参数设置错误5.
(原因二:类别极不均衡,导致划分之后的训练集中只有一个类别的样本)
解决方法:将类别数修改正确即可
from xgboost import XGBClassifier
param = {"objective": "multi:softmax",
"num_class": 2}
clf = XGBClassifier(**param)
clf.fit(X_train, y_train, eval_set=[(x_val, y_val)], early_stopping_rounds=100)
preds = model.predict(X_val)
acc = accuracy_score(y_val, preds)
疑问:
发现即便错误地将n_classs参数设置为5,但是只要不使用early_stooping_rounds参数,就不会出现上方的错误,不知道为什么会这样。。
from xgboost import XGBClassifier
param = {"objective": "multi:softmax",
"num_class": 5}
clf = XGBClassifier(**param)
clf.fit(X_train, y_train)
preds = model.predict(X_val)
acc = accuracy_score(y_val, preds)
这样就不会报错。。