Python-정확히 sklearn.pipeline.Pipeline은 무엇입니까?


118

sklearn.pipeline.Pipeline정확히 어떻게 작동하는지 알 수 없습니다 .

문서에 몇 가지 설명이 있습니다 . 예를 들어 다음과 같은 의미가 있습니다.

최종 추정기를 사용한 변환 파이프 라인.

내 질문을 더 명확하게하기 위해 무엇 steps입니까? 어떻게 작동합니까?

편집하다

답변 덕분에 내 질문을 더 명확하게 만들 수 있습니다.

파이프 라인을 호출하고 단계적으로 두 개의 변환기와 하나의 추정기를 전달할 때, 예 :

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

전화하면 어떻게 되나요?

pipln.fit()
OR
pipln.fit_transform()

추정기가 변압기가 될 수있는 방법과 변압기가 장착되는 방법을 알 수 없습니다.


3
내가 이해 한 바에 따르면 파이프 라인은 학습 프로세스의 여러 단계를 자동화하는 데 도움이됩니다. 예를 들어 모델의 학습 및 테스트 또는 기능 선택 ... 따라서 회귀를 혼합하고이를 사용하여 분류기를 공급하는 경우 단계는 해당 회귀와 분류자를 학습하는 것입니다. 편집 : 추가 정보
M0rkHaV

답변:


180

scikit-learn의 Transformer -fit 및 transform 메서드 또는 fit_transform 메서드가있는 일부 클래스.

Predictor -fit 및 predict 메서드가있는 일부 클래스 또는 fit_predict 메서드.

파이프 라인 은 추상적 인 개념 일 뿐이며 기존 ML 알고리즘이 아닙니다. 종종 ML 작업에서 최종 추정기를 적용하기 전에 원시 데이터 세트의 다양한 변환 (기능 집합 찾기, 새 기능 생성, 일부 좋은 기능 선택)의 시퀀스를 수행해야합니다.

다음 은 파이프 라인 사용의 좋은 예입니다. Pipeline은 3 단계의 변환 및 결과 추정기에 대한 단일 인터페이스를 제공합니다. 내부에 변환기와 예측자를 캡슐화하며 이제 다음과 같은 작업을 수행 할 수 있습니다.

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

그냥 :

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

파이프 라인을 사용하면이 메타 추정기의 각 단계에 대한 매개 변수 세트에 대한 그리드 검색을 쉽게 수행 할 수 있습니다. 위의 링크에서 설명한대로. 마지막 단계를 제외한 모든 단계는 변환이어야하며 마지막 단계는 변환기 또는 예측자가 될 수 있습니다. 편집에 대한 답변 : 호출 할 때 pipln.fit()-파이프 라인 내부의 각 변압기는 이전 변압기의 출력에 적합합니다 (첫 번째 변압기는 원시 데이터 세트에서 학습 됨). 마지막 추정자는 변환기 또는 예측 자일 수 있습니다. 마지막 추정자가 변환기 (fit_transform 또는 변환 및 맞춤 메서드를 별도로 구현) 인 경우에만 파이프 라인에서 fit_transform ()을 호출 할 수 있습니다. 다음 경우에만 파이프 라인에서 fit_predict () 또는 predict ()를 호출 할 수 있습니다. 마지막 견적은 예측 자입니다. 따라서 파이프 라인에서 fit_transform 또는 transform을 호출 할 수 없습니다. 마지막 단계는 예측 자입니다.


1
무슨 뜻 predicted = pipeline.fit(Xtrain).predict(Xtrain)입니까?
farhawa

@farhawa, 훈련 세트에 대한 수업을 예측합니다.
Ibraim Ganiev

4
더 많은 표가없는 이유는 무엇입니까? 블로그 게시물이어야합니다.
R Claven

