2016-09-19 7 views
1

은 가짜 데이터를 감안할 때 :두 개의 입력으로 fit_transformer를 작성하고 파이썬 sklearn의 파이프 라인에 포함시키는 방법은 무엇입니까?

X = pd.DataFrame(np.random.randint(1,10,28).reshape(14,2)) 
y = pd.Series(np.repeat([0,1], [10,4])) # imbalanced with more 0s than 1s 

나는 아래-샘플 Y의 대부분이 소수의 라벨의 길이와 일치하는 sklearn 맞는 변압기 물품. 파이프 라인에서 사용하고 싶습니다.

from sklearn.base import BaseEstimator, TransformerMixin 

class UnderSampling(BaseEstimator, TransformerMixin): 
    def fit(self, X, y): # I don't need fit to do anything 
     return self 

    def transform(self, X, y): 
     is_pos = y == 1 
     idx_pos = y[is_pos].index 
     random.seed(random_state) 
     idx_neg = random.sample(y[~is_pos].index, is_pos.sum()) 
     idx = sorted(list(idx_pos) + list(idx_neg)) 
     X_resampled = X.loc[idx] 
     y_resampled = y.loc[idx] 
     return X_resampled, y_resampled 

    def fit_transform(self, X, y): 
     return self.transform(X,y) 

불행히도, 나는 파이프 라인에서 사용할 수 없습니다.

from sklearn.pipeline import make_pipeline 
us = UnderSampling() 
rfc = RandomForestClassifier() 
model = make_pipeline(us, rfc) 
model.fit(X,y) 

어떻게하면이 파이프 라인을 작동시킬 수 있습니까?

답변

0

클래스의 추정기 메서드를 직접 호출 할 의도는 아니며 클래스 인스턴스에서 호출하는 것이 좋습니다. 종종 추정기 저장된 상태의 어떤 종류 (예를 들면, 모델 계수)를 보유하고 있기 때문이다 :

u = UnderSampling() 
a,b = u.fit(X, y) 
a,b = u.fit_transform(X, y) 
0

PipeGraph는 입력 신호에 대한 임의의 동작을 정의 할 수있는 파이프 라인에 대한 확장이다 (https://mcasl.github.io/PipeGraph/의 예 갤러리보기).