살콤아내 자기계발/파이썬

파이썬 머신러닝완벽가이드 7주차_차원축소 (382 pg, PCA, LDA, SVD)

살콤아내 2021. 6. 9. 11:51
728x90
반응형

credit_card.xls
5.28MB
파이썬머신러닝완벽가이드382pg.차원축소(SVD).py
0.00MB
파이썬머신러닝완벽가이드382pg.차원축소(LDA).py
0.00MB

 

 

차원축소를 하는 이유

1. 데이터 분석 시간의 축소

2. 다중공산성(회귀 분석에서 사용된 모형의 일부 예측 변수가 다른 예측 변수와 상관 정도가 높아, 데이터 분석 시 부정적인 영향을 미치는 현상)을 방지하기 위해서

 

382pg. PCA 붓꽃데이터 차원축소 예제

 

- 40줄: enumerate

iris데이터프레임 target값이 0인 경우, 'sepal_length column을 반환

iris데이터프레임 target값이 0인 경우, 'sepal_with column을 반환

target의 i는 0~2이기 때문에 for문은 3번 돌아간다.

sepal_lenth와 sepal_with의 2개의 feature를 가지고 서로다른 marker를 가지고 scatter를 한다.

- 56줄: StandardScarler적용 (PCA는 여러 속성의 값을 연산해야 하므로 속성의 스케일을 동일하게 변환시켜야 함)

- 67줄: PCA변환 수행

- 74줄: n_components=2 축의 개수가 2개 (차원축소)

- 2개의 축으로 차원축소 해서 scatter을 한 결과는 다음과 같다. versicolor와 virginica의 구분이 좀 더 명확해졌다.

 

- 386pg. 변동성비율 (데이터를 설명하는 비율: pca.explained_variance_ratio_)

 

- PCA의 경우 약 10%의 성능저하가 일어남.

 

- 388pg. Credit_card.xls 파일 예제

 

https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients 

 

UCI Machine Learning Repository: default of credit card clients Data Set

default of credit card clients Data Set Download: Data Folder, Data Set Description Abstract: This research aimed at the case of customers’ default payments in Taiwan and compares the predictive accuracy of probability of default among six data mini

archive.ics.uci.edu

 

- 161줄: df.rename은 PAY_0을 PAY_1로, default payment next month를 default로 column 이름을 바꿔달라 

- 170줄: 1(연체)이 많다는 것을 알 수 있다.

 

- 188줄: X_features의 corr( ) 상관계수를 히트맵으로 그린다. 

- heatmap을 보면 색이 연할수록 feature사이의 상관도가 높음을 알 수 있다.

- 202줄: 1~6까지 i에 넣어서 나온 스트링값을 clos_bill 리스트에 담는다

- 207줄: df_cols_scaled는 StandardScaler를 적용한 6 column의 데이터가 들어가있다.

- 208줄: 6줄의 데이터를 2축으로 축소해서 반영했다.

- 211줄: 전체데이터에서 각 축이 얼마만큼의 변동성을 내포하는지 보여주는 수치이다. (전체데이터를 얼마나 설명하는가?)

- 첫 번째 축은 0.90, 두 번째 축은 0.05로 데이터를 설명하고 있다. 종합해서 두 축은 95%의 수치로 데이터를 설명하고 있다. 이 6개의 데이터들은 서로 상관관계가 높다고 할 수 있다.

 

 

- 241줄: 25개의 feature를 6개로 차원축소 한 뒤 평균정확도는 2%정도 하락했다. 원본데이터안에 몇몇 feature들이 밀접한 상관관계를 가질 가능성이 있기 때문에 (서로간의 종속관계가 있다면) 정확도가 많이 하락하지는 않았다. (반면 모두 독립적인 피처가 있는 데이터들을 차원축소하는 경우 정확도의 차이가 많이 날 수 있다) >> 이는 corr( )의 heatmap을 통해 확인할 수 있다.

 

 

 

 

- 393pg. LDA (Linear Discriminant Analysis)

- 선형판별분석법 (클래스 분리를 최대한 유지하면서 차원을 축소함>>분류 목적)

- 클래스 간 분산을 최대화/클래스 내부 분산을 최소화

 

PCA와의 차이

- 공분산 행렬이 아니라 클래스간/클래스 내부 분산행렬을 생성한 뒤 고유벡터를 구하고 입력데이터를 투영

(PCA는 입력데이터의 변동성/분산이 가장 큰 축을 기준으로 고유벡터를 구함)

- 지도학습 (클래스 결정값이 변환시에 필요)

 

 

- LDA 코드예제

- 29줄: iris.target이 input값에 추가된 것이 PCA와 다른 점이다.

(label 데이터끼리의 분산을 구해야 하므로 target값이 필요하다)

 

 

- PCA와 비교하면 다음과 같다.

- LDA와 달리 PCA는 분류가 잘 수행되지 않았다.

 

- 396pg. SVD (Singlar Value Decomposition)
- SVD는 특이값 분해로 불리며 PCA와 달리 정방행렬뿐만 아니라 행과 열의 크기가 다른 행렬에도 행렬 분해 기법을 이용할 수 있다. 행렬 U와 V에 속한 벡터는 특이벡터(singular vector)이며 모든 특이벡터는 서로 직교한다.

