programing

정확히 sklearn.pipeline입니다.파이프라인?

testmans 2023. 7. 19. 21:14
반응형

정확히 sklearn.pipeline입니다.파이프라인?

나는 어떻게 그것이sklearn.pipeline.Pipeline정확하게 작동합니다.

문서에는 몇 가지 설명이 있습니다.예를 들어, 다음은 무엇을 의미합니까?

최종 추정기가 있는 변환 파이프라인입니다.

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

편집

답변 덕분에 질문을 보다 명확하게 할 수 있습니다.

파이프라인을 호출하고 단계별로 변압기 2개와 추정기 1개를 전달하면 다음과 같습니다.

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

이걸 부르면 어떻게 되죠?

pipln.fit()
OR
pipln.fit_transform()

저는 추정기가 어떻게 변압기가 될 수 있는지 그리고 변압기가 어떻게 장착될 수 있는지 이해할 수 없습니다.

scikit-learn의 Transformer - 적합 및 변환 방법 또는 적합_변환 방법이 있는 일부 클래스.

예측 변수 - 적합 및 예측 방법 또는 적합_예측 방법이 있는 일부 클래스입니다.

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

다음은 파이프라인 사용의 좋은 예입니다.파이프라인은 변환의 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_predict() 또는 predict()를 호출할 수 있습니다.따라서 파이프라인에서 fit_transform 또는 transform을 호출할 수 없습니다. 마지막 단계는 예측 변수입니다.

