인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

aquarid22's profile image
aquarid22

asked

[Revised Edition] The Complete Guide to Python Machine Learning

Dimensionality Reduction Practice on Credit Card Dataset Using PCA

PCA 의 적용 방안 - 전체 feature vs. 일부 feature

Resolved

Written on

·

560

0

강사님, 안녕하세요? 좋은 강의 항상 감사드립니다.

PCA 적용 실습 사례를 보다가 궁금한 점이 있어 질문을 드립니다. 본 단원 신용카드 실습 예제에서 전체 feature 에 대해서 PCA 를 진행하여  차원축소를 시도했을 때 변수를 줄여 효율성을 높이되 모델 성능에서는 약간의 손실이 발생하였는데요,

전체 feature 에 대한 PCA 적용이 아닌,  물리적인 의미에 유사성이 있으면서도 서로 상관도가 높은 feature 들끼리만그룹을 만들어서 feature 그룹 별 PCA 를 진행하는 경우, 변환된 PC score 중 변동성이 높은 상위 feature 일부만 선택하더라도 모델의 예측성능이 향상될 가능성이 있지는 않을지 문의드립니다.

예를 들어 PAY0~PAY6 끼리 묶어서 첫번째 PCA 를 돌리고, BILL_AMT1~BILL_AMT6끼리만 묶어서 두번째 PCA 를 돌려서 전체 데이터셋의 feature 간 다중공선성을 없애는 방식으로 PCA 를 활용하는 방법을 문의드리는 것이구요,

본 예제에서 사용된 신용카드 데이터셋을 가지고 이렇게 변환해서 feature 재정의를 한 경우와 하지 않은 경우에 대한 모델 예측성능을 비교해 보면 train / test set 분류 상황에 따라서 유사하거나 약간 좋아지는 경향도 보이는 것도 같은데... 예제를 가지고 해 본 것이다보니 .. 현업 데이터분석에 활용시 이렇게 접근하는 것이 실제로 의미가 있는 접근 방법일 수 있는 것인지, 혹은  방법론 상 문제는 없을지요..? (전체 feature가 아닌 부분적인 feature 집합에 한정한 PCA 적용 방안)

감사합니다.

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

credit_ds = pd.read_csv('pca_credit_card.csv', header=1) # 1은 연체, 0은 연체 아님

SS_pay = StandardScaler()

SS_bill = StandardScaler()

pca_pay = PCA()

pca_bill = PCA()

SS_pay.fit(credit_ds.iloc[:,5:11])

pay = SS_pay.transform(credit_ds.iloc[:,5:11])

pca_pay.fit(pay)

pay_transformed = pd.DataFrame(pca_pay.transform(pay), columns=['pay_PC1','pay_PC2','pay_PC3','pay_PC4','pay_PC5','pay_PC6'])

credit_ds.iloc[:,5:11] = pay_transformed

SS_bill.fit(credit_ds.iloc[:,11:17])

bill = SS_bill.transform(credit_ds.iloc[:,11:17])

pca_bill.fit(bill)

bill_transformed = pd.DataFrame(pca_bill.transform(bill), columns=['bill_PC1','bill_PC2','bill_PC3','bill_PC4','bill_PC5','bill_PC6'])

credit_ds.iloc[:,11:17] = bill_transformed

credit_ds['class'] = credit_ds['default payment next month']

credit_ds = credit_ds.drop(['ID', 'default payment next month'], axis=1)

plt.figure(figsize=(15,15))

sns.heatmap(credit_ds.corr(), annot = True)

pcafeature통계pythonextraction머신러닝 배워볼래요?

Answer 2

1

dooleyz3525님의 프로필 이미지
dooleyz3525
Instructor

안녕하십니까,

좋은 아이디어시군요. 충분히 추진해 볼만한 생각입니다.

근데 제가 비슷한 적용을 과거에 한번 해당 데이터세트에 적용 해본적이 있습니다.  그런데 성능이 개선되지는 않았습니다. 아쿠아라이드 님께서 해당 방법을 적용해 보셨을 때 성능이 약간 개선되었다면 이 역시 좋은 feature engineering 방법입니다.

당시 좀 아이러니 했던것은 기존 feature를 그대로 유지하고, PAY0~PAY6 기반으로 pca를 돌려서 새로운 feature를 하나 만들고 마찬가지로 BILL0~BILL6 기반으로 또 feature를 만들었을 때, 그러니까 기존 feature에 새로운 feature 2개를 추가했을때 약간 성능이 증가하였습니다. 사실 다중 공선성을 염려한다면, 성능이 좋아질 이유는 없었지만, 해당 feature를 제거하고 PCA 변환된 feature를 추가하는 것 보다 이 방식이 약간 성능이 좋았습니다.(기억이 오래되서...)

요약하자만 해당 방식은 2개의 feature를 추가하는 feature engineering 기법이고, 다중 공선성의 영향력을 크지 않았던것 같습니다.

0

aquarid22님의 프로필 이미지
aquarid22
Questioner

답변 감사드립니다. 그리고 경험 공유해 주셔서 감사합니다.

업무 중에 규제없는 선형회귀분석은 많이 사용하고 있었는데 일부 feature 에 PCA 를 적용한 경우 설명율이 유의미한 수준으로 올라가는 경우도 있었고, 어떤 경우에는 동일하거나 오히려 떨어졌던 경우도 있었던 것 같아서.. 왜 케바케 다를까.. 혹은  과연 이렇게 해도 되는 것인가... 하는 의문점을 마음속에 항시 가지고 있었습니다만, 요번 기회에 feature engineering 에 대해 좀 더  명확한 이해를 가질 수 있게 된 듯 합니다. 진심 감사드립니다 :)

말씀 주신 것 처럼 이것저것 많이 시도해 봐야겠네요 ~~ㅎㅎ

aquarid22's profile image
aquarid22

asked

Ask a question