- PCA는 밀집행렬(Dense matrix)에 대한 변환만 가능하며 SVD는 희소행렬(Sparse matrix)에 대한 변환도 가능하다

참고) 희소행렬: 어떤 데이터 샘플만 0이 아닌 값을 가지고 나머지는 0인 값을 가지는 데이터로 이루어진 행렬. 대표적으로 원핫인코딩의 결과가 희소행렬이다.

 

A=UΣV^T (V^T는 전치행렬)

 

Σ는 대각행렬이며, 행렬의 대각에 위치한 값만 0이 아니고 나머지 위치의 값은 모두 0이다. Σ이 위치한 0이 아닌 값이 바로 행렬A의 특이값이다. A가 mxn차원일 때, U의 차원이 mxm, Σ의 차원이 mxn, V의 차원이 nxn으로 분해한다.

 

직교행렬: 벡터A와 벡터B가 직교할 때, 서로 직교하는 벡터로 이루어진 행렬을 말한다.

참고) 직교행렬에 전치행렬을 곱하면 1, 즉 Identity matrix가 된다.

참고) 서로 직교하는 벡터끼리의 내적은 0이다. cos90=0이므로.

https://twlab.tistory.com/37

대각행렬: 대각선 방향의 element만 유의미한 값을 가지고 나머지는 0으로 채워진 행렬이다.

https://rfriend.tistory.com/141

A=UΣV^T 에 V를 곱해보자.

AV=UΣ

행렬x직교행렬 >> 각각 벡터값의 선형변환

직교행렬x대각행렬 >> 직교행렬 (각각의 벡터의 사이즈만 변화)

결론: A라는 행렬에 직교행렬을 곱하면, 벡터의 선형변환이 일어나고, 그 결과 또한 사이즈가 변환된 직교행렬이다.

 

 

 

- SVD 코드예제

- 24줄: 4x4행렬에 들어가는 랜덤값을 정규분포상에서 추출

- 33줄: A=UΣV^T 실행한 뒤 U matrix, Sigma value, V transpose matrix를 프린트

- 37줄: Sigma_value는 시리즈값이 나오는데, 그 이유는 그 시리즈값이 대칭행렬값이기 때문이다. 46줄에 이를 대칭행렬로 변환시킨다.

- 47줄: U와 Sigma_mat(대칭행렬)의 행렬곱을 한 뒤 Vt와 행렬곱을 한다 >>A가 나오는지 확인하는 코드

- 58줄: a[2]는 a의 3번째 row 전체 데이터를 의미한다. (a[2, 0]이라면 a의 3번째 row의 첫 번째 요소를 말한다)

이렇게 행렬 안에서 서로간의 데이터 값을 더해서 넣으니 각각의 데이터 값의 의존성이 생겼다. (의존성이 높은 데이터와 그렇지 않은 데이터를 비교해보자) 

의존성(종속성)이 높은 데이터는 shape는 동일할지라도 sigma value가 달라졌다 (뒤로 갈 수 록 sigma 값이 작아지고 있다). 즉, 원본데이터가 각각 독립적이라면 sigma value에 뚜렷한 차이가 있지만 의존성이 높은 데이터는 sigma value 값이 차이가 많이 않다. (이는 의존성이 높은 데이터는 뒤에오는 몇몇 feature을 제거해도 원본데이터A를 잘 설명할 수 있다는 말이다)

before
after

그러면 데이터의 의존성이 차원축소와 어떤 관계가 있는가? (의존성이 있는 데이터는 Sigma값이 뒤로 갈수록 거의 0에 수렴한다. 0값에 거의 수렴한 두 데이터는 차원축소할 때 제거해도 좋을? 데이터라고 볼 수 있다. 즉 축을 많이 줄여도 원본을 잘 표현할 수 있다.)

 

- 76줄: UΣV^T 에서 Σ의 값이 2.773, 0.807, 0, 0 이라고 할 때, U를 Σ의 3, 4번째 대각행렬값과 곱하면 어차피 0이 나오게 된다. 그래서 앞 2행만 추출하게 된다. 4x2 행렬(U행렬은 1,2 열만 추출)과 2x2행렬(Σ행렬은 대각행렬의 1,2값만 추출)과 2x4행렬(V^T행렬도 1,2행만 추출)을 곱하게 되면 4x4행렬이 된다. 결과적으로 약간의 수정을 가한 원본행렬A가 나온다. 이는 수정을 가하지 않은 원본행렬A와 아주 가깝다.

 

 

- 103줄: 축을 5개로 줄인다. 뒤의 1개의 scaling factor에 포함된 데이터는 삭제하므로 원본데이터를 그대로 표현할 수 는 없음. 즉 원본행렬과 Truncated SVD 분해행렬의 결과값은 차이가 조금 있다.

 

- 126줄: TruncatedSVD는 Σ행렬에 있는 대각원소, 즉 특이값 중 상위 일부 데이터만 추출해 분해하는 방식이다. (인위적으로 더 작은 차원의 U, Σ, V^T로 분해하여 원본행렬을 정확히 다시 복구할 수는 없음.

 

 

 

- 405pg. NMF (Non-Negative Matrix Factorization)

원본 행렬 내의 모든 원소 값이 모두 양수라면 두 개의 기반 양수 행렬로 분해될 수 있는 기법을 지칭한다.

 

728x90
반응형