🚨고객들이 보낸 과일 사진이 너무 많아지면서, 저장공간이 부족해졌다... 업로드된 사진의 용량을 좀 압축시킬 수는 없을까?
⭐다차원 배열과 1차원 배열에서 용어가 다르게 쓰임.
- 다차원 배열 : 차원 = 축의 개수 / 1차원 배열(벡터) : 차원 = 원소의 개수
- ❗지금 '차원 축소'에서 축소한다는 차원은 후자❗ (벡터로서의 차원)
주성분의 특징을 배웠으니, 이제 사이킷런에서 진짜 주성분 분석을 수행해보자!
.fit()
에 입력데이터만 전달해서 모델 훈련.PCA()
: 사이킷런에서 주성분 분석 알고리즘이 구현되어있는 클래스n_components
: 찾을 주성분의 개수를 지정하는 매개변수.components_
에 저장되어 있음.draw_fruits
함수 그대로 사용).transform()
: 전달받은 데이터를 주성분으로 분해(차원 축소)하는 메소드.inverse_transform()
: 주성분을 바탕으로 원본 데이터를 재구성해주는 메소드주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지 기록한 값을 설명된 분산(explained variance)이라고 함.
.explained_variance_ratio_
: 각 주성분의 설명된 분산 비율이 저장되어 있음.
→ 이 값을 sum
으로 다 더하면 주성분 50개가 설명하는 총 분산 비율을 얻을 수 있음.
↪ 92%나 되는 높은 비율이네 ㄷㄷ.. 어쩐지 복원 너무 잘 하더라..!
설명된 분산 비율을 그래프로 그려보면, 적절한 주성분 개수를 찾는 데도 도움됨!
↪ 당연히, 첫 번째 주성분이 가장 많이 설명함 ㅇㅇ
↪ 첫 10개 정도의 주성분이 대부분의 분산을 표현했네. (그 뒤쪽은 있으나마나한 주성분들 ...^^)
사실 용량을 줄여야한다는 상황은 스토리텔링 때문에 집어넣은 거구요..^^ PCA는 주로 다른 알고리즘과 연계하여 많이 사용합니다!
cross_validate
로 한번에!)fruits_pca
사용 → 특성 2개만 썼는데도 306p에서 원본으로 KMeans 했던 것과 거의 동일한 결과! (플러스알파 참조)fruits_pca
를 클러스터 별로 산점도 그려보면 → 3개의 과일이 서로 구분 잘 되어 있음!! (=이래서 2개만 써도 로지스틱 회귀모델 성능 높았구나~)n_components
매개변수에 '찾을 주성분의 개수'를 지정하지 않고.n_components_
에 저장된다!320p. ‘주성분’이라는 게 데이터의 분산을 가장 잘 표현하는 방향을 찾는다고 하시니, 선형회귀의 회귀선으로 찾아도 되는 게 아닌가 하는 생각이 들었습니다. 회귀선을 사용하지 않고 굳이 ‘벡터’로 찾는 특별한 이유가 있는지 궁금합니다.
👨🏻🏫 주성분의 정의에 해당됩니다. 회귀가 분산이 큰 방향을 찾는 것은 아닙니다. ⏯️ 아 그치 회귀는 물론 '최소제곱법' 베이스인 건 아는데... 주성분이 어떻게 벡터를 활용해 정의될 수 있는지 보려면 많이 복잡하게 들어가야 하려나ㅠ
324p.
inverse_transform
으로 복원할 때 원본데이터와 동일하게 10000개로 복원하셨는데, 실제로는 아예 똑같은 개수의 데이터로 복원하는 건 의미가 없지 않나요? 그냥 복원 과정 설명을 위한 예시라고 이해하면 되는거죠?👨🏻🏫 원본 차원으로 복원하는 것이 필요한 작업이 있을 수 있지 않을까요? 🆗
324p. 그렇다면
inverse_transform
을 사용할 때 원본과 다른 개수로 복원도 가능한지 궁금합니다. 이를테면 50개의 주성분을 바탕으로 5000개 정도만 샘플을 만들어보고 싶다거나 할 때 PCA를 사용할 수 있는 건가요?👨🏻🏫 원본 차원보다 적은 차원으로 복원하는 것도 가능합니다. 🆗
325p. ❗
for start in [0, 100, 200]
보고, 순간range
의 start, stop, step 인 줄 알았는데 아니었다..! 애초에 이렇게 리스트로 전달하면, 그 안에 있는 거 하나씩 start로 넣는 거였지.. 기억났다... 🆗
앞에서 배운 다른 알고리즘들과 달리, PCA는 어떤 문제해결에 직접적으로 쓰이기보다는 (마치 데이터 전처리처럼) 다른 모델을 사용하기 전에 차원을 축소해주는 변환기처럼 쓰이는 것이 주요 용도라고 이해해도 괜찮을까요?
👨🏻🏫 넵, 그렇게 생각하셔도 좋습니다. 🆗
😵💫 비슷해서 헷갈리는 녀석들 😵💫
n_components
: PCA 모델 만들 때 설정하는 매개변수로, '개수' or '비율' 중 원하는 걸 입력하면 됨
.n_components_
: '비율'로 입력했을 때, 몇 개의 주성분이 필요한지가 저장되어 있음.
.components_
: (뭘로 하든 걍 결과적으로) 뽑아낸 주성분이 저장되어 있는 속성. 🆗
벡터 개념을 제대로 몰라서 그런지 처음에 갈피를 잘 못 잡았다.. 주성분 분석 자체가 문제를 직접적으로 해결하는 (앞에서 배운) 알고리즘들과는 결이 다르다는 것을 인지하고 나니까 한결 이해가 편했다! (마지막 질문 참고) 선형대수학이 필요하겠다는 위기감이 스멀스멀... 벡터랑 행렬이라도 좀 봐놔야할 것 같다ㅠ
사진의 용량을 줄이기 위해 PCA 알고리즘 도입 → 특성 10,000개를 잘 설명하는 주성분 50개를 찾아냄 → 찾아낸 주성분 50개에 투영시켜, 원본데이터의 차원을 축소시킬 수 있음
(=특성 개수를 줄이니 용량이 절감됨) → 반대로 축소된 데이터를 원본 데이터로 복원할 수도 있었음 → 뽑아낸 주성분들이 원본 데이터를 얼마나 설명하는지도 구해볼 수 있음 → 다른 알고리즘과 연계하여 많이 활용되고, 시각화가 용이하다는 장점까지!
👏🏻[머신러닝 파트 끝]👏🏻