2

41 개 [0에서 40 개까지]의 피쳐가있는 데이터 세트가 있으며 그 중 7 개가 카테고리입니다.sklearn의 범주 기능을 인코딩하는 방법은 무엇입니까?

  • 문자열 유형의 서브 세트 (열 - 기능 1, 2, 3)
  • 바이너리 형식으로 0 또는 1 INT 형의 서브셋합니다 (칼럼 -이 무조건 세트는 두 개의 서브 세트 나누어 져 특징 6, 11, 20, 21)

또한 열 기능 1, 2 및 3 (문자열 유형)은 각각 카디널리티 3, 66 및 11을 갖습니다. 이 컨텍스트에서 지원 벡터 컴퓨터 알고리즘을 사용하도록 인코딩해야합니다. 이것은 내가 가지고있는 코드입니다 : [I 위의 노출 된 이유] DictVectorizer() 또는 OneHotEncoder()을 사용하는 것이 좋습니다 경우

import numpy as np 
import pandas as pd 
from sklearn import preprocessing 
from sklearn import feature_extraction 

df = pd.read_csv("train.csv") 
datanumpy = df.as_matrix() 
X = datanumpy[:, 0:40] # select columns 1 through 41 (the features) 
y = datanumpy[:, 41] # select column 42 (the labels) 

나도 몰라, 그리고 주로하는 방법의 관점에서 그들을 [사용 코드]에 내가 가지고있는 X 매트릭스가 있습니다. 또는 단순히 문자열 유형의 하위 집합에서 각 카디널리티에 숫자를 할당해야합니까 (카디널리티가 높기 때문에 기하 급수적으로 기하학적 공간이 커질 수 있습니다)?

편집 INT 타입의 부분 집합에 대한 나는 최선의 선택은 그들이 문제 (있는 인코더를 통과하지 못한) 문자열 형식의 집합 지속으로 열 기능을 유지하는 것입니다 추측 높은 카디널리티. 당신은 메모리 오버 플로우를 얻거나 그 다음 카디널리티를 줄일 너무 느린 경우

df = pd.get_dummies(df, drop_first=True) 

:

top = df[col].isin(df[col].value_counts().index[:10]) 
df.loc[~top, col] = "other" 

답변

3

이것은 지금까지 가장 쉬운 방법입니다 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OneHotEncoder에 해당하는 sklearn을 사용할 수 있습니다. 그것은 (표시하지 않을 경우, 자동으로 최적의 수를 선택합니다) 각 기능에 대한을 유지하기 위해 당신은 인코딩하고자하는 범주 기능과 값의 번호와 같은 매개 변수에 당신이 통과 할 수 있기 때문에

나는OneHotEncoder를 선호 .

일부 기능의 경우 카디널리티가 너무 크면 n_values을 부탁합니다. 메모리가 충분하면 걱정하지 마십시오. 모든 기능 값을 인코딩하십시오.

기본 카스 터가있는 경우 카디널리티가 66이라고 추측됩니다. 66 개의 모든 기능을 인코딩해도 메모리 문제가 발생하지 않습니다. 메모리 오버플로는 일반적으로 데이터 세트의 샘플 수와 같은 기능에 대한 값이 많은 경우 (샘플 당 고유 한 ID의 경우)에 발생합니다. 데이터 집합이 클수록 메모리 문제가 발생할 확률이 높습니다.

+0

다른 'DataFrame'개체 (예 : 기차 및 테스트) 간의 일관성을 보장하지 않기 때문에 이는 받아 들일 수있는 대답이 아닙니다. – ldavid

+0

기차/테스트의 경우에는 분할하기 전에 적용 할 수 있지만 물론 예측할 새 데이터 세트에서 동일한 문제가 발생할 수 있습니다. 이 경우 하나의 솔루션은 pandas 범주 데이터를 사용하여 범주를 지정한 다음 동일한 데이터 집합에 동일한 사양을 적용하는 것입니다. 이런 식으로 get_dummies는 매번 동일한 인코딩을 사용합니다. – simon

0

당신은 제안으로 pandas 방법 .get_dummies()을 사용할 수 있습니다

+0

나는 당신의 의견에 동의하지만, 내 데이터 세트가 정말 거대하기 때문에 Support Vector가 실행되는 데 걸리는 시간도 걱정된다. 어쨌든 OneHotEncoder를 사용하는 스크립트 기반을 가지고 있습니까 (예전의 LabelEncoder 사용법과 같음)? – Gil

-1
from sklearn.preprocessing import LabelEncoder, OneHotEncoder 
labelencoder_X = LabelEncoder() 
X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) 
onehotencoder = OneHotEncoder(categorical_features = [0]) 
X = onehotencoder.fit_transform(X).toarray() 
+2

몇 가지 설명을 포함하여 답을 편집하십시오. 코드 전용 답변은 향후 SO 독자를 교육하는 데 거의 도움이되지 않습니다. 귀하의 대답은 저품질을위한 중재 큐에 있습니다. – mickmackusa

+0

@mickmackusa 동의 –

+0

이것은 내 downvote되지 않습니다. 나는 SO에 대한 답변을 모든 사람에게 교육/도움이되기를 원합니다. (OP뿐 아니라). SO를 교실로 생각하십시오. 교사가 될 수있는 최고의 교사가 되십시오. – mickmackusa

0

하나의 핫 인코더에 대한 공식 문서에 따라 결합 된 데이터 집합 (기차 및 테스트)을 통해 적용해야합니다. 그렇지 않으면 적절한 인코딩을 만들지 못할 수 있습니다.

성능면에서 나는 One Hot Encoder가 DictVectorizer보다 훨씬 뛰어나다 고 생각합니다.

+0

One-Hot 인코더가 DictVectorizer보다 훨씬 좋은 이유는 무엇입니까? 이 데이터를 지원할 수있는 데이터가 있습니까? –