데이터공학
Data Science
Aaron Snowberger
교통대학교 • 데이터공학 • 8주차
07 앙상블 학습과 랜덤 포레스트 (p. 268-296)
08 차원 축소 (p. 297-323)
앙상블 학습과 랜덤 포레스트
07
p. 268-323
07 앙상블 학습과 랜덤 포레스트
랜덤으로 선택된 수천 명의 사람에게 복잡한 질문을 하고 모은 답변이 전문가의 답보다 나은 경우가 많습니다. 이를 대중의 지혜(wisdom of the crowd)라고 하며, 이와 유사하게 여러 예측기로부터 예측을 모으면 더 나은 결과를 얻을 수 있습니다. 이를 앙상블 학습(ensemble learning)이라고 하며, 앙상블 방법(ensemble method)이라고도 합니다.
07 앙상블 학습과 랜덤 포레스트
앙상블 방법의 한 예로, 랜덤 포레스트가 있습니다. 이는 훈련 세트에서 랜덤으로 선택된 서브셋을 사용해 여러 결정 트리 분류기를 학습시켜 최종 예측을 만듭니다. 랜덤 포레스트는 강력한 머신러닝 알고리즘으로, 경연 대회에서 우승하는 솔루션에서도 자주 사용됩니다.
07 앙상블 학습과 랜덤 포레스트
7.1 투표 기반 분류기
정확도가 80%인 여러 분류기를 훈련시켜 예측을 집계하는 간단한 방법이 있습니다. 다수결 투표로 예측을 결정하는 분류기를 직접 투표(classical voting) 분류기라고 합니다. 각 분류기가 약한 학습기일지라도 다양하면 앙상블이 강한 학습기로 발전할 수 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.1 투표 기반 분류기
TIP: 앙상블 방법은 예측기가 서로 독립적일 때 최고의 성능을 발휘합니다. 다양한 알고리즘으로 학습시키면 앙상블의 정확도가 향상됩니다.
07 앙상블 학습과 랜덤 포레스트
7.1 투표 기반 분류기
사이킷린의 VotingClassifier 클래스를 사용하면 손쉽게 투표 기반 분류기를 만들 수 있습니다. predict() 메서드를 통해 직접 투표를 수행하며, predict_proba() 메서드를 사용할 경우 간접 투표(soft voting)를 통해 성능이 더 향상됩니다. 이를 통해 92% 정확도를 달성할 수 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
여러 분류기를 만드는 방법 중 하나는 서로 다른 훈련 알고리즘을 사용하는 것이고, 다른 방법은 동일한 알고리즘을 사용하되 훈련 세트의 서브셋을 랜덤으로 구성하는 것입니다.
이때 훈련 세트에서 중복을 허용하여 샘플링하는 방식을 배깅(Bagging)이라고 하며, 중복을 허용하지 않는 샘플링 방식은 페이스팅(Pasting)이라고 합니다.
같은 샘플을 여러 번 샘플링할 수 있는 것은 배깅뿐입니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
모든 예측기가 훈련을 마친 후, 앙상블은 모든 예측기의 예측을 모아 새로운 샘플에 대한 예측을 생성합니다. 집계 함수는 분류일 때 통계적 최빈값을, 회귀일 때는 평균을 계산합니다. 앙상블의 결과는 원본 데이터셋으로 훈련한 예측기보다 편향은 유사하나 분산이 줄어듭니다. 배깅과 페이스팅은 병렬로 학습 및 예측할 수 있어 확장성이 뛰어납니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
7.2.1 사이킷런의 배깅과 페이스팅
사이킷런은 배깅과 페이스팅을 위해 BaggingClassifier (회귀의 경우 BaggingRegressor)를 제공합니다. 다음 코드는 결정 트리 분류기 500개의 앙상블을 훈련시키는 예시입니다. 각 분류기는 훈련 세트에서 중복을 허용하여 랜덤으로 선택된 100개의 샘플로 훈련됩니다. n_jobs 매개변수로 사용할 CPU 코어 수를 지정할 수 있습니다.
BaggingClassifier는 기본 분류기가 클래스 확률을 추정할 수 있다면 자동으로 간접 투표 방식을 사용합니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
7.2.1 사이킷런의 배깅과 페이스팅
배깅 앙상블의 예측이 단일 결정 트리의 예측보다 일반화가 더 잘되는 것을 확인할 수 있습니다. 배깅은 각 예측기가 학습하는 서브셋에 다양성을 추가하여 편향이 조금 더 높지만, 예측기 간의 상관관계를 줄여 앙상블의 분산을 감소시킵니다. 일반적으로 배깅이 더 나은 모델을 만들기 때문에 더 선호됩니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
7.2.2 OOB 평가
배깅에서는 샘플이 한 예측기를 위해 여러 번 샘플링될 수 있고, 어떤 샘플은 전혀 선택되지 않을 수 있습니다. BaggingClassifier는 기본값으로 중복을 허용하여 훈련 세트의 크기만큼 샘플을 선택하며, 평균적으로 각 예측기에 훈련 샘플의 63%만 샘플링됩니다. 선택되지 않은 37%를 OOB(out-of-bag) 샘플이라고 하며, 이 샘플을 사용해 별도의 검증 세트 없이 평가할 수 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.2 배깅과 페이스팅
7.2.2 OOB 평가
사이킷런에서 BaggingClassifier를 만들 때 oob_score=True로 지정하면 OOB 평가가 자동으로 수행됩니다. 이 평가 결과는 oob_score_ 변수에 저장되며, OOB 평가 결과는 테스트 세트의 정확도와 비교하여 약간 비관적일 수 있습니다. OOB 샘플에 대한 결정 함수의 값은 oob_decision_function_ 변수에서 확인할 수 있으며, 기반 예측기가 predict_proba() 메서드를 가지고 있다면 각 훈련 샘플의 클래스 확률을 반환합니다.
07 앙상블 학습과 랜덤 포레스트
7.3 랜덤 패치와 랜덤 서브스페이스
Bagging Classifier는 특성 샘플링도 지원합니다. 이 샘플링은 max_features, bootstrap_features 두 매개변수로 조절되며, 각 예측기는 랜덤으로 선택한 입력 특성의 일부로 훈련됩니다.
이 기법은 훈련 속도를 크게 높일 수 있어 고차원 데이터셋에서 유용합니다.
훈련 특성과 샘플을 모두 샘플링하는 방식은 랜덤 패치 방법이라고 하며, 특성만 샘플링하는 것은 랜덤 서브스페이스 방법이라고 합니다. 특성 샘플링은 더 다양한 예측기를 만들고, 편향을 늘리는 대신 분산을 낮춥니다.
07 앙상블 학습과 랜덤 포레스트
7.4 랜덤 포레스트
랜덤 포레스트는 일반적으로 배깅 방법을 적용한 결정 트리의 앙상블입니다. max_samples를 훈련 세트의 크기로 지정하고, BaggingClassifier에 DecisionTreeClassifier를 넣어 만드는 대신 RandomForestClassifier를 사용할 수 있습니다.
랜덤 포레스트 알고리즘은 전체 특성 중에서 최적의 특성을 찾는 대신 랜덤으로 선택한 특성 후보 중에서 최적의 특성을 찾습니다. 이는 트리를 더욱 다양하게 만들어 전체적으로 더 훌륭한 모델을 만들어냅니다.
07 앙상블 학습과 랜덤 포레스트
7.4 랜덤 포레스트
7.4.1 엑스트라 트리
랜덤 포레스트에서 각 노드는 랜덤으로 특성의 서브셋을 만들어 분할에 사용합니다. 극단적으로 랜덤한 트리인 엑스트라 트리는 후보 특성을 사용해 랜덤으로 분할한 다음 최상의 분할을 선택합니다.
이 방법은 훈련 속도를 빠르게 하여 일반적인 랜덤 포레스트보다 더 효율적입니다.
07 앙상블 학습과 랜덤 포레스트
7.4 랜덤 포레스트
7.4.2 특성 중요도
랜덤 포레스트는 특성의 상대적 중요도를 측정하기 쉽습니다. 사이킷런은 각 특성이 노드에서 불순도를 얼마나 감소시키는지를 확인하여 특성의 중요도를 측정합니다.
훈련이 끝난 후, 각 특성의 중요도를 자동으로 계산하여 feature_importances_ 변수에 저장합니다. 랜덤 포레스트는 특성을 선택할 때 어떤 특성이 중요한지 빠르게 확인할 수 있어 매우 편리합니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
부스팅은 약한 학습기를 여러 개 연결해 강한 학습기를 만드는 앙상블 방법입니다. 주된 아이디어는 이전 모델의 약점을 보완해 나가며 일련의 예측기를 학습시키는 것입니다. 대표적인 부스팅 기법은 AdaBoost와 그레이디언트 부스팅입니다.
CAUTION
부스팅은 이전 예측기의 결과가 나온 후에 다음 예측기를 학습시키기 때문에 훈련을 병렬화할 수 없습니다. 이로 인해 배깅이나 페이스팅만큼 확장성이 높지 않습니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.1 AdaBoost
AdaBoost는 이전 예측기가 과소적합한 샘플의 가중치를 높여 새로운 예측기를 학습시킵니다. 예를 들어 첫 번째 예측기에서 잘못 예측된 샘플들의 가중치를 높여 두 번째 예측기가 해당 샘플에 집중하도록 합니다. 이런 방식으로 예측기가 점점 더 향상되며, 최종 앙상블은 배깅처럼 여러 예측기의 결과를 결합하지만, 각 예측기의 정확도에 따라 가중치가 다르게 적용됩니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.1 AdaBoost
AdaBoost의 훈련 과정에서는 각 샘플에 초기 가중치를 부여하고, 예측기의 오류율에 따라 샘플의 가중치를 업데이트합니다. 잘못 분류된 샘플의 가중치는 높아지고, 모든 샘플의 가중치를 정규화한 후 새로운 예측기를 훈련시킵니다. 이 과정을 반복하며, 지정된 예측기 수에 도달하거나 완벽한 예측기가 나오면 중지됩니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.1 AdaBoost
예측을 할 때 AdaBoost는 모든 예측기의 예측을 계산하고 가중치를 더해 최종 예측 결과를 만듭니다. 사이킷런은 SAMME라는 AdaBoost의 다중 클래스 버전을 사용하며, 클래스가 두 개일 경우 SAMME는 AdaBoost와 동일합니다. 예측기가 클래스 확률을 추정할 수 있는 경우, SAMME.R 알고리즘을 사용하여 일반적으로 성능을 더 높입니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.1 AdaBoost
다음 코드는 사이킷런의 AdaBoost Classifier를 사용하여 200개의 얕은 결정 트리를 기반으로 AdaBoost 분류기를 훈련시키는 예시입니다. 여기서 사용되는 결정 트리는 최대 깊이가 1로, 결정 노드 하나와 리프 노드 두 개로 이루어져 있습니다.
AdaBoost 앙상블이 과대적합될 경우 추정기 수를 줄이거나 추정기의 규제를 강화할 수 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.2 그레이디언트 부스팅
그레이디언트 부스팅은 AdaBoost처럼 이전 오차를 보정하는 예측기를 순차적으로 추가하는 앙상블 방법입니다. 하지만 AdaBoost와 달리, 각 반복에서 샘플의 가중치를 수정하는 대신 이전 예측기가 만든 잔여 오차에 새 예측기를 학습시킵니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.2 그레이디언트 부스팅
예를 들어, 결정 트리를 사용한 회귀 문제에서 첫 번째 트리의 예측 오차에 두 번째 트리가 학습되고, 이어 세 번째 트리가 두 번째 트리의 오차를 학습합니다. 그 결과, 트리들이 추가될수록 앙상블의 예측 성능이 점차 개선됩니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.2 그레이디언트 부스팅
사이킷런의 GradientBoostingRegressor는 GBRT 앙상블을 쉽게 훈련시킬 수 있습니다. 앙상블의 성능은 learning_rate와 n_estimators 같은 하이퍼파라미터로 제어되며, 이를 통해 과적합과 과소적합을 방지할 수 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.2 그레이디언트 부스팅
특히 n_iter_no_change 매개변수를 통해 자동으로 조기 종료를 설정할 수 있습니다. 이 방법은 검증 세트를 사용하여 성능을 평가하고, 성능이 향상되지 않으면 훈련을 멈춥니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.2 그레이디언트 부스팅
subsample 매개변수를 활용해 확률적 그레이디언트 부스팅을 수행할 수도 있습니다. 이는 각 트리가 훈련 샘플의 일부만 사용해 학습하는 방식으로, 훈련 속도를 높이는 동시에 분산을 낮추는 효과가 있습니다.
이런 기법을 확률적 그레이디언트 부스팅 stochastic gradient boosting이 라고 합니 다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.3 히스토그램 기반 그레이디언트 부스팅
사이킷런은 대규모 데이터셋에 최적화된 히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting, HGB)도 제공합니다. 이 방법은 입력 특성을 구간으로 나누어 정수로 대체함으로써 학습 속도를 크게 향상시킵니다. max_bins 매개변수를 통해 구간의 개수를 제어하며, 이는 정밀도 손실을 줄이면서도 빠른 계산을 가능하게 합니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.3 히스토그램 기반 그레이디언트 부스팅
시이킷런은 HGB를 위한 두 가지 클래스
이 두 클래스는 GradientBoostingRegressor 그리고 GradientBoostingClassifier와 유사하지만 몇 가지 주목할 만한 차이점이 있습니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.3 히스토그램 기반 그레이디언트 부스팅
HGB는 조기 종료가 자동으로 활성화되며, 범주형 특성과 누락된 값도 지원해 전처리가 간소화됩니다.
범주형 특성은 0에서 max_bins 사이의 정수로 표현되며, 이를 위해 OrdinalEncoder를 사용할 수 있습니다. 또한, 하이퍼파라미터 튜닝 없이도 상당히 우수한 성능을 보여줍니다.
07 앙상블 학습과 랜덤 포레스트
7.5 부스팅
7.5.3 히스토그램 기반 그레이디언트 부스팅
추가로, XGBoost, CatBoost, LightGBM과 같은 라이브러리는 그레이디언트 부스팅에 특화된 최적화된 구현을 제공하며, 사이킷런과 유사한 API를 사용합니다. 이 라이브러리들은 GPU 가속 등 다양한 추가 기능도 지원합니다.
07 앙상블 학습과 랜덤 포레스트
7.6 스태킹
스태킹(Stacking)은 앙상블에 속한 모든 예측기의 예측을 단순히 취합하는 대신, 취합하는 모델을 훈련시키는 방식입니다.
새로운 샘플에 대해 여러 예측기가 각기 다른 값을 예측하고, 최종적으로 '블렌더' 또는 '메타 학습기'가 이 예측들을 입력으로 받아 최종 예측을 만듭니다.
07 앙상블 학습과 랜덤 포레스트
7.6 스태킹
블렌더를 훈련하려면 먼저 '블렌딩 훈련 세트'를 만듭니다. 각 예측기의 표본 외(out-of-fold) 예측을 입력 특성으로 사용하고, 타깃은 원본 훈련 세트에서 복사합니다. 블렌더가 훈련된 후에는 모든 기본 예측기가 다시 원본 훈련 세트로 재훈련됩니다.
07 앙상블 학습과 랜덤 포레스트
7.6 스태킹
이 방식으로 여러 블렌더를 조합해 최종 예측을 생성할 수도 있으며, 이를 통해 성능을 향상시킬 수 있지만 시스템 복잡성과 훈련 시간 비용이 증가합니다.
07 앙상블 학습과 랜덤 포레스트
7.6 스태킹
사이킷런은 스태킹을 위한 StackingClassifier와 StackingRegressor 클래스를 제공합니다. 각각의 예측기에 대해 predict_proba(), decision_function(), 또는 predict()를 호출합니다. 최종 예측기가 제공되지 않으면 StackingClassifier는 LogisticRegression을, StackingRegressor는 RidgeCV를 사용합니다.
테스트 결과, 스태킹 모델은 92.8%의 정확도를 기록했으며, 이는 92%의 정확도를 보인 간접 투표 방식보다 약간 더 나은 성능입니다.
07 앙상블 학습과 랜덤 포레스트
7.6 스태킹
결론적으로, 앙상블 방법은 다재다능하고 강력하며, 특히 표 형식 데이터에서 뛰어난 성능을 보입니다. 또한, 전처리가 거의 필요하지 않아 프로토타입 구축에 적합하며, 투표 기반 분류기와 스태킹 분류기 같은 앙상블 방법은 시스템 성능을 극대화하는 데 유용합니다.
연습문제
차원 축소
08
p. 297-323
08 차원 축소
차원의 저주
많은 머신러닝 문제에서 훈련 샘플이 수천에서 수백만 개의 특성을 가질 수 있습니다. 이처럼 많은 특성은 훈련을 느리게 하고 좋은 솔루션을 찾기 어렵게 만듭니다. 이러한 문제는 종종 "차원의 저주"라고 불립니다.
08 차원 축소
차원 축소
실전 문제에서는 특성 수를 크게 줄여 문제를 해결 가능하게 만들 수 있습니다. 예를 들어, MNIST 이미지에서는 이미지 경계의 픽셀을 제거해도 중요한 정보를 많이 잃지 않습니다. 또한 두 픽셀이 서로 연관되어 있으면 이를 하나로 합쳐도 큰 정보 손실이 발생하지 않을 수 있습니다.
08 차원 축소
차원 축소
실전 문제에서는 특성 수를 크게 줄여 문제를 해결 가능하게 만들 수 있습니다. 예를 들어, MNIST 이미지에서는 이미지 경계의 픽셀을 제거해도 중요한 정보를 많이 잃지 않습니다. 또한 두 픽셀이 서로 연관되어 있으면 이를 하나로 합쳐도 큰 정보 손실이 발생하지 않을 수 있습니다.
08 차원 축소
데이터 시각화
차원 축소는 데이터 시각화에 매우 유용합니다. 고차원 데이터를 2차원 또는 3차원 그래프로 압축해 군집 패턴을 시각적으로 감지할 수 있습니다. 데이터 시각화는 특히 비전문가에게 결과를 설명할 때 필수적입니다.
08 차원 축소
8.1 차원의 저주
우리는 3차원 세계에 살고 있어 고차원 공간을 직관적으로 상상하기 어렵습니다. 고차원 공간에서는 많은 것이 다르게 작동합니다. 예를 들어, 고차원 공간에서 임의의 두 점 사이의 거리는 매우 멀리 떨어져 있을 확률이 높으며, 이는 예측이 불안정해지고 과대적합 위험이 커집니다.
08 차원 축소
8.1 차원의 저주
차원의 저주를 해결하는 한 가지 방법은 훈련 샘플의 밀도를 높이는 것이지만, 실제로는 차원이 커질수록 필요한 샘플 수가 기하급수적으로 증가합니다.
08 차원 축소
8.2 차원 축소를 위한 접근법
차원을 줄이는 두 가지 주요 접근법으로는 투영과 매니폴드 학습이 있습니다.
8.2.1 투영
대부분의 실전 문제에서 훈련 샘플은 고차원 공간의 저차원 부분 공간에 집중되어 있습니다.
08 차원 축소
8.2 차원 축소를 위한 접근법
8.2.1 투영
예를 들어, 3차원 공간에서 모든 샘플이 거의 평면에 위치해 있다면, 이를 평면에 수직으로 투영해 차원을 2D로 줄일 수 있습니다. 그러나 부분 공간이 뒤틀리거나 휘어진 경우, 단순한 투영만으로는 적절한 차원 축소가 어렵습니다.
08 차원 축소
8.2 차원 축소를 위한 접근법
8.2.1 투영
스위스 롤 데이터셋처럼 복잡한 구조를 가진 경우에는 투영보다는 다른 방법이 필요합니다.
08 차원 축소
8.2 차원 축소를 위한 접근법
8.2.2 매니폴드 학습
매니폴드는 고차원 공간에서 휘어지거나 뒤틀린 저차원 구조를 뜻합니다. 예를 들어, 스위스 롤은 2D 매니폴드의 예로, 3차원 공간에서 말려 있지만 국부적으로는 2D 평면으로 보입니다. 매니폴드 학습은 고차원 데이터가 저차원 매니폴드에 가까이 놓여 있다는 가정을 바탕으로 데이터를 축소하는 방법입니다.
08 차원 축소
8.2 차원 축소를 위한 접근법
모델을 훈련하기 전 훈련 세트의 차원을 줄이면 훈련 속도가 빨라질 수 있지만, 항상 더 나은 결과를 보장하지는 않습니다. 이는 데이터셋에 따라 다릅니다. 차원의 저주를 피하기 위해 매니폴드 가정 하에 차원 축소 알고리즘이 어떻게 작동하는지 살펴보고, 주성분 분석(PCA - principal component analysis)을 통해 차원을 줄이는 방법을 설명합니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.1 분산 보존
PCA는 데이터를 초평면에 투영하여 분산을 최대한 보존하는 축을 선택합니다. 이 과정에서 정보 손실을 최소화하며 데이터를 새로운 저차원 공간에 투영합니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.2 주성분
PCA는 데이터의 분산이 최대인 축을 찾아 그 축을 주성분(PC)이라 부릅니다. 첫 번째 주성분에 직교하는 두 번째 주성분을 찾고, 고차원 데이터에서는 이 과정을 반복하여 모든 주성분을 찾습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.3 d 차원으로 투영하기
데이터의 분산을 최대한 보존하는 주성분을 사용해 데이터를 d차원으로 투영하여 차원을 축소합니다. 이를 통해 분산을 유지하면서 데이터의 복잡성을 줄입니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.4 사이킷런 사용하기
사이킷런의 PCA 모델을 사용해 차원을 줄이는 방법을 소개합니다. 사이킷런은 데이터를 중앙에 맞추고 SVD 방식을 통해 PCA를 수행합니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.5 설명된 분산의 비율
각 주성분이 데이터 분산에서 차지하는 비율을 계산하여 중요한 주성분을 선택할 수 있습니다. 이를 통해 적절한 차원 수를 결정할 수 있습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.6 적절한 차원 수 선택
차원 수는 데이터의 95% 이상의 분산을 보존할 수 있을 때까지 선택하는 것이 좋습니다. 이를 통해 데이터의 복잡성을 줄이면서 중요한 정보를 유지할 수 있습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.6 적절한 차원 수 선택
다음 코드는 3장에서 소개한 MNIST 데이터셋을 로드하고, 차원을 줄이지 않고 PCA를 수행한 후, 훈련 집합의 분산 95%를 보존하는 데 필요한 최소 차원 수를 계산합니다. 이후 n_components=d로 설정하여 PCA를 다시 실행하는 대신, 보존하려는 분산의 비율을 0.0에서 1.0 사이로 설정하는 것이 더 효율적입니다. 실제 주성분 개수는 훈련 중에 결정되며, n_components_ 속성에 저장됩니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.6 적절한 차원 수 선택
설명된 분산을 차원 수에 대한 함수로 그래프(예: 누적 합 그래프)로 그릴 수도 있습니다. 일반적으로 설명된 분산의 빠른 성장이 멈추는 변곡점이 나타나며, 차원을 약 100으로 축소해도 설명된 분산에 큰 손실이 없습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.6 적절한 차원 수 선택
차원 축소를 분류 작업의 전처리 단계로 사용하는 경우, 차원 수도 하이퍼파라미터처럼 튜닝할 수 있습니다.
예를 들어, 다음 코드는 PCA를 통해 차원을 줄이고, 랜덤 포레스트로 분류를 수행하는 두 단계 파이프라인을 생성한 후, RandomizedSearchCV를 사용하여 PCA와 랜덤 포레스트 분류기의 최적 하이퍼파라미터를 찾는 예제입니다. 간단한 검색을 수행하나, 시간이 있으면 더 철저한 검색도 가능합니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.6 적절한 차원 수 선택
최적의 하이퍼파라미터를 보면 흥미롭게도 784개의 원래 차원을 23개로 줄이는 것이 최적이었습니다. 이는 랜덤 포레스트의 강력한 성능 덕분이며, SGDClassifier 같은 선형 모델을 사용했다면 더 많은 차원을 보존해야 했을 것입니다(약 70개).
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.7 압축을 위한 PCA
PCA를 사용해 데이터를 압축하고, 필요시 다시 원래 차원으로 복원할 수 있습니다. 일부 정보는 손실되지만, 압축된 데이터는 분류 알고리즘의 속도를 높일 수 있습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.8 랜덤 PCA
랜덤 PCA는 확률적 알고리즘을 사용하여 큰 데이터셋에서 빠르게 근사값을 찾습니다. 사이킷런은 데이터 크기에 따라 자동으로 랜덤 PCA를 선택할 수 있습니다.
08 차원 축소
8.3 주성분 분석 (PCA)
8.3.9 점진적 PCA
점진적 PCA는 훈련 세트를 미니배치로 나누어 처리하는 방식으로, 메모리 효율성을 높이고 실시간으로 PCA를 적용할 수 있습니다.
08 차원 축소
8.4 랜덤 투영
랜덤 투영은 데이터를 저차원 공간으로 투영하는 방법으로, 랜덤한 선형 투영을 사용합니다. 이는 존슨-린덴스트라우스 정리로 수학적으로 증명되어, 거리 보존 성능이 높습니다.
08 차원 축소
8.4 랜덤 투영
최적의 차원 수는 존슨과 린덴스트라우스가 제시한 방정식을 통해 결정할 수 있으며, 사이킷런의 GaussianRandomProjection 클래스를 사용하여 쉽게 구현할 수 있습니다.
또한, 메모리 효율성을 높인 SparseRandomProjection도 제공되어 대규모 데이터셋에 적합합니다.
08 차원 축소
8.5 지역 선형 임베딩
지역 선형 임베딩(LLE - Locally Linear Embedding)은 비선형 차원 축소 기법으로, 각 훈련 샘플이 최근접 이웃과 선형적으로 연관된 정도를 측정한 후, 저차원 공간에서 이를 보존하는 표현을 찾습니다.
08 차원 축소
8.5 지역 선형 임베딩
LLE는 매니폴드 학습 방식으로 작동하며, 꼬인 매니폴드를 펼치는 데 특히 유용합니다. 그러나 대규모 데이터셋에는 적용하기 어려울 수 있습니다.
08 차원 축소
8.6 다른 차원 축소 기법
다차원 스케일링 (MDS)
다차원 스케일링은 샘플 간의 거리를 보존하면서 차원을 축소하는 기법입니다.
08 차원 축소
8.6 다른 차원 축소 기법
Isomap
Isomap은 샘플을 이웃과 연결하는 그래프를 만들고, 지오데식 거리를 유지하면서 차원을 축소합니다. 지오데식 거리는 두 노드 간 최단 경로입니다.
08 차원 축소
8.6 다른 차원 축소 기법
t-SNE
t-SNE는 비슷한 샘플은 가까이, 다른 샘플은 멀리 떨어지게 하여 차원을 축소하는 기법으로, 고차원 데이터 시각화에 주로 사용됩니다. 예를 들어 MNIST 데이터의 2D 맵을 그릴 때 유용합니다.
08 차원 축소
8.6 다른 차원 축소 기법
선형 판별 분석 (LDA)
LDA는 클래스 사이를 가장 잘 구분하는 축을 학습하는 선형 분류 알고리즘입니다. 이 축을 통해 데이터를 투영하여 차원을 축소하고, 다른 분류 알고리즘에 적용하기에 적합한 데이터로 변환합니다.
08 차원 축소
8.6 다른 차원 축소 기법
결과 비교
연습문제
THANKS!
Please keep this slide for attribution