首页 > 其他分享 >什么是pipeline?

什么是pipeline?

时间:2024-11-05 21:16:23浏览次数:6  
标签:pipeline 自定义 什么 train test import sklearn

一、概念

        pipeline,中文名称又称为管线、传输途径,直译起来有点蹩脚,我们可以理解成它就是一个把各个工具串起来的一个流水线。这里,我们常见的主要有两类pipeline,一类是sklearn中的pipeline,一类是Transformers库中的pipeline

二、sklearn中的pipeline

        sklearn中的pipeline用于将数据预处理、特征选择、降维和模型训练等步骤串联起来,形成一个有序的工作流程,它允许我们将多个数据处理步骤和最终的模型(如分类器、回归器等)组合成一个整体,以便后续复用;同时,pipeline也使得训练和预测使用了相同的数据转换步骤,从而减少因人为操作导致的不一致;最后,模块化的操作也使得我们的代码看起来更整洁,且更容易维护。

1、make_pipeline快速创建管道

        这个函数非常适合于快速构建管道,尤其是需要将多个预处理步骤与一个模型结合起来时,这个过程中无需我们指定步骤名称(make_pipeline创建的对象步骤名默认为构造方法的小写形式),只需要import进来我们所需要的流程然后按顺序放到pipeline中。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.metrics import precision_score

# 加载数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# 创建管道
# 例如这里我们将转换数据和初始化模型用一行代码实现了,简洁清晰
pipeline = make_pipeline(StandardScaler(), SVC())

# 训练模型
pipeline.fit(X_train, y_train)

# 预测
y_pred = pipeline.predict(X_test)
print('Prec:', precision_score(y_test, y_pred, average='macro'))

2、pipeline自定义创建管道

        sklearn的Pipeline类提供了更多的灵活性,允许自定义管道中的步骤,并为每个步骤命名(也是必须项),该类的灵活性更高,允许我们在管道中添加更多的自定义步骤,例如自定义的转换函数或模型。

(1)自定义类

        首先,加入自定义函数需要确保我们的函数符合sklearn的估计器接口规范,即函数应该能够接受fit和transform方法的调用。这里给出一个简单的示例:

from sklearn.base import BaseEstimator, TransformerMixin

# 关键是继承这两个类
class CustomTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, param=1):
        self.param = param

    def fit(self, X, y=None):
        # 在这里实现我们的拟合逻辑
        return self

    def transform(self, X):
        # 在这里实现我们的转换逻辑
        # 例如,返回X的一个新列
        return X * self.param

(2)调用自定义类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import precision_score

# 加载数据集
iris = load_iris()

    
# 创建管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('custom', CustomTransformer(param=2)),  # 加入自定义函数
    ('svm', SVC())
])

# 训练模型
pipeline.fit(X_train, y_train)

# 预测
y_pred = pipeline.predict(X_test)
print('Prec:', precision_score(y_test, y_pred, average='macro'))

三、Transformers库中的pipeline

        Transformers库中的pipeline是一个高级API,它提供了一种简便的方式来调用预训练模型进行各种NLP、CV以及语音任务,比如情感分析、文本生成、翻译、问答、图像分类等,它的强大之处在于可以在几行代码内快速地实现复杂的任务(原理同样是串联了多个模块),非常适用于模型的快速应用。例如,我们实现一个情感分析的pipeline:

from transformers import pipeline

# 加载情感分析的pipeline
sentiment_analysis = pipeline("sentiment-analysis")

# 进行情感分析
results = sentiment_analysis(["I love this!", "I hate this!"])

# 输出结果
for result in results:
    print(f"Label: {result['label']}, Score: {result['score']:.4f}")

        pipeline目前支持多达29种人工智能任务,只需要将参数更换成指定的任务名称即可(官网支持名称戳此处)。此外,pipeline类也支持自定义,我们可以指定模型(例如替换成我们自己训练的模型,从而让模型输出的预测结果符合我们的任务需求),分词器/特征抽取器等各个流程中的工具,从而实现高度的定制化,具体可参考官网的教程。但需要注意的是,与sklearn不同,Transformers库的pipeline类是应用型的封装,无法用于训练模型。

 

标签:pipeline,自定义,什么,train,test,import,sklearn
From: https://blog.csdn.net/ChaneMo/article/details/143188504

相关文章

  • 什么是C++模板,有哪些类型的模板?
    模板C++模板是一种强大的语言特性,允许开发者编写与类型无关的代码,从而实现代码的复用和灵活性。通过模板,可以定义函数和类,具体实现将由具体的类型实例化决定。函数模板函数模板(FunctionTemplates):函数模板用于定义一个通用的函数,该函数可以接受任意类型的参数。通过使用模......
  • 什么是梯度下降算法
    书接上文,想要用算法解决问题,就不可避免的涉及构造函数L(后面称之为损失函数Loss)求导,和对Loss函数求极小值。而对导函数求极小值就不得不提梯度下降算法,那边本期就来介绍什么是梯度下降算法,以及为什么梯度下降算法能求Loss函数的极小值。什么是梯度?梯度是偏导数组成的向量,,w是......
  • 什么是AOP面向切面编程?怎么简单理解?
    本文原文地址:什么是AOP面向切面编程?怎么简单理解?什么是AOP面向切面编程面向切面编程(AOP)通过将横切关注点(cross-cuttingconcerns)分离出来,提供了一种增强代码模块化和可维护性的方法。简单来说,AOP就是将公共的模块封装成公共的方法,然后在需要的时候(这个就是切入点),直接就可以调用......
  • 好的软件测试人员简历是什么样子的?
    ......
  • 什么是线程?什么是进程?
    什么是线程?什么是进程?它们之间的区别是什么?线程:线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但每个线程都有自己独立的程序计数器、栈和寄存器组。......
  • math.h包含什么内容
    1.基本算数运算函数fabs:计算浮点数的绝对值(默认情况下是double类型的) fmod:计算两个浮点数相除的余数(跟整形中的%比较类似,默认也是double类型的)fmin:两个浮点数中取出最小值 (默认也是double类型的)fmax:两个浮点数去除最大值(默认也是double类型的) 2.幂函数与指数函数p......
  • 为什么不会听课的学生越来越多?
    为什么不会听课的学生越来越多?......
  • 人为什么要去博物馆呢?
    人为什么要去博物馆呢?改天做一个博物馆相册......
  • 举例说明什么情况下会更倾向于使用抽象类而不是接口
    接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。接口vs抽象类 继承限制:Java中,一个类只能继承一个类,但可以实现多个接口。继承一个类意味着失去了继承其他类的机会。行为表示:接口通常用于表示附加的行为......
  • 举例说明什么情况下会更倾向于使用抽象类而不是接口
    接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。接口vs抽象类 继承限制:Java中,一个类只能继承一个类,但可以实现多个接口。继承一个类意味着失去了继承其他类的机会。行为表示:接口通常用于表示附加的行为......