2017-12-19 21 views
0

나는 같은 DataFrame 있습니다. 실제 worker_dicts에는 더 많은 필드가 있습니다. 바이너리 결과 열에 관심이 있습니다. 내가 처음 일을하려고 무엇SkLearn :</p> <pre><code> text_data worker_dicts outcomes 0 "Some string" {"Sector":"Finance", 0 "State: NJ"} 1 "Another string" {"Sector":"Programming", 1 "State: NY"} </code></pre> <p>그것은 텍스트 정보 및 사전 인 열을 모두 가지고 특징 연합 (EU) 사전 및 텍스트 데이터는

은 조잡하게 그에 다항 NB를 실행 한 후 두 열을 연결, 두 text_dataworker_dict를 결합했다 :

df['stacked_features']=df['text_data'].astype(str)+'_'+df['worker_dicts'] 
    stacked_features = np.array(df['stacked_features']) 
    outcomes = np.array(df['outcomes']) 
    text_clf = Pipeline([('vect', TfidfVectorizer(stop_words='english'), ngram_range = (1,3)), 
    ('clf', MultinomialNB())]) 
    text_clf = text_clf.fit(stacked_features, outcomes) 

을하지만 아주 나쁜 정확성을 가지고, 나는 피팅이 생각 독립 모델은 두 가지 유형의 피쳐에 하나의 모델을 맞추는 것보다 데이터를 더 잘 사용할 수 있습니다 (스태킹과 같이).

피쳐 유니온을 어떻게 활용할 수 있습니까? worker_dicts은 사전이기 때문에 좀 이상합니다. 그래서 파싱을 어떻게하는지에 대해 매우 혼란 스럽습니다.

답변

1

사전 항목이 예제에있는 것처럼 범주 형 인 경우 추가 처리를 수행하기 전에 사전 항목과 다른 열을 만듭니다.

new_features = pd.DataFrame(df['worker_dicts'].values.tolist()) 

그런 다음 new_featuresSectorState와 자신의 dataframe 될 것이다 당신이 할 수있는 하나의 뜨거운 인코딩과 같은 사람들을 당신의 text_data 열의 TFIDF 또는 다른 특징 추출에 추가로 필요합니다. 이를 파이프 라인에서 사용하려면 새로운 변환기 클래스를 만들어야하므로 사전 구문 분석과 TFIDF를 별도로 적용한 다음 결과를 스택에 추가하고 파이프 라인에 OneHotEncoding을 추가하는 것이 좋습니다. 변환기를 적용 할 열. 인코딩하려는 범주가 문자열이므로 인코딩 변환에 OneHotEncoder 클래스 대신 LabelBinarizer 클래스를 사용하려고 할 수 있습니다.

파이프 라인을 사용하여 모든 열에 대해 TFIDF 만 사용하려면 here과 같이 열을 추출하도록 설정된 중첩 파이프 라인 및 FeatureUnion을 사용해야합니다.

아래와 같이 데이터 프레임 X1 및 X2에 핫 인코딩 된 기능이 있고 X3에 텍스트 기능이있는 경우 파이프 라인을 만들려면 다음과 같이 할 수 있습니다.

X = pd.concat([X1, X2, X3], axis=1) 

def select_text_data(X): 
    return X['text_data'] 

def select_remaining_data(X): 
    return X.drop('text_data', axis=1) 


# pipeline to get all tfidf and word count for first column 
text_pipeline = Pipeline([ 
    ('column_selection', FunctionTransformer(select_text_data, validate=False)), 
    ('tfidf', TfidfVectorizer()) 
]) 


final_pipeline = Pipeline([('feature-union', FeatureUnion([('text-features', text_pipeline), 
           ('other-features', FunctionTransformer(select_remaining_data)) 
           ])), 
          ('clf', LogisticRegression()) 
          ]) 

(가 fitfit_transform 방법이 없기 때문에 MultinomialNB 파이프 라인에서 작동하지 않습니다)

+0

이것은 매우 유익한 대답은 (다른 많은 옵션이 있습니다, 이것은 단지 하나의 방법입니다)! 그 사이에 나는 Pandas를 사용하여 몇 가지 일을 끝내기 시작했다. 첫째, 각각의 'worker_dicts'키 ('Sector','State')를 열로 변환 한 다음, 각 열에 one-hot 인코딩을 사용했다. . 그런 다음 두 열 모두에 대해 단일 핫 인코딩의 출력 인 모든 희소 매트릭스를 쌓았습니다. 'X1'과 'X2'는 각각 '섹터'와 '상태'의 원 핫 인코딩을 포함하는 스택 드문 드문 배열을 나타냅니다. 'X3'는 벡터화 된'text_data' 칼럼을 나타냅니다. – thewhitetie

+0

데이터를 수정하면 (X1, X2, X3) - 제안한 두 가지 방법을 수정하면 되겠습니까? – thewhitetie