如何使用sklearn对不平衡数据集进行Logistic回归评估?

时间:2020-03-17 11:30:34

标签: python scikit-learn logistic-regression evaluation imbalanced-data

我使用python scikit-learn进行Logistic回归。我有一个不平衡的数据集,其中2/3个数据点的标签y = 0,而1/3的标签y = 1。

我进行分层拆分:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, shuffle=True, stratify=y)

我用于hyperprameter搜索的网格是:

grid = {
         'penalty': ['l1', 'l2', 'elasticnet'],
         'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0],
         'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']
        }

然后我进行包含class_weight='balanced'的网格搜索:

grid_search = GridSearchCV(
                estimator=LogisticRegression(
                                            max_iter=200,
                                            random_state=1111111111,
                                            class_weight='balanced',
                                            multi_class='auto',
                                            fit_intercept=True
                                            ),
                param_grid=grid,
                scoring=score,
                cv=5,
                refit=True
            )

我的第一个问题是关于score。这是一种选择GridSearchCV中“最佳”分类器以找到最佳超参数的方法。 自从我使用class_weight='balanced'执行LogisticRegression以来,应该使用传统的score='accuracy',还是仍然需要使用score='balanced_accuracy'?为什么?

所以我继续寻找最好的分类器:

best_clf = grid_search.fit(X_train, y_train)
y_pred = best_clf.predict(X_test)

现在我要计算评估指标,例如准确性(再次)和f1分数。

第二个问题:我在这里需要使用“正常”精度/ f1还是平衡/加权精度/ f1?

“普通”:

acc = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred, pos_label=1, average='binary')

或平衡/加权:

acc_weighted = balanced_accuracy_score(y_test, y_pred, sample_weight=y_weights)
f1_weighted = f1_score(y_test, y_pred, sample_weight=y_weights, average='weighted')

如果我应该使用平衡/加权版本,则第三个问题与参数sample_weight=y_weights有关。 我应该如何设置权重?要获得平衡(尽管我说过我不确定是否已经达到平衡或未设置class_weight='balanced'),我应该缩放标签y = 0 = 1/3,y = 1 = 2/3,对吧?像这样:

y_weights = [x*(1/3)+(1/3) for x in y_test]

还是我应该在此处输入实际分布和比例标签y = 0(用2/3)和标签y = 1(用1/3)?像这样:

y_weights = [x*(-1/3)+(2/3) for x in y_test]

我的最后一个问题是:要进行评估,将我的准确度与之比较的基线准确度是多少?

0.33(1类),0.5(平衡后)还是0.66(0类)?

编辑:使用基线,我指的是一个将所有数据天真的分类为“ 1”的模型,或者一个将所有数据分类为“ 0”的模型。问题是我不知道我是否可以自由选择。例如,我得到0.66的准确性或balance_accuracy。如果我将基准与“总是1”(acc 0.33(?))进行比较,则我的模型会更好。如果我将基线与“始终为0”(总计0.66(?))进行比较,则我的模型会更糟。

非常感谢你们对我的帮助。

0 个答案:

没有答案
相关问题