해결됨
[개정판] 파이썬 머신러닝 완벽 가이드
PCA 의 적용 방안 - 전체 feature vs. 일부 feature
강사님, 안녕하세요? 좋은 강의 항상 감사드립니다.
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)