我有一些非常不平衡的数据(3%正面),我正在使用xgboost做一些学习。该文件非常大,我之前尝试过逻辑回归,randomforest和svm(仅使用整个数据的一些子样本,因为数据太大)。为了解决数据不平衡问题,我尝试了使用SMOTE(这使数据超大)的类权重和平衡数据。但这似乎都没有帮助。当我使用上述任何一种方法时,准确率会变差。
当我尝试xgboost并尝试像建议的文档那样调整scale-positive-weight参数时,它只会使准确性变差。总的来说,我的所有模型都比预测所有0更糟糕。
无论如何我可以解释这种数据不平衡吗?
这是我的xgboost代码
x = data[:,3:]
y = data[:,2]
from xgboost import XGBClassifier
model = XGBClassifier(scale_pos_weight = np.sum(y==0)/np.sum(y==1))
model.fit(x, y, eval_metric="auc")
# make predictions for test data
y_pred = model.predict(x)
#predictions = [round(value) for value in y_pred]
# evaluate predictions
accuracy = accuracy_score(y, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
答案 0 :(得分:0)
似乎大多数在线使用XGBoost(以及其他方式)处理不平衡数据的建议是通过搜索进行超参数调整。
您可以使用scikit-learn' GridSearchCV
:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
但是,现在有比网格搜索更好的方法来探索特征空间,例如: scikit-optimize:https://scikit-optimize.github.io/#skopt.BayesSearchCV
示例:(这是一个回归量,对于分类来说,位的工作方式相同
from xgboost import XGBRegressor
from skopt import BayesSearchCV
n_features = X_train.shape[1] - 1
sum_pos = np.sum(y_train==1)
sum_neg = np.sum(y_train==0)
opt = BayesSearchCV(
XGBRegressor(objective='reg:linear', n_jobs=4, scale_pos_weight = sum_neg/sum_pos),
{
'n_estimators': (1, 50),
'max_depth': (1, 20),
'learning_rate': (10**-5, 10**0, "log-uniform"),
'min_child_weight': (1, 5),
'max_delta_step': (1, 10)
},
n_iter=8, # may want to have more iterations here... :)
verbose=99
)
opt.fit(X_train[:,1:], y_train)