More
- 강의 노트에서 Extraction의 경우 장점이 feature수 많이 줄일 수 있음이라고 하던데 Selection 의 경우에는 feature수를 많이 못 줄이나요?
- 사이킷런 라이브러리를 사용했을 때와 직접 주성분 분석을 했을 때의 값이 부호가 반대로 나오는데 크게 신경쓰지 않아도 되는 부분?
- 원 데이터의 분산의 합과 = 주성분 분석의 분산의 합이 같다고 하는데 왜 다르게 나옴?
Dimension Reduction
빅데이터의 시대가 온 이후로 하루에도 수없이 많은 데이터가 생성 된다는 글을 한번 쯤은 보셨을 겁니다.
물론 많은 데이터가 있으면 더 높은 퀄리티의 분석 결과가 나올 수 있는것은 맞는 말이지만
꼭 많은 리소스를 사용하는 많은 데이터가 있어야만 하는지는 충분히 생각해보아야 할 이슈입니다.
이 강의 이후에 여러분이 기억해야할 핵심 키워드들은 아래와 같습니다 .
Vector Transformation
High dimension Data
와, 이로 인한 이슈
Feature Extraction / Selection
PCA
High dimensional data
🏆 학습 목표
- Vector transformation의 목적과 사용예시를 설명 할 수 있다.
- eigenvector / eigenvalue를 설명 할 수 있다.
- 데이터의 feature 수가 늘어나면 생기는 문제점과 이를 handling 하기 위한 방법을 설명 할 수 있다.
- PCA의 목적과 기본원리를 설명 할 수 있다.
n133 요약
정리
- 고차원의 문제 (The Curse of Dimensionality)
피쳐 수(columns 수) > 데이터의 개수 N(index 수) 가 될 때 차원의 저주가 생김
-차원의 저주란 데이터의 수보다 변수개수가 더 느어나면서 차원은 더 커지는데 (그에 비해 데이터가 적으니) 빈공간이 많아져서 생기는 문제이다.
- 높은 feature의 다른 문제점
오버피팅 문제도 일어남.
- Selection 과 Extraction의 차이
변수 선택은 두 변수간의 연관성을 고려해야 하지만, 피쳐를 직관적을 이해하기에 좋다.
반대로 변수 축소는 연관성이 고려되지만 피쳐를 파악하기엔 힘들다.(주성분 분석이 여기에 해당)
- Principal Component Analysis (PCA)
변수를 축소하여 분석하는 방법 .
- 데이터의 공분산 행렬을 구하고 이의 고유값과 고유벡터를 구하여 고유벡터에 대하여 데이터들을 정사영 시키는 방법으로 차원을 축소한다.
- 데이터의 분산 == 정보
호랑이와 사자의 그림에서 차이가 가장 큰 것이 가장 많은 정보를 가지고 있다.
(위에서 눈과 코보단 이마와 갈기가 더 둘의 차이를 잘 보여준다. )
차이가 크다는 것은 데이터의 분산이 크다는 것이므로 분산은 데이터의 정보를 더 많이 갖고 있다고 할 수 있다.(분산==정보)
아래의 scatter plot에 그려진 2개의 feature중에서 1개만을 분석에 사용해야 한다면,
(=2차원의 데이터를 1차원으로 차원축소 하려고 한다면)
X와 Y 중 어느 feature를 사용 해야 할까요??
→ 분산이 더 큰 x를 사용해야 한다!
만약 축이 평행이 아니라면
이런 상황을 위해 고유 벡터를 배운 것. ?? 이해안감 [ ]
- PCA Process
1) 데이터를 준비
2) 각 열에 대해서 평균을 빼고, 표준편차로 나누어서 Normalize를 함.
3) Z의 분산-공분산 매트릭스를 계산함
4) 분산-공분산 매트릭스의 고유벡터와 고유값을 계산함
5) 데이터를 고유 벡터에 projection 시킴. (matmul)———왜? 스캐터플롯으로 뿌려져 있는 데이터들을 직선상으로 축소한다면 제일 많은 정보를 가지고 있는 선으로 축소하는 것이 가장 좋고, 이 선은 고유 벡터로 구할 수 있기 때문에.
📕 라이브러리를 사용한 PCA
from sklearn.preprocessing import StandardScaler, Normalizer from sklearn.decomposition import PCA print("Data: \n", X) scaler = StandardScaler() Z = scaler.fit_transform(X) print("\n Standardized Data: \n", Z) pca = PCA(2) pca.fit(X) print("\n Eigenvectors: \n", pca.components_) print("\n Eigenvalues: \n",pca.explained_variance_) B = pca.transform(X) print("\n Projected Data: \n", B)
중간에 standardized data가 이전과 다른 이유:
standardized_data = ( X - np.mean(X, axis = 0) ) / np.std(X, ddof = 1, axis = 0) print("\n Standardized Data: \n", standardized_data)
에서
standard deviation
에 쓰이는 자유도가 1이냐 혹은 0이냐의 차이 (critical 한 차이 아님)
선형대수에서 행렬의 의미
주성분 분석에서 공분산 행렬로의 정사영
위에서 말한 바와 같이, 좌표상에서 행렬은 새로운 값을 만들어주는 함수와도 같다. 즉, 새로운 값(차원 축소된 값)을 같기 위해 공분산 행렬이 필요하다.
이 공분산행렬의 고유벡터로의 정사영으로 차원을 축소할 수 있게 된다.

- 고유 벡터(eigenvector) : 그 행렬이 벡터에 작용하는 주축(principal axis)의 방향
- 고유 값 : 고유벡터 방향으로 얼마만큼의 크기로 늘어나는 지
→ 벡터의 크기(Norm)이 각 벡터의 고유값을 의미
과제
도전과제
# 직접 구한 값의 시각화 plt.title('scree plot') plt.xlabel('Number') plt.ylabel('Variance') plt.plot([np.var(Z[:,0]),np.var(Z[:,1]),np.var(Z[:,2]),np.var(Z[:,3])],'o-') # scree plot은 각 주성분의 설명력을 보기 위한 그래프. 꺾이는 지점까지 사용한다.
# 설명력 계산 eigen_vals, eigen_vecs = np.linalg.eig(covariance_matrix) # 에이겐벨류의 설명 분산 비율 tot = sum(eigen_vals) var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)] # 에이겐벨류 / 에이겐벨류의 합 을 각각 구한다. 나온 각각의 값은 아이겐벨류의 설명 분산 비율 # 즉, 어떤 에이겐벨류가 가장 설명력이 높은지를 비율로 나타내기 위한 것 cum_var_exp = np.cumsum(var_exp) # 누적 합을 계산해주는 함수. -> 누적 백분위로 표현 var_exp # 고유값의 설명 분산 비율 cum_var_exp # 설명력의 누적합을 보았을 때 3번째 주성분까지 사용했을 때 0.97로 90%가 넘어가는 것을 확인할 수 있다.
-
'코드스테이츠 Ai Boostcamp' 카테고리의 다른 글
[n13x] Sprint Challenge (0) | 2021.06.12 |
---|---|
[선형대수] 클러스터링(군집분류) (0) | 2021.06.12 |
[선형대수] rank, span, projection (0) | 2021.06.12 |
[n12x] Sprint Challenge (0) | 2021.06.12 |
[통계학] Bayesian(베이즈 정리) (0) | 2021.06.12 |
댓글