데이터가 데이터베이스에있는 프로젝트에서 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가 아닌 테이블을 쿼리하고 있습니다. 질의 자체는 훈련 (또는 테스트)에서 내가 설정해야하는 사용자를 알려줍니다.
그것은 당신이 요구하는지 팔로우하기 어렵다 (나는 그것을 테스트하지 않았다, 단지 아이디어를 참조). 우리가 가지고있는 문제를 확인할 수 있도록 예제 데이터 나 작은 입/출력을 제공하십시오. 나는 왜 당신이 하나의 데이터 집합을 채워서 다른 행과 동일한 수의 행을 채울 수 없는지 확신하지 못하고 (None's 또는 무엇으로 채우십시오), FeatureUnion을 수행합니다. – mwm314
당신이 맞습니다. 나는 편집 할 것입니다. 적절하게 ... 나는 모든 user_ids를 알기조차하지 못하고있다. 그래서 내가 외부 조인을하고있다. 나는 그것을 별도로 추적하고 싶지 않다. 나는 이것을 좋은 예를 중심으로보다 깊게 편집 할 것이다. –