使用非常不平衡的数据进行广告点击预测

时间:2017-05-26 16:12:17

标签: python machine-learning xgboost balance

我有一些非常不平衡的数据(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))

1 个答案:

答案 0 :(得分:0)

似乎大多数在线使用XGBoost(以及其他方式)处理不平衡数据的建议是通过搜索进行超参数调整。

您可以使用scikit-learn' GridSearchCVhttp://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)