Pyspark:使用Pipeline流水线进行机器学习

Spark版本:V3.2.1 

这篇博客只介绍如何使用Pyspark.ml中的Pipeline API构建端到端的机器学习流水线。而机器学习中的各个具体流程会在其他系列博客中详细介绍,可以参考:

1 流水线

很多机器学习框架有流水线的概念,其表示对数据组织一系列操作的一种方式。在机器学习场景中使用流水线可以带来以下好处:

  • 将机器学习的步骤分解组合成流水线可以解决程序代码冗长的问题;
  • 做进行交叉验证的时候,需要根据不同的训练、测试数据比例来反复拟合训练数据和测试数据,使用流水线技术可以解决程序不能并行的问题;

流水线的一般框架如下图:

下面依次对Transformer和Estimator进行介绍。

  • 转化器(Transformer)

它接收一个 DataFrame 作为输入,并返回添加了一列或多列的新DataFrame(新列会添加在末尾)。转化器不会从数据中学到任何参数,只是简单地应用基于规则的转化操作,从而为模型训练准备数据。或使用训练好的模型来生成预测结果。转化器都有.transform()方法。

  • 预估器(Estimator)

从 DataFrame 通过 .fit() 方法学习或者拟合得出参数,并返回模型Model,模型本身是转化器。

  • 流水线(Pipeline)

将一系列转化器和预估器整合为单个模型。流水线本身是预估器,pipeline.fit() 的输出则是 PipelineModel,后者是一个转化器。一般流水线由n(n\geq 1)个转换器和1个估计器构成。

2 代码示例

下面使用一个具体的案例来介绍流水线的使用和构建。本次实验使用来自 Inside Airbnb 的旧金山住房数据集,利用用'accommodates'、房间数(bedrooms)、浴室数目(bathrooms)、评论数目(number_of_reviews)、评分数(review_scores_rating)等来预测出租价格(price),这里暂时不考虑对数据进行处理,只先完整介绍机器学习的流程。具体代码如下:

from pyspark.sql import SparkSession
from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler
from pyspark.ml import Pipeline
from pyspark.ml.evaluation import RegressionEvaluator

filepath="/sf-airbnb/sf-airbnb-clean.parquet/"

spark=SparkSession.builder.appName("machine-learning").getOrCreate()

df=spark.read.parquet(filepath)
#划分训练集和测试集
train_df,test_df=df.randomSplit([0.8,0.2],seed=24)

#构建特征,将多个特征合并到一个名为features的列中
vecAssembler=VectorAssembler(inputCols=['accommodates','bedrooms','bathrooms',
                                       'number_of_reviews','review_scores_rating'],
                             outputCol='features')

#训练模型:featuresCol为x,labelCol为y
lr=LinearRegression(featuresCol='features',labelCol='price')

#构建流水线
pipeline=Pipeline(stages=[vecAssembler,lr])
pipelineModel=pipeline.fit(train_df)
predDF=pipelineModel.transform(test_df) #预测结果会直接保存在prediction列中

#评估模型训练结果
evaluator=RegressionEvaluator(predictionCol='prediction',
                              labelCol='price',metricName="rmse")
rmse=evaluator.evaluate(predDF)
print('rmse:{}'.format(rmse)) #rmse结果为318.52

参考资料:

  1. 《scikit-learn的机器学习流水线技术与应用》 

  2. 《Spark快速大数据分析》