1
대부분의 scikit-learn 변환기의 인터페이스 인 @iamgin은 변환하려는 필요한 열을 선택할 수 없습니다. 그러나 필요한 열만 변압기에 공급하는 데 도움이되는 고유 한 "항목 선택기"를 작성할 수 있습니다. 다음은 ItemSelector 및 FeatureUnion의 좋은 예입니다. scikit-learn.org/stable/auto_examples/…
Ibraim Ganiev

1
첫 번째 예에서 테스트 세트에 다시 맞추는 것을 피하고 싶지 않습니까? fit_transform 대신 transform을 호출해야하지 않습니까? 마찬가지로 파이프 라인은 내부적으로 fit_transform 호출을 예측합니까 아니면 변환 만합니까? 제어 할 수 있습니까?
Steven

18

나는 M0rkHaV가 올바른 아이디어를 가지고 있다고 생각합니다. Scikit 배우기의 파이프 라인 클래스 만 (한 번 중요한 방법 호출 할 필요가 그래서, 하나의 객체로 추정량과 함께 여러 다른 변압기를 캡슐화하기위한 유용한 도구입니다 fit(), predict()등). 두 가지 주요 구성 요소를 분석해 보겠습니다.

  1. 변환기fit()transform(). 당신은 같은 도구를 전처리 sklearn의 일부에 익숙 할 수 TfidfVectorizerBinarizer. 이러한 전처리 도구에 대한 문서를 살펴보면 두 가지 방법을 모두 구현하고 있음을 알 수 있습니다. 내가 꽤 멋지다고 생각하는 것은 일부 추정기가 변환 단계로도 사용될 수 있다는 것입니다 LinearSVC.

  2. 에스티 메이터fit()predict(). 많은 분류기 및 회귀 모델이 이러한 두 가지 방법을 모두 구현하므로 여러 모델을 쉽게 테스트 할 수 있습니다. 다른 변환기를 최종 추정기로 사용할 수 있습니다 (즉, 반드시 구현할 필요는 predict()없지만 확실히 구현합니다 fit()). 이 모든 의미는을 (를) 호출 할 수 없다는 것 predict()입니다.

편집에 관해서는 텍스트 기반 예제를 살펴 보겠습니다. LabelBinarizer를 사용하여 레이블 목록을 이진 값 목록으로 변환하려고합니다.

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

이제 이진화 기가 일부 데이터에 적합 할 때 classes_변환기가 '알고있는'고유 한 클래스를 포함하는 라는 구조를 갖게됩니다 . fit()이진화기를 호출하지 않으면 데이터가 어떻게 생겼는지 알 수 없으므로 호출 transform()이 의미가 없습니다. 데이터를 맞추기 전에 클래스 목록을 인쇄하면 마찬가지입니다.

print bin.classes_  

이것을 시도 할 때 다음 오류가 발생합니다.

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

그러나 이진화기를 vec목록에 넣으면 :

bin.fit(vec)

다시 시도

print bin.classes_

다음을 얻습니다.

['cat' 'dog']


print bin.transform(vec)

이제 vec객체에서 transform을 호출 하면 다음을 얻습니다.

[[0]
 [1]
 [1]
 [1]]

변환기로 사용되는 추정기에 대해서는 DecisionTree분류기를 특성 추출기의 예로 사용하겠습니다 . 의사 결정 트리는 여러 가지 이유로 훌륭하지만 우리의 목적을 위해 중요한 것은 트리 가 예측에 유용하다고 판단한 기능의 순위를 매길 수 있다는 것 입니다 . transform()의사 결정 트리 를 호출하면 입력 데이터를 가져 와서 가장 중요한 기능이라고 생각 하는 것을 찾습니다 . 따라서 데이터 행렬 (n 행 x m 열)을 더 작은 행렬 (n 행 x k 열)로 변환하는 것을 생각할 수 있습니다. 여기서 k 열은 의사 결정 트리가 찾은 k 개의 가장 중요한 특징입니다.


fit()transform()트랜스포머 의 차이점은 무엇입니까 ? , 추정기를 변환기로 어떻게 사용할 수 있습니까?
farhawa

