이 데이터셋에는 그사람이 가장 좋아하는 음식, 싫어하는 동물 등등 너무나도 다양한 feature가 있다.
하지만 우리는 이 데이터 셋으로 자원봉사에 지원할 가능성을 예측하는 모델을 만든다고 생각하자.
과연 해당모델에서 위의 예시로 들었언 두가지의 feature가 유의미한 데이터로써 모델의 성능에 도움을 줄 수 있을까? 당연히 대답은 '아니다'이다.
이런경우 우리는
무의미한 feature를 제거해야 한다 == 차원을 줄여주어야 한다 == 주성분을 추출하여야 한다.
이러한 경우 가장많이 사용되는 차원축소 알고리즘이 바로 PCA 알고리즘이다. PCA알고리즘에 대하여 알아보도록 하자.
PCA란?
PCA (Principle Component Analysis), 주성분 분석
PCA는 말 그대로 '주' 성분을 분석하는 것입니다.
분산을 보존해야한다.
저차원의 초평면에 투영을 하게 되면 차원이 줄어들게 됩니다. 그럼 어떤 초평면을 선택하면 좋을까요?
위와 같은 예시를 살펴봅시다. 간단한 2D 데이터셋이 있을 때, 세개의 축을 우리의 초평면 후보로 둡시다. 여기에서 볼 수 있는 것은 실선을 선택하는 방법이 분산을 최대로 보존하는 것이고, c2의 점선을 선택하는 것이 분산을 적게 만들어버리는 방법입니다.
다른 방향으로 투영하는 것 보다 분산을 최대로 보존할 수 있는 축을 선택하는 것이 정보를 가장 적게 손실할 수 있다고 생각할 수 있습니다. 분산이 커야 데이터들사이의 차이점이 명확해질테고, 그것이 우리의 모델을 더욱 좋은 방향으로 만들 수 있을 것이기 때문입니다.
분산이 최대인 축에서 데이터와 초평면간의 거리가 가장 줄어들게 됩니다.그래서 PCA에서는 분산이 최대인 축을 찾고, 이 첫번째 축에 직교하고 남은 분산을 최대한 보존하는 두번째 축을 찾습니다. 2D 예제에서는 선택의 여지가 없지만, 고차원의 데이터셋이라면 여러 방향의 직교하는 축을 찾을 수 있을 것입니다.
이렇게 i번째 축을 정의하는 단위 벡터를 i번째 주성분(principal component, PC)라고 합니다. 위 예제에서는 첫번째 PC는 c1이고, 두번째 PC는 c2입니다.
주성분을 찾는 법
특잇값 분해(Singular Value Decomposition, SVD)
특잇값 분해(Singular Value Decomposition, SVD)이라는 표준 행렬 분해 기술을 이용해 훈련 세트 행렬 X를 3개의 행렬의 점곱인U⋅∑⋅VT로 분해할 수 있습니다. 여기서 우리가 찾고자하는 모든 주성분은 V에 담겨있습니다.
아래 파이썬 코드는 넘파잉의 svd() 함수를 사용하여 훈련 세트의 모든 주성분을 구한 후 처음 두개의 PC를 추출하는 코드입니다.
d차원으로 투영하기
주성분을 모두 추출했다면 처음 d개의 주성분으로 정의한 초평면에 투영하여 데이터셋의 차원을 d차원으로 축소할 수 있습니다. 이 초평면은 분산을 가능한 최대로 보존한 투영입니다.
초평면에 훈련 세트를 투영하기 위해서는 행렬 X와 첫 d개의 주성분을 담은(즉, V의 첫 d열로 구성된) 행렬Wd를 점곱하면 됩니다.
아래 파이썬 코드는 첫 두개의 주성분으로 정의된 평면에 훈련 세트를 투영합니다.
여기까지 하면 PCA 변환이 완료되었습니다!
더 쉽게 PCA를 하는 방법 - 사이킷런 이용하기
사이킷런의 PCA 모델은 앞서 한 것처럼 SVD 분해 방법을 사용하여 구현합니다. 사이킷런의 PCA모댈은 자동으로 데이터를 중앙에 맞춰줘서 별도의 가공 없이 바로 사용할 수 있습니다.
PCA 실습
오늘은 지난시간에 이어 LDA실습을 colab환경에서 진행해 보려 한다.
Importing the libraries
Importing the dataset
Splitting the dataset into the Training set and Test set
Feature Scaling
Applying LDA
Training the Logistic Regression model on the Training set
Making the Confusion Matrix
Visualising the Training set results
LDA
LDA
PCA,LDA
공통점
차원축소 기술로 사용됨. == 유의미한 feature추출에 능이.
패턴분류와 머신러닝 알고리즘의 전처리 과정에 사용됨.
더 낮은 차원적 공간에 데이터세트를 투영하는것을 목표로함.
차이점
위의그림처럼
PCA는 주성분 축들의 연관성을 검토, LDA는 클래스 분리
PCA:비지도 알고리즘, LDA:지도 알고리즘 => 종속변수와의 연관성차이.
LDA
LDA는 아래 그림처럼 데이터를 특정 한 축에 사영(projection)한 후에 두 범주를 잘 구분할 수 있는 직선을 찾는 걸 목표로 합니다. 모델 이름에 linear라는 이름이 붙은 이유이기도 합니다.
왼쪽과 오른쪽 축 가운데 분류가 더 잘 됐다고 판단할 수 있는 축은 무엇일까요? 딱 봐도 오른쪽이 좀 더 나아보입니다. 빨간색 점과 파란색 점을 분류하는 걸 목표로 했는데 왼쪽 그림에 나타난 축은 중간에 빨간색과 파란색 점이 뒤섞여 있기 때문이지요. 반대로 오른쪽 그림은 색깔이 서로 다른 점들이 섞이지 않고 비교적 뚜렷하게 구분되고 있는 점을 확인할 수 있습니다. 녹색 축을 따라서 같은 위치에 있는 점들의 빈도를 세어서 히스토그램처럼 그리면 바로 위와 같은 그림이 됩니다.
그렇다면 두 범주를 잘 구분할 수 있는 직선은 어떤 성질을 지녀야 할까요? 사영 후 두 범주의 중심(평균)이 서로 멀도록, 그 분산이 작도록 해야할 겁니다. 왼쪽 그림을 오른쪽과 비교해서 보면 왼쪽 그림은 사영 후 두 범주 중심이 가깝고, 분산은 커서 데이터가 서로 잘 분류가 안되고 있는 걸 볼 수가 있습니다. 반대로 오른쪽 그림은 사영 후 두 범주 중심이 멀고, 분산은 작아서 분류가 비교적 잘 되고 있죠. LDA는 바로 이런 직선을 찾도록 해주는 알고리즘 입니다!
LDA 실습
오늘은 지난시간에 이어 LDA실습을 colab환경에서 진행해 보려 한다.
Importing the libraries
Importing the dataset
Splitting the dataset into the Training set and Test set
Feature Scaling
Applying LDA
Training the Logistic Regression model on the Training set
Making the Confusion Matrix
Visualising the Training set results
본 스터디는 Udemy의 <【한글자막】 머신러닝의 모든 것 with Python, R> 강의를 활용해 진행됐습니다. 강의에 대한 자세한 정보는 아래에서 확인하실 수 있습니다.
ai관련 stack이 어렵다고만 느끼시는 분들에게 같은 초심자로써 어떤 마음으로 입문하면 수월히 배워볼 수 있는지, 또한 머신러닝 엔지니어가 된다면 세상에 단 하나뿐인 프로그램을 설계해보는 흥미로운 일을 매일같이 반복할 수 있다는 것을 같이 알아가고 싶습니다! 저는 이 스터디를 다듣고난후 ai의 기본에대한 깊은 이해를 얻고 싶습니다! 어떤 일이든 기본이 제일 중요하다고 생각듭니다 :)