다 똑같은 머신러닝 알고리즘을 사용하는데 개발 속도와 성능이 다른 걸까요? 머신러닝에서는 실행착오에서 얻은 경험치가 중요합니다. 실제로 개발 속도와 성능에 영향을 미치죠. 보통 하이퍼파라미터 튜닝에 경험치가 녹아들게 됩니다. 그럼 경험치는 뛰어넘거나 극복할 수 있는 방법은 아예 없는 것일까요?
이제부터 2회에 걸쳐서 개발 속도와 성능을 높이는 다음과 같은 실전 테크닉 2가지를 알려드리겠습니다.
① 그리드서치
② 주성분 분석(PCA)
② 주성분 분석(PCA)
클러스터링 모델의 예측 결과에 사용한 독립변수가 너무 많으면 그래프 한 장으로 깔끔하게 표현하기 어렵습니다. 그렇다고 일부 독립변수만 표현하면 정보를 왜곡할 수 있습니다. PCA를 사용하면 이 문제를 해결할 수 있습니다. PCA는 여러 변수를 압축하는 차원 축소 방법입니다. 12장에서 사용한 데이터셋을 사용해 시각화가 용이하도록 PCA를 적용해보겠습니다.
13.1.2 라이브러리 및 데이터 불러오기
필수 라이브러리와 예측 결과가 포함된 고객 분석 데이터인 customer_pca.csv를 불러옵니다.
지난 장에서 이미 살펴본 데이터이지만 head( ) 함수를 호출해 다시 한번 데이터를 간단히 살펴보겠습니다.
고객별 총 지출금액 및 범주별 지출금액이 스케일링된 상태로 정리되어 있고, 마지막 컬럼에는 각고객이 속한 클러스터 라벨(label)이 들어 있습니다.
9장에서 첫 번째 연습용 데이터로 클러스터링했을 때 클러스터가 잘 나뉘었는지 확인하는 데 산점도 그래프를 이용했습니다. 당시 사용한 데이터는 변수가 오직 2개 뿐이었기에 x축과 y축에 각각 지정하여 쉽게 그래프를 그릴 수 있지만, 지금은 변수가 너무 많아서 2차원의 그림으로 표현하기 어렵습니다. PCA를 사용하여 이 변수들을 변수 2개로 축소한 뒤 산점도 그래프로 출력해 클러스터가 어떻게 나뉘었는지를 확인하겠습니다.
우선 독립변수와 종속변수를 분리합니다. 종속변수(label)는 그대로 유지되어야 하기 때문에 PCA를 적용할 대상에서 제외해야 합니다.
13.1.3 그래프 표현을 위한 차원 축소
PCA 알고리즘은 사이킷런의 decomposition에서 불러올 수 있습니다.
다음은 모델링이나 스케일링처럼 특정 이름으로 속성을 부여해야 하는데, 여기에서 몇 개의 주성분으로 분석할지를 하이퍼파라미터로 정해야 합니다. 이전 장에서 배운 K-평균처럼 이를 사용자가 직접 설정해야 합니다. 2차원의 평면에 그래프를 그리는 것이 목적이기 때문에 2개 주성분만을 가지도록 설정합니다.
pca에 속성이 할당되었으니, fit( )과 transform( )을 사용하여 차원을 축소하겠습니다. 코드 형태는 스케일링 코드와 유사합니다.
customer_pca를 출력하면 다음과 같은 넘파이 형태로 출력됩니다.
PCA도 스케일링과 마찬가지로 넘파이 형태의 결과물을 만들어내기 때문에, 이를 판다스 데이터프레임 형태로 변환해주겠습니다. 각 변수 이름은 PC1, PC2로 지정하겠습니다.
변환된 데이터프레임에 기존 데이터의 목푯값인 label을 붙이겠습니다.
이제 최종 데이터를 head로 확인해봅시다.
이제 명확하게 단 2개 변수와 label이 있으니, 9장의 초반에 만든 산점도 그래프를 그릴 수 있습니다.
보라색과 빨간색 클러스터는 가깝게 붙어 있어서 경계가 모호하기는 하지만 언뜻 보기에 그럴싸하게 잘 나뉜 것 같습니다. 안타깝게도 이 그림에서 알 수 있는 것은 클러스터들이 얼마나 잘 나뉘었는지를 대략 확인하는 것뿐입니다. PCA를 통해 얻어낸 변수 PC1과 PC2는 기존의 모든 변수를 복합적으로 반영하여 만들어졌기 때문에 명료하게 이 새로운 변수들을 해석하기가 쉽지 않습니다.
그나마 추가적으로 각 주성분과 기존 변수와의 상관관계를 알 수 있습니다. PCA 학습에 사용한 pca 뒤에 components_를 붙여 이를 확인할 수 있습니다.
넘파이 형태로 출력되기 때문에 읽기 쉽도록 데이터프레임으로 변환하겠습니다. 각 columns에 기존 데이터의 독립변수 이름들을 입력합니다.
이제 df_comp를 확인하면 다음과 같은 데이터를 확인할 수 있습니다.
왼쪽의 인덱스 0과 1은 각각 주성분 PC1과 PC2를 의미합니다. 그리고 위쪽 컬럼명에는 기존 데이터의 독립변수들이 나열되어 있습니다. 이 숫자들이 의미하는 것은 특정 주성분과 특정 변수와의 상관관계입니다. 예를 들어 인덱스 0(PC1)과 amt와의 상관관계는 0.35이므로, PC1이 높다는 것은 그만큼의 크기만큼 amt가 높다는 의미입니다. 다른 예로 인덱스1(PC2)와 category_gas_transport를 보면 -0.54입니다. 이는 PC2가 클수록 category_gas_transport에 해당하는 값은 낮다는 의미입니다. 각 주성분은 이렇게 수많은 기존 변수와의 관계성을 내포하여 이루어졌기 때문에 명료하게 해석하는 데 어려움이 있습니다. 마지막으로 앞의 테이블을 heatmap( )으로 만들어 시각적으로 표현해보겠습니다.
양수이면 빨간색, 음수이면 파란색 계열로 표현되어 있어, 각 주성분이 변수들과 어떠한 상관관계를 보이는지 쉽게 읽어낼 수 있습니다.
—
이상으로 2회 연재하며 알고리즘 학습 속도를 높여서 더 나은 결과를 더 빠르게 얻을 수 있는 방법을 알아보았습니다. 더 자세한 내용은 책을 참고해주세요.
삼성전자에 마케팅 직군으로 입사하여 앱스토어 결제 데이터를 운영 및 관리했습니다. 데이터에 관심이 생겨 미국으로 유학을 떠나 지금은 모바일 서비스 업체 IDT에서 데이터 사이언티스트로 일합니다. 문과 출신이 미국 현지 데이터 사이언티스트가 되기까지 파이썬과 머신러닝을 배우며 많은 시행착오를 겪었습니다. 제가 겪었던 시행착오를 덜어드리고, 머신러닝에 대한 재미를 전달하고자 유튜버로 활동하고 책을 집필합니다.
현) IDT Corporation (미국 모바일 서비스 업체) 데이터 사이언티스트
전) 콜롬비아 대학교, Machine Learning Tutor, 대학원생 대상
전) 콜롬비아 대학교, Big Data Immersion Program Teaching Assistant
전) 콜롬비아 대학교, M.S. in Applied Analytics
전) 삼성전자 무선사업부, 스마트폰 데이터 분석가
전) 삼성전자 무선사업부, 모바일앱 스토어 데이터 관리 및 운영
강의 : 패스트캠퍼스 〈파이썬을 활용한 이커머스 데이터 분석 입문〉
SNS : www.youtube.com/c/데싸노트