2
fit()분류기 또는 회귀 모델과 같이 변환기를 맞추거나 '훈련'하기 위해 호출하는 방법입니다. 의 경우 transform()실제로 입력 데이터를 출력 데이터로 변환하기 위해 호출하는 메서드입니다. 예를 들어, Binarizer.transform([8,2,2])(피팅 후!)를 호출 하면 [[1,0],[0,1],[0,1]]. 추정기를 변환기로 사용하는 것에 관해서는 간단한 예를 제 답변으로 편집하겠습니다.
NBartley

9

ML 알고리즘은 일반적으로 테이블 형식 데이터를 처리합니다. ML 알고리즘 전후에이 데이터의 전처리 및 후 처리를 수행 할 수 있습니다. 파이프 라인은 이러한 데이터 처리 단계를 연결하는 방법입니다.

ML 파이프 라인은 무엇이며 어떻게 작동합니까?

파이프 라인은 데이터가 변환되는 일련의 단계입니다. 예를 들어, 파이프 "|"또는 리디렉션 연산자 ">"가있는 유닉스 bash 명령을 생각할 수 있습니다.) 그러나 파이프 라인은 코드의 개체입니다. 따라서 각 필터 (각 파이프 라인 단계라고도 함)에 대한 클래스가있을 수 있으며, 그런 다음 이러한 단계를 최종 파이프 라인으로 결합하는 다른 클래스가있을 수 있습니다. 일부 파이프 라인은 다른 파이프 라인을 직렬 또는 병렬로 결합하고 여러 입력 또는 출력 등을 가질 수 있습니다. 우리는 기계 학습 파이프 라인을 다음과 같이보고 싶습니다.

  • 파이프 및 필터 . 파이프 라인의 단계는 데이터를 처리하고 데이터에서 배울 수있는 내부 상태를 관리합니다.
  • 복합재 . 파이프 라인은 중첩 될 수 있습니다. 예를 들어 전체 파이프 라인은 다른 파이프 라인에서 단일 파이프 라인 단계로 처리 될 수 있습니다. 파이프 라인 단계가 반드시 파이프 라인은 아니지만 파이프 라인 자체는 적어도 정의에 따라 파이프 라인 단계입니다.
  • 방향성 비순환 그래프 (DAG) . 파이프 라인 단계의 출력은 다른 여러 단계로 전송 될 수 있으며 결과 출력은 다시 결합 될 수 있습니다. 참고 : 파이프 라인은 비순환 적 임에도 불구하고 여러 항목을 하나씩 처리 할 수 ​​있으며 상태가 변경되면 (예 : 매번 fit_transform 메서드 사용) 상태를 유지하면서 시간이지나면서 반복적으로 펼쳐지는 것으로 볼 수 있습니다 (예 : RNN). 이는 프로덕션에 배치하고 더 많은 데이터에 대해 교육 할 때 온라인 학습을 수행하기위한 파이프 라인을 보는 흥미로운 방법입니다.

Scikit-Learn 파이프 라인의 방법

파이프 라인 (또는 파이프 라인의 단계) 에는 다음 두 가지 방법이 있어야합니다 .

  • 데이터에 대해 학습하고 상태를 획득하기위한 " 적합 "(예 : 신경망의 신경 가중치가 이러한 상태 임)
  • " transform "(또는 "predict")을 사용하여 실제로 데이터를 처리하고 예측을 생성합니다.

이 메서드를 호출하여 둘 다 연결할 수도 있습니다.

  • " fit_transform "은 데이터를 맞추고 변환하지만 한 번의 패스로 두 메서드를 하나씩 직접 수행해야 할 때 잠재적 인 코드 최적화를 허용합니다.

sklearn.pipeline.Pipeline 클래스의 문제점

Scikit-Learn의 "파이프 및 필터"디자인 패턴은 단순히 아름답습니다. 하지만 딥 러닝, AutoML 및 복잡한 프로덕션 수준 파이프 라인에 어떻게 사용합니까?

