使用带和不带管道的逻辑回归的不同 AUC-PR 分数

Posted

技术标签:

【中文标题】使用带和不带管道的逻辑回归的不同 AUC-PR 分数【英文标题】:Different AUC-PR scores using Logistic Regression with and without Pipeline 【发布时间】:2021-11-14 10:46:32 【问题描述】:

我试图了解为什么我在使用和不使用 Pipeline 的 Logistic 回归时得到不同的 AUC-PR 分数。

这是我的代码 with 使用管道:

column_encoder = ColumnTransformer([
    ('ordinal_enc', OrdinalEncoder(), categorical_cols)
])

pipeline = Pipeline([
    ('column_encoder', column_enc),
    ('logreg', LogisticRegressionCV(random_state=777))
])

model = pipeline.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(f'AUC-PR with Pipeline: average_precision_score(y_test, y_pred):.4f')

这是我的代码没有管道:

ord_enc = OrdinalEncoder()
ord_encoded_X_train = ord_enc.fit_transform(X_train[categorical_cols])
ord_encoded_X_test = ord_enc.transform(X_test[categorical_cols])

X_train_encoded = X_train.copy(deep=True)
X_test_encoded = X_test.copy(deep=True)

X_train_encoded.loc[:, categorical_cols] = copy.deepcopy(ord_encoded_X_train)
X_test_encoded.loc[:, categorical_cols] = copy.deepcopy(ord_encoded_X_test)

model = LogisticRegression(random_state=777, max_iter=2000)
model.fit(X_train_encoded, y_train)
y_pred = model.predict(X_test_encoded)

print(f'AUC-PR without Pipeline: average_precision_score(y_test, y_pred):.4f')

最后:

AUC-PR with Pipeline:    0.1133
AUC-PR without Pipeline: 0.2406

那么,这是为什么呢?

【问题讨论】:

不适合_transform 测试数据。仅使用训练集中的拟合统计数据进行变换。 @BenReiniger,谢谢,但这不会改变结果。差异仍然存在。 【参考方案1】:

您的ColumnTransformer 正在删除所有不在categorical_cols 中的列,因为remainder 的默认值是"drop"。添加remainder="passthrough" 以保留模型的非分类列。

其他小问题:

您在第二种方法中设置了max_iter,但在第一种方法中没有。 当您应该使用概率预测时,您正在使用硬类预测计算 average_precision_score

【讨论】:

以上是关于使用带和不带管道的逻辑回归的不同 AUC-PR 分数的主要内容,如果未能解决你的问题,请参考以下文章

带和不带 FILTER 的 DAX 计算函数

带和不带着色器的 VBO OpenGL C++

Kotlin 只读属性,带和不带 getter

带和不带 () 的条件运算符

带和不带 lambda 的 pandas apply()

带和不带引号和括号的 setTimeout 之间的区别