<think>好的,我现在需要帮助用户了解如何构建和使用机器学习流水线Pipeline)。用户提到了sklearn和Spark ML中的Pipeline,所以我要涵盖这两个库的用法。首先,我得回忆一下sklearn的Pipeline是如何工作的,它主要是将多个处理步骤和模型串联起来,形成一个工作流。然后,Spark MLPipeline类似,但可能有些不同,特别是在分布式计算环境下的应用。 接下来,我需要确保回答结构清晰,分步骤说明。可能先介绍Pipeline的概念,然后分点讲解构建步骤,再给出代码示例。用户可能需要具体的例子来理解,所以需要准备sklearn和Spark ML的代码片段。同时,要注意使用中文,并且数学表达式要用$...$格式,比如在特征工程部分提到的标准化处理,可能需要用公式,比如$z = \frac{x - \mu}{\sigma}$,这里要检查是否符合格式要求。 还要生成相关问题,可能需要考虑用户可能想了解的常见问题,比如优势、最佳实践、常见错误等。同时,需要引用提供的参考资料,但用户提到这些引用仅供参考,可能需要结合之前的回答,但这里可能没有之前的上下文,所以主要依据提供的引用内容。 需要检查LaTeX语法是否正确,比如独立公式是否用$$...$$,行内公式用$...$。例如,在sklearn示例中的代码是否正确,是否需要调整。另外,要确保回答真实可靠,避免错误信息,比如正确使用Pipeline的步骤,fit和transform的顺序等。 现在,整理结构:首先解释Pipeline的概念,然后分步骤说明构建方法,每个步骤详细说明,接着给出两个库的代码示例,最后列出相关问题。在引用部分,正确标注来源,如引用[1]、[2]等。可能还需要比较sklearn和Spark MLPipeline异同,帮助用户理解不同场景下的应用。 需要注意用户可能对代码示例有疑问,比如参数设置、自定义步骤等,所以代码要简洁明了,注释清楚。同时,回答要尽量详细,但不过于冗长,保持步骤清晰。可能还需要提到Pipeline的优势,如代码简洁、避免数据泄露、便于调参等,如引用[3]提到的内容。 最后,生成的相关问题要围绕Pipeline的构建和使用,可能包括如何处理不同类型的数据、如何调试Pipeline、性能优化等。确保问题有针对性,帮助用户进一步学习。</think># 机器学习流水线Pipeline)构建与使用教程 机器学习流水线Pipeline)通过将数据预处理、特征工程、模型训练等步骤封装为标准化流程,显著提升开发效率和代码可维护性[^1][^3]。以下是构建与使用的核心方法: --- ## 一、Pipeline核心概念 1. **组件类型** - **Transformer**:实现`fit()`和`transform()`方法(如标准化、特征选择) - **Estimator**:实现`fit()`和`predict()`方法(如分类器、回归器) 2. **数学表达** 假设数据标准化步骤为$z = \frac{x - \mu}{\sigma}$,分类器为$f(\theta)=\text{sign}(\mathbf{w}^T\mathbf{x}+b)$,流水线可表示为复合函数: $$ y = f(g(h(\mathbf{x}))) $$ 其中$h,g$为预处理步骤[^1] --- ## 二、sklearn Pipeline构建步骤 ### 1. 基础构建 ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC pipe = Pipeline([ ('scaler', StandardScaler()), # 标准化 ('classifier', SVC()) # 支持向量机 ]) ``` ### 2. 复杂流程构建 ```python from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer # 分类特征处理 cat_transformer = Pipeline([ ('imputer', SimpleImputer(strategy='most_frequent')), ('onehot', OneHotEncoder()) ]) # 数值特征处理 num_transformer = Pipeline([ ('imputer', SimpleImputer(strategy='median')), ('log', FunctionTransformer(np.log1p)) ]) preprocessor = ColumnTransformer([ ('cat', cat_transformer, ['gender', 'city']), ('num', num_transformer, ['age', 'income']) ]) full_pipe = Pipeline([ ('prep', preprocessor), ('model', RandomForestClassifier()) ]) ``` --- ## 三、Spark ML Pipeline示例 ```python from pyspark.ml import Pipeline from pyspark.ml.feature import VectorAssembler, StandardScaler from pyspark.ml.classification import LogisticRegression # 特征向量化 assembler = VectorAssembler( inputCols=["age", "income"], outputCol="features") # 标准化 scaler = StandardScaler( inputCol="features", outputCol="scaledFeatures") # 逻辑回归 lr = LogisticRegression(featuresCol="scaledFeatures") spark_pipe = Pipeline(stages=[assembler, scaler, lr]) model = spark_pipe.fit(train_df) # 自动按顺序执行所有阶段[^4] ``` --- ## 四、Pipeline核心优势 | 优势 | 说明 | |---------------------|----------------------------------------------------------------------| | 避免数据泄露 | 自动确保预处理步骤仅在训练数据上拟合[^3] | | 超参数统一调优 | 可通过`GridSearchCV`同时优化预处理参数与模型参数 | | 部署简化 | 导出单一对象即可包含完整处理流程 | | 代码可读性提升 | 明确展示从原始数据到预测结果的全流程 | --- ## 五、最佳实践建议 1. **自定义Transformer**:通过`FunctionTransformer`封装特殊处理逻辑 2. **内存优化**:Spark ML中设置`pipeline.setStages().setCheckpointInterval(10)` 3. **调试技巧**:使用`pipe.named_steps['step_name']`访问特定步骤 4. **性能监控**:添加`MemoryProfiler`或`Spark UI`进行资源分析 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值