본문 바로가기
AI Research/Data Analysis

[데이터 분석] Feature Engineering (Sklearn)

by ga.0_0.ga 2023. 3. 5.
728x90
반응형

Kaggle의 'Adult Census Income' 데이터를 이용하였습니다.

 

▶ 인코딩(Encoding)

모델이 이해하기 힘든 형태의 feature 혹은 애매하게 잘못 학습될 가능성이 있는 feature들을 의미적인 관점에서 변화시켜줍니다. 인코딩의 결과에 의해서 알고리즘이 보는 feature의 의미적인 특징이 드러나게 됩니다.

one-hot encoding과 label encoding, Mean encoding 에 대해 설명하겠습니다.

from sklearn.preprocessing import OneHotEncoder, LabelEncoder

 

 

1. one-hot encoding

categorical encoding이라고도 하며, 범주형 변수에 대해 각 클래스별 독립적인 feature를 생성합니다.

dataframe내의 'workclass' 열을 인코딩 해보겠습니다.

oe = OneHotEncoder()
oe_result = oe.fit_transform(train['workclass'].values.reshape(-1, 1)).toarray()
oe_result.shape  ## (26049, 9)

oe_result를 출력해보면 위와 같습니다. 'workclass' 에는 총 9개의 클래스가 존재하고 각 번호가 어떤 클래스에 해당하는지 알고싶다면 get_feature_name함수를 이용하면 됩니다.

oe.get_feature_names(['workclass'])

인코딩된 값을 기존 dataframe에 추가하는 방법은 아래와 같습니다.

sub=pd.DataFrame(data=oe_result, columns=oe.get_feature_names(['workclass']))
pd.concat([train, sub], axis=1)

기존 dataframe의 뒤쪽에 원-핫 인코딩 결과물이 추가된 것을 확인할 수 있습니다.

모든 행에 대해 한번에 원-핫 인코딩을 해주고싶다면 pandas의 get_dummies 함수를 사용하면 됩니다!

pd.get_dummies(train)

 

 

2. Label encoding

순서가 있는 변수에 대해서 단순 숫자로 넘버링합니다. 라벨의 순서를 정할 수 없고, 느리다는 단점이 있습니다. 이번에도 'workclass'열을 인코딩 해보겠습니다.

le = LabelEncoder()  
le_result = le.fit_transform(train['workclass'].values.reshape(-1, 1))
le_result.shape ## (26049,)

인코딩 결과는 위와 같습니다. 각 행의 'workclass' 열의 클래스가 숫자로 넘버링 되었습니다. 각 번호가 어떤 클래스에 해당하는지 알고싶다면 unique()함수를 이용하면 됩니다.

train['workclass'].unique()

3. Mean edcoding

약간 변칙적인 방법에 속합니다. 해당 feature의 각 클래스 별 target분포를 바탕으로 feature값을 매핑합니다. positive 비율의 정보를 feature로 사용하는 것이 그 예중 하나입니다. 만약 남자의 positive 비율이 60%라면 남자라는 클래스는 0.6으로 인코딩해주면 됩니다. 성능이 좋아질 수는 있지만 오버피팅이 발생할 확률이 높아진다는 단점이 존재합니다. 'income'에 대한 정보를 이용해 'sex'를 인코딩 하겠습니다.

male_positive = train.loc[train['sex']=='Male', "income"]
female_positive = train.loc[train['sex']=='Female', "income"]
male_positive.value_counts()

(male_positive.value_counts() / male_positive.shape[0])

<=50K 인 것의 비율과 >50K인 것의 비율에 맞게 인코딩 되었습니다.

▶ PCA(주성분 분석)

from sklearn.decomposition import PCA
pca = PCA(n_components=60, svd_solver='full')

107개의 차원을 60개 차원으로 인코딩해보겠습니다.

먼저 학습에 사용하지 않을 열들을 제거해줍니다. 'income_<=50K' 과 'income_>50K'은 정답 라벨이기 때문에 제거해줍니다.

dummied = dummied.drop(columns=['id', 'income_<=50K', 'income_>50K'])

제거 후 shape을 확인해 보면 26049 rows × 107 columns 입니다.

다음은 정규분포로 스케일링 한 후 PCA를 적용해주겠습니다.

X_train_std = st_scaler.fit_transform(dummied)
X_train_pca = pca.fit_transform(X_train_std)
X_train_pca.shape

X_train_pca의 shape을 확인해보면 (26049, 60)입니다. 107개였던 feature의 차원이 PCA를 통해 60으로 줄어들었습니다!

PCA에 사용된 분산과 고유 벡터 등도 확인할 수 있습니다.

pca.explained_variance_ # 60개의 고유값행렬, 가장 큰 분산을 가진 순으로 정렬되어있습니다.
pca.components_ ## 고유 벡터, 107개의 차원이 60으로 나오는 고유값 변환행렬입니다.

 

728x90
반응형

댓글