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


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


在机器学习的实践中,数据预处理和模型训练是两个关键步骤。为了简化这些步骤,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 可以确保数据预处理的一致性,减少代码重复,并简化超参数调优过程。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值