Scikit-Learn은 딥 러닝 이전 시대 인 2007 년에 첫 출시되었습니다 . 그러나 가장 잘 알려져 있고 채택 된 기계 학습 라이브러리 중 하나이며 여전히 성장하고 있습니다. 무엇보다도 파이프 및 필터 디자인 패턴을 소프트웨어 아키텍처 스타일로 사용합니다. 이것이 바로 Scikit-Learn이 사용 가능한 알고리즘을 제공한다는 사실에 더해 매우 멋지게 만드는 이유입니다. 그러나 다음을 수행 할 때 큰 문제가 있으며, 2020 년에 이미 수행 할 수 있어야합니다.

  • 자동 기계 학습 (AutoML),
  • 딥 러닝 파이프 라인,
  • 더 복잡한 기계 학습 파이프 라인.

Scikit-Learn의 문제에 대해 우리가 찾은 솔루션

확실히 Scikit-Learn은 매우 편리하고 잘 구축되어 있습니다. 그러나 새로 고침이 필요합니다. 다음은 최신 컴퓨팅 프로젝트에서 Scikit-Learn을 신선하고 유용 하게 만드는 Neuraxle 솔루션입니다 !

Neuraxle을 통해 제공되는 추가 파이프 라인 방법 및 기능

참고 : 파이프 라인의 단계에 fit 또는 transform 메서드 중 하나가 필요하지 않은 경우 NonFittableMixin 또는 NonTransformableMixin 에서 상속하여 아무 작업도 수행하지 않도록 해당 메서드 중 하나의 기본 구현을 제공 할 수 있습니다.

우선, 파이프 라인 또는 해당 단계에서 이러한 메서드를 선택적으로 정의 할 수도 있습니다 .

  • " 셋업 의 단계의 각각의"SETUP "메소드를 호출 할 것이다." 예를 들어 단계에 TensorFlow, PyTorch 또는 Keras 신경망이 포함 된 경우 단계는 신경 그래프를 생성하고 적합하기 전에 "설정"방법으로 GPU에 등록 할 수 있습니다. 최적의 하이퍼 파라미터를 검색하는 자동 기계 학습 알고리즘 내에서 다른 하이퍼 파라미터를 사용하여 여러 번 실행하기 전에 단계를 복사하는 경우와 같이 여러 가지 이유로 단계의 생성자에서 직접 그래프를 생성하지 않는 것이 좋습니다.
  • " 설정"방법과 반대되는 " 해체 ": 리소스를 지 웁니다.

다음 방법은 기본적으로 제공되는 하이퍼 파라미터를 관리 할 수 있도록 :

  • get_hyperparams ”는 하이퍼 파라미터 사전을 반환합니다. 파이프 라인에 더 많은 파이프 라인 (중첩 된 파이프 라인)이 포함 된 경우 하이퍼 파라미터의 키는 이중 밑줄 "__"구분 기호로 연결됩니다.
  • " set_hyperparams "를 사용하면 새 하이퍼 파라미터를 가져올 때와 동일한 형식으로 설정할 수 있습니다.
  • get_hyperparams_space ”를 사용하면 하이퍼 파라미터의 공간을 가져올 수 있으며 정의한 경우 비어 있지 않습니다. 따라서 여기서 "get_hyperparams"와의 유일한 차이점은 정확한 값 대신 값으로 통계 분포를 얻게된다는 것입니다. 예를 들어 레이어 수에 대한 하나의 하이퍼 파라미터 RandInt(1, 3)는 1 ~ 3 개의 레이어를 의미 하는 a 일 수 있습니다 . .rvs()이 dict를 호출 하여 값을 임의로 선택하고 "set_hyperparams"로 전송하여 학습을 시도 할 수 있습니다.
  • set_hyperparams_space ”는 “ get_hyperparams_space ”에서와 동일한 하이퍼 파라미터 분포 클래스를 사용하여 새 공간을 설정하는 데 사용할 수 있습니다.

제안 된 솔루션에 대한 자세한 내용은 위의 링크가있는 큰 목록의 항목을 읽으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.