使用和不使用 Pipeline 的 Logistic 回归的不同 AUC-PR 分数
Different AUC-PR scores using Logistic Regression with and without Pipeline
我想了解为什么在使用和不使用流水线的情况下使用逻辑回归得到不同的 AUC-PR 分数。
这是我的代码 使用管道:
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
那么,这是为什么呢?
您的 ColumnTransformer
正在删除不在 categorical_cols
中的所有列,因为 remainder
的默认值是 "drop"
。添加 remainder="passthrough"
以保留模型的非分类列。
其他问题:
- 您在第二种方法中设置了
max_iter
而不是第一种方法。
- 您正在使用硬 class 预测计算
average_precision_score
,而您应该使用概率预测。
我想了解为什么在使用和不使用流水线的情况下使用逻辑回归得到不同的 AUC-PR 分数。
这是我的代码 使用管道:
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
那么,这是为什么呢?
您的 ColumnTransformer
正在删除不在 categorical_cols
中的所有列,因为 remainder
的默认值是 "drop"
。添加 remainder="passthrough"
以保留模型的非分类列。
其他问题:
- 您在第二种方法中设置了
max_iter
而不是第一种方法。 - 您正在使用硬 class 预测计算
average_precision_score
,而您应该使用概率预测。