sklearn.pipeline.Pipeline
정확히 어떻게 작동하는지 알 수 없습니다 .
문서에 몇 가지 설명이 있습니다 . 예를 들어 다음과 같은 의미가 있습니다.
최종 추정기를 사용한 변환 파이프 라인.
내 질문을 더 명확하게하기 위해 무엇 steps
입니까? 어떻게 작동합니까?
편집하다
답변 덕분에 내 질문을 더 명확하게 만들 수 있습니다.
파이프 라인을 호출하고 단계적으로 두 개의 변환기와 하나의 추정기를 전달할 때, 예 :
pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])
전화하면 어떻게 되나요?
pipln.fit()
OR
pipln.fit_transform()
추정기가 변압기가 될 수있는 방법과 변압기가 장착되는 방법을 알 수 없습니다.
답변
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을 호출 할 수 없습니다. 마지막 단계는 예측 자입니다.
답변
나는 M0rkHaV가 올바른 아이디어를 가지고 있다고 생각합니다. Scikit 배우기의 파이프 라인 클래스 만 (한 번 중요한 방법 호출 할 필요가 그래서, 하나의 객체로 추정량과 함께 여러 다른 변압기를 캡슐화하기위한 유용한 도구입니다 fit()
, predict()
등). 두 가지 주요 구성 요소를 분석해 보겠습니다.
-
변환기 는
fit()
및transform()
. 당신은 같은 도구를 전처리 sklearn의 일부에 익숙 할 수TfidfVectorizer
와Binarizer
. 이러한 전처리 도구에 대한 문서를 살펴보면 두 가지 방법을 모두 구현하고 있음을 알 수 있습니다. 내가 꽤 멋지다고 생각하는 것은 일부 추정기가 변환 단계로도 사용될 수 있다는 것입니다LinearSVC
. -
에스티 메이터 는
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 개의 가장 중요한 특징입니다.
답변
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 ”에서와 동일한 하이퍼 파라미터 분포 클래스를 사용하여 새 공간을 설정하는 데 사용할 수 있습니다.
제안 된 솔루션에 대한 자세한 내용은 위의 링크가있는 큰 목록의 항목을 읽으십시오.