我使用 python scikit-learn 进行逻辑回归。我有一个不平衡的数据集,其中 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)
我的超参数搜索网格是:
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 中选择什么是“最佳”分类器以找到最佳超参数的方法。由于我使用 执行了 LogisticRegression class_weight='balanced'
,我应该使用经典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'
),我应该用 1/3 缩放标签 y=0 和用 2/3 缩放 y=1,对吗?像这样:
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。如果我与基线“总是 1”(acc 0.33 (?))进行比较,我的模型会更好。如果我与基线“总是 0”(acc 0.66 (?))进行比较,我的模型会更糟。
非常感谢大家对我的帮助。