2017-10-10 1 views
3

내가 하나 뜨거운 인코딩을 할 수있는 내가 좋아하는 것어떻게 나중에

import pandas as pd 
data = { 
    'Reference': [1, 2, 3, 4, 5], 
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'], 
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'], 
    'Mileage': [35000, 45000, 121000, 35000, 181000], 
    'Year': [2015, 2014, 2012, 2016, 2013] 
} 
df = pd.DataFrame(data) 

다음과 같은 데이터가 있다고 가정 해 - 알아 Scikit와 함께 사용하기위한 팬더 DataFrame의 여러 열에서 하나의 뜨거운 인코딩을 할 수 분류자를 훈련시키고 (Scikit-Learn로 말하기) 두해의 "Brand"와 "Town"란을 사용하여 연도를 예측하십시오.

분류기를 익히면 새로운 수신 데이터 (교육에서 사용하지 않음)에 대한 연도를 예측해야합니다. 여기에서 동일한 핫 인코딩을 다시 적용해야합니다. 예를 들어 이러한 맥락에서

new_data = { 
    'Reference': [6, 7], 
    'Brand': ['Volvo', 'Audi'], 
    'Town': ['Stockholm', 'Munich'] 
} 

, 어떤 여러 열을 인코딩 할 필요가 있음을 알고 팬더 DataFrame에 2 열 중 하나 뜨거운 인코딩을 할 수있는 가장 좋은 방법이며, 필요가 있음 나중에 새 데이터에 동일한 인코딩을 적용 할 수 있습니다.

이것은 How to re-use LabelBinarizer for input prediction in SkLearn

답변

3

의 후속 질문 the following approach을 고려합니다.

데모 :

from sklearn.preprocessing import LabelBinarizer 
from collections import defaultdict 

d = defaultdict(LabelBinarizer) 

In [7]: cols2bnrz = ['Brand','Town'] 

In [8]: df[cols2bnrz].apply(lambda x: d[x.name].fit(x)) 
Out[8]: 
Brand LabelBinarizer(neg_label=0, pos_label=1, spars... 
Town  LabelBinarizer(neg_label=0, pos_label=1, spars... 
dtype: object 

In [10]: new = pd.DataFrame({ 
    ...:  'Reference': [6, 7], 
    ...:  'Brand': ['Volvo', 'Audi'], 
    ...:  'Town': ['Stockholm', 'Munich'] 
    ...: }) 

In [11]: new 
Out[11]: 
    Brand Reference  Town 
0 Volvo   6 Stockholm 
1 Audi   7  Munich 

In [12]: pd.DataFrame(d['Brand'].transform(new['Brand']), columns=d['Brand'].classes_) 
Out[12]: 
    Audi Volkswagen Volvo 
0  0   0  1 
1  1   0  0 

In [13]: pd.DataFrame(d['Town'].transform(new['Town']), columns=d['Town'].classes_) 
Out[13]: 
    Berlin Munich Stockholm 
0  0  0   1 
1  0  1   0 
1

당신이 제공하는 get_dummies 기능 팬더를 사용하여 범주 값을 변환 할 수 있습니다. 이 같은

뭔가 .. 당신이 할 수있는 테스트 데이터에 대한

import pandas as pd 
data = { 
    'Reference': [1, 2, 3, 4, 5], 
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'], 
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'], 
    'Mileage': [35000, 45000, 121000, 35000, 181000], 
    'Year': [2015, 2014, 2012, 2016, 2013] 
} 
df = pd.DataFrame(data) 

train = pd.concat([df.get(['Mileage','Reference','Year']), 
          pd.get_dummies(df['Brand'], prefix='Brand'), 
          pd.get_dummies(df['Town'], prefix='Town')],axis=1) 

:

테스트 세트는 하나의 뜨거운 인코딩 된 컬럼에 대한 새로운 보이지 않는 값을 가지고 어떤 경우
new_data = { 
    'Reference': [6, 7], 
    'Brand': ['Volvo', 'Audi'], 
    'Town': ['Stockholm', 'Munich'] 
} 
test = pd.DataFrame(new_data) 

test = pd.concat([test.get(['Reference']), 
          pd.get_dummies(test['Brand'], prefix='Brand'), 
          pd.get_dummies(test['Town'], prefix='Town')],axis=1) 

# Get missing columns in the training test 
missing_cols = set(train.columns) - set(test.columns) 
# Add a missing column in test set with default value equal to 0 
for c in missing_cols: 
    test[c] = 0 
# Ensure the order of column in the test set is in the same order than in train set 
test = test[train.columns] 
+1

? 이 방법으로 유지 또는 제거 될 것입니다. 실례지만 마지막 줄을 이해할 수 없기 때문에 묻습니다. –