M0rkHaV의 생각이 맞는 것 같습니다.s 여러 개의 다른 할 때 한 메소드를한 하면 됩니다.fit(),predict()두 구성 요소 즉, 다음과 같은 두 가지를 다음 두 가지 주요 구성 요소를 살펴보겠습니다.

  1. 변압기는 두 가지를 모두 구현하는 클래스입니다.fit()그리고.transform()인 "sklearn"에 대해 잘 알고 계실 수 있습니다.TfidfVectorizer그리고.Binarizer이러한 전처리 도구에 대한 문서를 보면 이 두 가지 방법이 모두 구현되어 있음을 알 수 있습니다.꽤은 일부 가 변환 될 수 를 들어, 제매 우 멋 진 것 일 추 가 것 사 수 입 니 있 다 는 다 될 용 단 로 계 변 기 가 환 정 부 은 ▁what 니 다 입 것 ators , ▁that ▁can ▁some ▁estim ▁e ▁also ▁is ▁be ▁cool 제 ▁as ▁i g 있 ▁prettyLinearSVC!

  2. 추정치는 두 가지를 모두 구현하는 클래스입니다.fit()그리고.predict()많은 분류자와 회귀 모형이 이러한 두 가지 방법을 모두 구현하므로 다양한 모형을 쉽게 테스트할 수 있습니다.추정기로 할 수 다변압를최즉사, 수있용다없다니습니할습로정기필는추요구종할른현기반시드즉▁(▁it▁necesst, ▁aser없습다니는필요(i▁transform▁doesn▁implementarily▁another'다▁estimator▁the▁final▁is니).predict()하지만 확실히 구현합니다.fit()이▁).▁wouldn니'의▁all라고 부를 수 없다는 것을 의미합니다.predict().

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

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_'

바이너리라이저를 지만바 라이저 장착때 ▁the▁the▁you 때▁but▁on ▁whenizer할 하ar▁fit 지▁bin.vec매개 변수:

bin.fit(vec)

다시 시도합니다.

print bin.classes_

다음을 확인할 수 있습니다.

['cat' 'dog']


print bin.transform(vec)

그리고 이제, 전화로 트랜스폼을 부른 후에.vec 객체는, 우리다얻습다니을음얻.

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

변기로사추대정에해는서다, ▁the▁as▁를 사용해 보겠습니다.DecisionTree기능 변환기의 예로서의 분류기.의사 결정 트리는 여러 가지 이유로 유용하지만, 우리의 목적을 위해 중요한 것은 트리가 예측하는 데 유용하다고 생각하는 특징의 순위를 매길 수 있는 능력이 있다는 것입니다.전화할 때transform()Decision Tree에서는 입력 데이터를 가져와 가장 중요한 기능을 찾습니다.따라서 데이터 행렬(n 행 x m 열)을 더 작은 행렬(n 행 x k 열)로 변환하는 것을 생각할 수 있습니다. 여기서 k 열은 의사결정 트리에서 발견한 가장 중요한 특징입니다.

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

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

파이프라인은 데이터가 변환되는 일련의 단계입니다.이것은 오래된 "파이프와 필터" 디자인 패턴에서 비롯됩니다(예를 들어, 파이프 "|" 또는 리디렉션 연산자 ">"가 있는 unix bash 명령을 생각할 수 있습니다).그러나 파이프라인은 코드의 개체입니다.따라서 각 필터에 대한 클래스(예: 각 파이프라인 단계)를 가진 다음 이러한 단계를 최종 파이프라인에 결합하는 다른 클래스를 가질 수 있습니다.일부 파이프라인은 다른 파이프라인을 직렬 또는 병렬로 결합하거나 여러 입력 또는 출력을 가질 수 있습니다.파이프라이닝 머신러닝을 다음과 같이 보고 싶습니다.

  • 파이프필터.파이프라인의 단계는 데이터를 처리하고 데이터에서 학습할 수 있는 내부 상태를 관리합니다.
  • 컴포지트.파이프라인은 중첩될 수 있습니다. 예를 들어, 전체 파이프라인은 다른 파이프라인에서 단일 파이프라인 단계로 처리될 수 있습니다.파이프라인 단계가 반드시 파이프라인일 필요는 없지만, 파이프라인 자체는 정의상 적어도 파이프라인 단계입니다.
  • 방향 비순환 그래프(DAG).파이프라인 단계의 출력을 다른 여러 단계로 전송한 다음 결과 출력을 재결합하는 등의 작업을 수행할 수 있습니다.참고: 파이프라인은 비순환적이지만 여러 항목을 하나씩 처리할 수 있으며, 상태가 변경되면(예: 매번 fit_transform 방법 사용) 상태를 유지하면서 시간이 지남에 따라 반복적으로 전개되는 것으로 볼 수 있습니다(RNN처럼 생각).그것은 파이프라인을 생산에 투입하고 더 많은 데이터에 대해 훈련시킬 때 온라인 학습을 수행하기 위한 파이프라인을 보는 흥미로운 방법입니다.

Scikit-Learn 파이프라인 방법

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

  • 데이터를 학습하고 상태를 획득하는 "적합"(예: 신경망의 신경 가중치는 이러한 상태)
  • 데이터를 실제로 처리하고 예측을 생성하는 "예측"(또는 "예측").

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

  • "fit_transmit"은 데이터를 맞추고 변환하지만, 두 가지 방법을 차례로 직접 수행해야 할 때 잠재적인 코드 최적화를 허용합니다.

sklearn.pipeline의 문제입니다.파이프라인 클래스

Scikit-Learn의 "파이프 앤 필터" 디자인 패턴은 그야말로 아름답습니다.그러나 딥 러닝, AutoML 및 복잡한 프로덕션 레벨 파이프라인에 사용하는 방법은 무엇입니까?

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

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

Scikit-Learn의 문제에 대한 해결책

확실히, Scikit-Learn은 매우 편리하고 잘 만들어졌습니다.하지만, 그것은 재충전이 필요합니다.Scikit-Learn을 최신 컴퓨팅 프로젝트에서 신선하고 유용하게 사용할 수 있도록 하기 위한 Neuraxle의 솔루션을 소개합니다.

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

참고: 파이프라인의 단계에 적합 또는 변환 방법 중 하나가 필요하지 않으면 NonFitableMixin 또는 NonTransformableMixin에서 상속되어 이러한 방법 중 하나를 기본적으로 구현하여 아무것도 수행하지 않을 수 있습니다.

우선 파이프라인 또는 파이프라인 단계에서 다음 방법을 선택적으로 정의할 수 있습니다.

  • 각 단계에서 "http" 방법을 호출하는 "http".예를 들어, 스텝에 TensorFlow, PyTorch 또는 Keras 신경망이 포함되어 있는 경우, 스텝은 적합하기 전에 "설정" 방법으로 신경 그래프를 생성하여 GPU에 등록할 수 있습니다.사용자에게 가장 적합한 하이퍼 파라미터를 검색하는 자동 기계 학습 알고리즘 내에서 다른 하이퍼 파라미터를 사용하여 여러 번 실행하기 전에 단계를 복사하는 경우와 같은 몇 가지 이유로 인해 단계의 생성자에 직접 그래프를 생성하는 것이 좋습니다.
  • "teardown"은 "teardown" 방식의 반대어로 리소스를 삭제합니다.

하이퍼 매개 변수를 관리할 수 있도록 기본적으로 제공되는 방법은 다음과 같습니다.

  • "get_hyperparams"는 하이퍼 파라미터 사전을 반환합니다.파이프라인에 더 많은 파이프라인(내포된 파이프라인)이 포함된 경우 하이퍼파라미터' 키는 이중 밑줄 "__" 구분 기호로 연결됩니다.
  • "set_hyperparams"를 사용하면 새로운 하이퍼 파라미터를 가져올 때와 동일한 형식으로 설정할 수 있습니다.
  • "get_hyperparams_space"를 사용하면 하이퍼파라미터의 공간을 얻을 수 있으며, 하이퍼파라미터를 정의한 경우 이 공간은 비어 있지 않습니다.여기서 "get_hyperparams"와 다른 점은 정확한 값이 아닌 값으로 통계 분포를 얻을 수 있다는 것입니다.예를 들어, 계층 수에 대한 하나의 하이퍼 파라미터는RandInt(1, 3)1~3개의 층을 의미합니다.전화할 수 있습니다..rvs()이 딕트에서 값을 무작위로 선택하여 "set_dllparams"로 전송하여 훈련을 시도합니다.
  • "set_setparams_space"는 "get_sysparams_space"와 동일한 하이퍼파라미터 분포 클래스를 사용하여 새 공간을 설정하는 데 사용할 수 있습니다.

제안된 솔루션에 대한 자세한 내용은 위의 링크와 함께 큰 목록의 항목을 참조하십시오.

    from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
import pandas as pd

class TextTransformer(BaseEstimator, TransformerMixin):
    """
    Преобразование текстовых признаков
    """
    def __init__(self, key):
        self.key = key

    def fit(self, X, y=None, *parg, **kwarg):
        return self

    def transform(self, X):
        return X[self.key]
    

class NumberTransformer(BaseEstimator, TransformerMixin):
    """
    Преобразование числовых признаков
    """
    def __init__(self, key):
        self.key = key

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        return X[[self.key]]



def fit_predict(model, X_train, X_test, y_train, y_test):
    vec_tdidf = TfidfVectorizer(ngram_range=(2,2), analyzer='word', norm='l2')
    
    text = Pipeline([
                    ('transformer', TextTransformer(key='clear_messages')),
                    ('vectorizer', vec_tdidf)
                    ])
    word_numeric = Pipeline([
                    ('transformer', NumberTransformer(key='word_count')),
                    ('scalar', StandardScaler())
                    ])
    word_class = Pipeline([
                    ('transformer', NumberTransformer(key='preds')),
                    ('scalar', StandardScaler())
                    ])
    # Объединение всех признаков
    features = FeatureUnion([('Text_Feature', text),
                             ('Num1_Feature', word_numeric),
                             ('Num2_Feature', word_class)
                            ])
    
    # Классификатор
    clf = model
    
    # Объединение классификатора и признаков
    pipe = Pipeline([('features', features),
                     ('clf',clf)
                     ])
    
    # Обучение модели
    pipe_fit=pipe.fit(X_train, y_train)
    
    # Предсказание данных
    preds = pipe_fit.predict(X_test)
    
    return preds, pipe_fit

언급URL : https://stackoverflow.com/questions/33091376/what-is-exactly-sklearn-pipeline-pipeline

반응형