【Python】理解 Scikit-Learn 中的流水线与直接实例化:以 Logistic 回归为例

发布于:2024-05-22 ⋅ 阅读:(106) ⋅ 点赞:(0)

我爱你 是多么清楚多么坚固的信仰
我爱你 是多么温暖多么勇敢的力量
我不管心多伤 不管爱多慌 不管别人怎么想
爱是一种信仰 把我带到你的身旁
我知道那些不该说的话 让你负气流浪
想知道多年漂浮的时光 是否你也想家
如果当时吻你 当时抱你 也许结局难讲
我那么多遗憾 那么多期盼 你知道吗
                     🎵 张信哲《信仰》


在机器学习的实践中,数据预处理和模型训练是两个关键步骤。为了简化这些步骤,Scikit-Learn 提供了 Pipeline 工具,它可以将多个步骤串联在一起,使代码更加简洁和易于维护。在本文中,我们将比较使用 Pipeline 和直接实例化模型的方法,具体以 Logistic 回归为例,解释它们的区别和优点。

直接实例化 Logistic 回归

首先,我们来看一下直接实例化和使用 Logistic 回归的传统方法。

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 实例化 Logistic 回归模型
model = LogisticRegression(max_iter=1000, solver='lbfgs')
model.fit(X_train_scaled, y_train)

# 模型评估
accuracy = model.score(X_test_scaled, y_test)
print(f"Test set accuracy: {accuracy}")

在上面的代码中,我们手动进行了以下步骤:

  1. 数据标准化:使用 StandardScaler 对数据进行缩放。
  2. 实例化和训练 Logistic 回归模型。
  3. 对测试集进行相同的标准化处理。
  4. 评估模型性能。

这种方法虽然直观,但需要手动调用多个步骤,容易出现错误,特别是在数据预处理和模型训练步骤不一致时。

使用 Pipeline 进行实例化

现在,我们使用 Pipeline 来简化上述过程。

from sklearn.pipeline import make_pipeline

# 使用流水线将数据标准化和模型训练串联起来
pipeline = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000, solver='lbfgs'))
pipeline.fit(X_train, y_train)

# 模型评估
accuracy = pipeline.score(X_test, y_test)
print(f"Test set accuracy: {accuracy}")

通过使用 Pipeline,我们将数据预处理(标准化)和模型训练步骤串联在一起。这样做有以下几个优点:

  1. 简化代码:Pipeline 将多个步骤整合到一起,使代码更加简洁和易读。
  2. 避免错误:确保训练集和测试集的预处理步骤一致,减少手动处理时出错的可能性。
  3. 便于交叉验证和网格搜索:在进行超参数调优时,Pipeline 可以无缝地与 GridSearchCV 等工具结合,简化参数搜索过程。

便于交叉验证和网格搜索

使用 Pipeline 的另一个主要优势是便于进行超参数调优。我们来看一个使用 GridSearchCV 进行网格搜索的例子。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'logisticregression__C': [0.1, 1, 10],
    'logisticregression__penalty': ['l2']
}

# 进行网格搜索
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数和最佳得分
print("Best parameters:", grid_search.best_params_)
print("Best cross-validation score:", grid_search.best_score_)

在上述代码中,我们将整个 Pipeline 传递给 GridSearchCV,并定义了需要搜索的参数网格。GridSearchCV 会自动处理所有步骤,包括数据预处理和模型训练,最终返回最佳参数和交叉验证得分。

总结

通过本文的比较,我们可以清楚地看到使用 Pipeline 与直接实例化模型的不同。Pipeline 提供了一种简洁、可靠和可维护的方式来处理机器学习工作流,特别是在涉及多个预处理步骤和模型训练时。使用 Pipeline 可以确保数据预处理的一致性,减少代码重复,并简化超参数调优过程。


网站公告

今日签到

点亮在社区的每一天
去签到