2016-12-16 1 views
0

데이터가 데이터베이스에있는 프로젝트에서 scikit-learn Pipeline의 FeatureUnion 기능을 사용하려고합니다. 나는 내가하고있는 일을 구조화하는 방법에 몇 가지 근본적인 문제가있다.Sci-Kit Learn FeatureUnion의 행 수가 다릅니다.

데이터베이스의 서로 다른 두 테이블에서 두 가지 기능을 생성합니다. 나는 fetch_x1, fetch_x2 메서드를 사용하여 데이터베이스 테이블에서 관심있는 데이터를 pandas DataFrames로 가져온다. 두 개의 DataFrames를 dataframe 사전에 압축합니다. 각 변압기에서 관심있는 DataFrame의 압축을 풀고 조작합니다. 나는이 패턴을 따르고있다. post.

내 코드는 다음과 같습니다 : 나는 다른 더 근본적인 문제로 실행 해요

class Feature1Extractor(TransformerMixin): 

    def transform(self, dictionary_of_dataframes): 
     df = dictionary_of_dataframes['feature1_raw_data'] 
     x = df.groupby('user_id').count()['x1'] 
     return df 

class Feature2Extractor(TransformerMixin): 

    def transform(self, dictionary_of_dataframes): 
     df = dictionary_of_dataframes['feature2'] 
     x = df.groupby('user_id').sum()['x2'] 
     return x 

pipeline = Pipeline([ 
    ('union', FeatureUnion(
     transformer_list=[ 
      ('feature1', Feature1Extractor()), 
      ('feature2', Feature2Extractor())])), 
    ('null', None) 
]) 

pipeline.transform(dictionary_of_dataframes) 

- 변환 후 각 파이프 라인에서 나온 두 개의 기능 행렬은 행의 다른 수 있습니다. 따라서 FeatureUnion 끝에 간단한 hstack 좋아해서 실패하면 :

ValueError: all the input array dimensions except for the concatenation axis must match exactly 

I이 가지고있는 데이터에 기초한다. feature1 테이블에는 존재하지 않는 많은 수의 user_id가 있습니다. 마찬가지로 feature2 테이블에없는 많은 user_id가 있습니다. 이는 데이터의 기본 요소입니다. 사용자가 feature1 테이블에 데이터가 없으면 앱에서 해당 기능을 사용하지 않았습니다. 데이터 없음 = 해당 기능에 대한 참여가 없습니다. (feature1에 대한)

DF (feature2에 대한)

user_id, x1, timestamp 
1, 'click', 1/1/2016 
1, 'click', 1/2/2016 
2, 'click', 1/2/2016 

안양

user_id, x2, timestamp 
2, 12.3, 1/2/2016 
3, 14,5, 1/4/2016 

참고 : 명시 적으로 예를하려면, 여기에 각 변압기에 전달되는 두 안양의의 예 feature1의 DataFrame에는 사용자 3이없고 feature2의 DataFrame에는 사용자 1이 없습니다. 파이프 라인을 사용하지 않고이 작업을 수행하면 외부 조인을 수행 한 다음 결과 병합 된 데이터 프레임에 fillna (0)를 수행합니다.

merged_df = pd.merge(df1, df1, how='outer', left_on=['user_id'], right_on=['user_id']) 
final_df = merged_df.fillna(0) 

그러나 FeatureUnion 방법을 사용하여이를 수행 할 방법이없는 것 같습니다. 그리고 파이프 라인 프레임 워크에서 깨끗한 해결 방법을 생각할 수없는 것 같습니다. 별도의 파이프 라인을 실행하고, 각각을 변환하고, 팬더에서 외부 조인과 fillna를 수행 한 다음 완료된 지형 매트릭스를 다운 스트림으로 실행해야합니다. 모델링 파이프 라인? 더 좋은 방법이 있습니까? 도움을 청하는 커뮤니티.

참고 : 이전에 user_ids를 알지 못합니다. 타임 스탬프 범위 ... user_id가 아닌 테이블을 쿼리하고 있습니다. 질의 자체는 훈련 (또는 테스트)에서 내가 설정해야하는 사용자를 알려줍니다.

+0

그것은 당신이 요구하는지 팔로우하기 어렵다 (나는 그것을 테스트하지 않았다, 단지 아이디어를 참조). 우리가 가지고있는 문제를 확인할 수 있도록 예제 데이터 나 작은 입/출력을 제공하십시오. 나는 왜 당신이 하나의 데이터 집합을 채워서 다른 행과 동일한 수의 행을 채울 수 없는지 확신하지 못하고 (None's 또는 무엇으로 채우십시오), FeatureUnion을 수행합니다. – mwm314

+0

당신이 맞습니다. 나는 편집 할 것입니다. 적절하게 ... 나는 모든 user_ids를 알기조차하지 못하고있다. 그래서 내가 외부 조인을하고있다. 나는 그것을 별도로 추적하고 싶지 않다. 나는 이것을 좋은 예를 중심으로보다 깊게 편집 할 것이다. –

답변

0

왜, 팬더 기반 노조를 만들지 않겠습니까? 이 같은 뭔가 ...

class DataMerging(BaseEstimator): 

    def __init__(self): 
     return self 

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

    def transform(self, dfs): 
     df1, df2 = dfs 
     merged_df = pd.merge(df1, df2, how='outer', left_on=['user_id'], right_on=['user_id']).fillna(0) 
     return merged_df.values #(return shape (n_features, n_samples)) 


pipeline = Pipeline([ 
    ('union', DataMerging, 
    ('other thing', ...) 
])   

pipeline.fit(df1, df2) 
+0

좋습니다. 흥미 롭습니다. 그러나 이것이 파이프 라인 설명에 어울리는 지 완전히 이해하지 못했습니다 ... 또한 FeatureUnion을 서브 클래스 화해야합니까? –