차원과 차원 축소
머신러닝에서는 데이터가 가진 속성을 차원(Dimension)이라고 부릅니다.
예로 들어 사진의 픽셀이 10,000개면 현재 이 사진은 10,000개의 차원이라고 할 수 있습니다.
여기서 잠깐!
1차원 배열, 즉 벡터일 경우에는 원소의 개수가 차원이 됩니다.
2차원 배열일 때는 행과 열이 차원이 됩니다.
즉, 다차원 배열에서 차원은 배열은 축 개수가 됩니다.
만약 이 차원을 줄일 수 있다면, 저장 공간은 크게 절약할 수 있을 것입니다.
이를 위해 비지도 학습 작업 중 하나인 차원 축소(Dimensionality Reduction) 알고리즘을 다루어 보겠습니다.
차원 축소는 데이터를 가장 잘 나타내는 일부 특성을 선택하여 데이터 크기도 줄이고 지도 학습 모델의 성능도 향상시킵니다.
또한 손실을 최대한 줄이면서 복원할 수도 있습니다.
그 중 저희는 대표적인 차원 축소 알고리즘인 주성분 분석(Principal Component Analysis ; PCA)를 배워보겠습니다.
주성분 분석(PCA)
주성분 분석은 데이터에 있는 분산이 큰 방향을 찾는 것으로 이해할 수 있습니다.
분산은 데이터가 퍼져있는 정도를 의미하고 이 분산이 큰 방향이라는 것은 결국 데이터를 잘 표현하는 어떤 벡터라고 생각할 수 있습니다.
(단, 위치는 중요하지 않음)
이 벡터를 주성분(Principal Component)라고 부릅니다.
이 주성분 벡터는 원본 데이터에 있는 어떠한 방향을 의미합니다.
즉, 주성분 벡터의 원소 개수는 원본 데이터셋에 있는 특성 개수와 같습니다.
그리고 이 주성분을 사용해 원본 데이터의 차원을 줄일 수 있습니다.
만약 주성분으로 데이터를 바꿨다면 그 데이터는 차원이 줄어듭니다.
그리고 주성분이 가장 분산이 큰 방향이기 때문에 주성분에 투영하여 바꾼 데이터는 원본이 갖고 있는 특성을
가장 잘 나타내고 있을 것입니다.
일반적으로는 원본 특성의 개수만큼 주성분을 찾을 수 있습니다.
이제 실습을 해보겠습니다.
PCA 클래스
전과 같이 데이터는 과일 사진 데이터를 쓰도록 하겠습니다.
사이킷런은 sklearn.decomposition 모듈 아래 PCA 클래스로 주성분 분석 알고리즘을 제공합니다.
n_components 매개변수는 주성분의 개수를 지정해줍니다. 현재는 50개로 설정되어 있습니다.
그리고 PCA는 비지도 학습이기 때문에 fit() 메서드에 타깃값을 제공하지 않습니다.
PCA 클래스가 찾은 주성분은 components_ 속성에 저장되어 있습니다.
아까 n_components =50으로 지정했기 때문에 pca.components_ 배열의 첫 번째 차원은 50입니다.
즉, 50개의 주성분을 찾은 것입니다.
두 번째 차원은 항상 원본 데이터의 특성 개수와 같은 10,000입니다.
원본 데이터와 차원이 같기 때문에 주성분을 다시 이미지로 출력할 수 있습니다.
전 게시글에서 썼던 draw_fruits() 함수를 사용해서 출력해보겠습니다.
현재 원본 데이터에서 가장 분산이 큰 방향을 순서대로 나타낸 것입니다.
이렇게 주성분을 찾았으므로 원본 데이터를 주성분에 투영하여 원본 데이터의 차원을 50으로 줄여보겠습니다.
이렇게 데이터가 무려 1/200만큼 줄어들었습니다.
그럼 이제 반대로 원상 복구를 시켜보겠습니다.
원본 데이터 재구성
데이터의 10,000개의 특성을 50개로 줄였기 때문에 어느 정도 손실이 발생하는건 당연한 사실입니다.
하지만 최대한 분산이 큰 방향으로 데이터를 투영했기 때문에 원본 데이터를 다시 상당 부분 재구성할 수 있습니다.
PCA 클래스 중 inverse_transform() 메서드를 사용하면 복원시킬 수 있습니다.
그 후, 데이터를 100 x 100으로 바꾸어 100개씩 나누어 출력해보겠습니다.
거의 모든 과일이 복원이 잘 된 것을 확인할 수 있습니다.
만약 주성분을 최대로 사용했다면 완벽하게 원본 데이터를 재구성 할 수 있을 것입니다.
그렇다면 50개의 특성은 얼마나 분산을 보존하고 있는 것일까요?
설명된 분산(Explained Variance)
설명된 분산(Explained Variance)은 주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지 기록한 값을 의미합니다.
PCA 클래스 explained_variance_ratio_에 각 주성분의 설명된 분산 비율이 기록되어 있습니다.
결과를 보면 92%가 넘는 분산을 유지하고 있는 것을 볼 수 있습니다.
만약, N개의 특성에서 원본 데이터를 복원했을 때 원본 이미지의 품질에 관련하여 이유를 찾는다면 이 값을 보면 되겠죠?
한번 그래프로도 나타내 보겠습니다.
그래프를 보면 처음 10개의 주성분이 대부분의 분산을 표현하고 있고 그다음부터는 설명된 분산 값이 적어지는 것을 볼 수 있습니다.
이번에는 PCA로 차원 축소된 데이터를 사용하여 지도 학습을 실습하겠습니다.
다른 알고리즘과 함께 사용하기
알고리즘은 3개의 과일 사진을 분류할 수 있는 로지스틱 회귀 모델을 쓰겠습니다.
지도 학습을 진행하기 때문에 사과는 0, 파인애플은 1, 바나나는 2로 타깃값을 지정해주겠습니다.
원본 데이터와 PCA 축소 데이터의 차이를 보기 위해 먼저 원본 데이터로 진행해보겠습니다.
교차 검증의 점수는 0.997로 매우 높습니다.
이는 특성이 10,000개나 되기 때문에 300개의 샘플에서는 과대적합이 되기 쉽습니다.
시간은 1.07초 정도 걸렸습니다.
그럼 이제 PCA 축소 데이터입니다.
교차 검증의 점수가 1이 나왔네요. 즉, 정확도가 100%가 나왔습니다.
또한, 시간도 0.03초로 엄청 감소되었습니다.
앞서 위에서 얘기한 n_components 매개변수는 주성분의 개수를 지정해준다고 했었습니다.
여기에는 원하는 설명된 분산의 비율도 입력할 수 있습니다.
PCA 클래스는 이 비율에 도달할 때까지 자동으로 주성분을 찾아줍니다.
한번 실습해보겠습니다.
설명된 분산의 비율의 50%에 달하는 주성분은 2개였습니다.
이 말은 2개의 특성만으로 원본 데이터에 있는 분산의 50%를 표현할 수 있다라는 말과 동일합니다.
그럼 이번에는 2개의 주성분을 가진 PCA 축소 데이터로 교차 검증을 수행해보겠습니다.
교차 검증의 점수는 약 0.99로 99%의 정확도가 나왔습니다.
좋네요!
출처 : 혼자 공부하는 머신러닝 + 딥러닝
https://product.kyobobook.co.kr/detail/S000001810330
감사합니다.
뒷 내용은 추후 시간이 나면 업로드 하도록 하겠습니다.
'Study > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼자 공부하는 머신러닝 + 딥러닝] k-평균(K-Means) (0) | 2024.11.27 |
---|---|
[혼자 공부하는 머신러닝 + 딥러닝] 군집 알고리즘 (0) | 2024.11.13 |
[혼자 공부하는 머신러닝 + 딥러닝] 트리의 앙상블 (1) | 2024.11.11 |
[혼자 공부하는 머신러닝 + 딥러닝] 교차 검증과 그리드 서치 (0) | 2024.11.07 |
[혼자 공부하는 머신러닝 + 딥러닝] 결정 트리 (0) | 2024.10.31 |