logo

주성분분석(PCA)

데이터세트의 기능이나 차원 수가 증가하면 통계적으로 유의미한 결과를 얻는 데 필요한 데이터의 양도 기하급수적으로 늘어납니다. 이로 인해 과적합, 계산 시간 증가, 기계 학습 모델의 정확도 감소 등의 문제가 발생할 수 있습니다. 이를 고차원 데이터로 작업하는 동안 발생하는 차원 문제의 저주라고 합니다.

차원의 수가 증가함에 따라 가능한 특징의 조합 수가 기하급수적으로 증가하고, 이로 인해 데이터의 대표 샘플을 계산적으로 얻기가 어려워지고 클러스터링이나 분류와 같은 작업을 수행하는 데 비용이 많이 들기 때문입니다. 추가적으로 일부 기계 학습 알고리즘은 차원 수에 민감할 수 있으므로 저차원 데이터와 동일한 수준의 정확도를 달성하려면 더 많은 데이터가 필요합니다.



문제를 해결하려면 차원의 저주 , 기능 엔지니어링 특징 선택 및 특징 추출을 포함하는 기술이 사용됩니다. 차원성 감소 원래 정보를 최대한 많이 유지하면서 입력 특징 수를 줄이는 것을 목표로 하는 특징 추출 기술의 한 유형입니다.

이 글에서는 가장 널리 사용되는 차원 축소 기술 중 하나인 주성분 분석(PCA)에 대해 설명합니다.

주성분 분석(PCA)이란 무엇입니까?

주요 구성 요소 분석 (PCA) 기법은 수학자에 의해 도입되었습니다. 칼 피어슨 1901년 . 이는 고차원 공간의 데이터가 저차원 공간의 데이터와 매핑되는 동안, 저차원 공간의 데이터의 분산이 최대가 되어야 한다는 조건에서 작동합니다.



  • 주성분 분석(PCA) 상관 변수 집합을 상관 관계가 없는 변수 집합으로 변환하는 직교 변환을 사용하는 통계 절차입니다. PCA는 탐색적 데이터 분석 및 예측 모델을 위한 기계 학습에서 가장 널리 사용되는 도구입니다. 게다가,
  • 주성분 분석(PCA)은 비지도 학습 변수 집합 간의 상호 관계를 조사하는 데 사용되는 알고리즘 기술입니다. 회귀분석을 통해 가장 적합한 선을 결정하는 일반 요인 분석이라고도 합니다.
  • 주성분 분석(PCA)의 주요 목표는 대상 변수에 대한 사전 지식 없이 변수 간의 가장 중요한 패턴이나 관계를 유지하면서 데이터세트의 차원성을 줄이는 것입니다.

주성분 분석(PCA)은 원래 변수 세트보다 작은 새로운 변수 세트를 찾아 데이터 세트의 차원성을 줄이는 데 사용되며 대부분의 샘플 정보를 유지하며 분석에 유용합니다. 회귀 및 분류 데이터.

주요 구성 요소 분석

  1. 주성분 분석(PCA)은 데이터의 최대 분산을 포착하는 주성분이라고 불리는 직교 축 세트를 식별하는 차원 축소 기술입니다. 주성분은 데이터 세트에 있는 원래 변수의 선형 조합이며 중요도가 낮은 순서로 정렬됩니다. 모든 주성분에 의해 포착된 총 분산은 원래 데이터 세트의 총 분산과 같습니다.
  2. 첫 번째 주성분은 데이터의 가장 큰 변동을 포착하지만 두 번째 주성분은 최대값을 포착합니다. 변화 그건 직교 첫 번째 주성분 등.
  3. 주성분 분석은 데이터 시각화, 특징 선택, 데이터 압축 등 다양한 목적으로 사용될 수 있습니다. 데이터 시각화에서 PCA를 사용하면 고차원 데이터를 2차원 또는 3차원으로 플롯하여 해석하기 쉽게 만들 수 있습니다. 기능 선택에서 PCA를 사용하여 데이터세트에서 가장 중요한 변수를 식별할 수 있습니다. 데이터 압축에서 PCA를 사용하면 중요한 정보를 잃지 않고 데이터 세트의 크기를 줄일 수 있습니다.
  4. 주성분 분석에서는 정보가 특징의 분산으로 전달된다고 가정합니다. 즉, 특징의 변화가 높을수록 해당 특징이 더 많은 정보를 전달한다고 가정합니다.

전반적으로 PCA는 데이터 분석을 위한 강력한 도구이며 복잡한 데이터 세트를 단순화하여 이해하고 작업하기 쉽게 만드는 데 도움이 될 수 있습니다.



PCA(주성분 분석)의 단계별 설명

1단계: 표준화

먼저, 우리는 표준화하다 우리의 데이터 세트는 각 변수의 평균이 0이고 표준 편차가 1인지 확인합니다.

Z = frac{X-mu}{sigma}

여기,

  • mu독립 특성의 평균입니다. mu = 왼쪽 { mu_1, mu_2, cdots, mu_m 오른쪽 }
  • 시그마 표준 편차 독립적인 기능의 시그마 = 왼쪽 { sigma_1, sigma_2, cdots, sigma_m 오른쪽 }

2단계: 공분산 행렬 계산

공분산 둘 이상의 변수 사이의 결합 변동성의 강도를 측정하여 서로 관련하여 얼마나 변하는지를 나타냅니다. 공분산을 찾기 위해 다음 공식을 사용할 수 있습니다.

cov(x1,x2) = frac{sum_{i=1}^{n}(x1_i-ar{x1})(x2_i-ar{x2})}{n-1}

공분산 값은 양수, 음수 또는 0일 수 있습니다.

  • 양수: x1이 증가하면 x2도 증가합니다.
  • 음수: x1이 증가하면 x2도 감소합니다.
  • 0: 직접적인 관계 없음

3단계: 주성분 식별을 위한 공분산 행렬의 고유값과 고유벡터 계산

A는 정사각형 nXn 행렬이고 X는 다음을 충족하는 0이 아닌 벡터라고 가정합니다.

AX = 람다 X

일부 스칼라 값의 경우 lambda. 그 다음에 lambda로 알려져있다 고유값 행렬 A와 X의 는 다음과 같이 알려져 있습니다. 고유벡터 해당 고유값에 대한 행렬 A의

다음과 같이 작성할 수도 있습니다.

egin{정렬} AX-lambda X &= 0  (A-lambda I)X &= 0 end{정렬}

여기서 나는 행렬 A와 같은 모양의 단위 행렬입니다. 그리고 위의 조건은 다음의 경우에만 참이 됩니다. (A - lambda I)역행렬이 불가능합니다(즉, 특이 행렬). 그 의미는,

|A - lambda I| = 0

위의 방정식에서 고유값 lambda를 찾을 수 있으므로 해당 고유벡터는 다음 방정식을 사용하여 찾을 수 있습니다. AX = 람다 X.

주성분 분석(PCA)은 어떻게 작동하나요?

따라서 PCA는 최소한의 차원을 사용하여 데이터의 가장 큰 분산을 보존하는 선형 변환을 사용합니다. 여기에는 다음 단계가 포함됩니다.

파이썬3

import> pandas as pd> import> numpy as np> # Here we are using inbuilt dataset of scikit learn> from> sklearn.datasets>import> load_breast_cancer> # instantiating> cancer>=> load_breast_cancer(as_frame>=>True>)> # creating dataframe> df>=> cancer.frame> # checking shape> print>(>'Original Dataframe shape :'>,df.shape)> # Input features> X>=> df[cancer[>'feature_names'>]]> print>(>'Inputs Dataframe shape :'>, X.shape)>
>
>

산출 :

Original Dataframe shape : (569, 31) Inputs Dataframe shape : (569, 30)>

이제 데이터를 표준화하는 첫 번째 단계를 적용할 것이며 이를 위해 먼저 특징 공간에 있는 각 특징의 평균과 표준 편차를 계산해야 합니다.

파이썬3

# Mean> X_mean>=> X.mean()> # Standard deviation> X_std>=> X.std()> # Standardization> Z>=> (X>-> X_mean)>/> X_std>
>
>

그만큼 공분산 행렬은 특징 공간에서 두 특징의 종속성이 서로 얼마나 강한지 시각화하는 데 도움이 됩니다.

파이썬3

# covariance> c>=> Z.cov()> # Plot the covariance matrix> import> matplotlib.pyplot as plt> import> seaborn as sns> sns.heatmap(c)> plt.show()>
>
>

산출 :

이제 우리는 고유벡터 그리고 고유값 기능 공간의 주요 구성 요소를 식별하는 데 큰 목적을 제공하는 기능 공간입니다.

파이썬3

eigenvalues, eigenvectors>=> np.linalg.eig(c)> print>(>'Eigen values: '>, eigenvalues)> print>(>'Eigen values Shape:'>, eigenvalues.shape)> print>(>'Eigen Vector Shape:'>, eigenvectors.shape)>
>
>

산출 :

Eigen values:  [1.32816077e+01 5.69135461e+00 2.81794898e+00 1.98064047e+00  1.64873055e+00 1.20735661e+00 6.75220114e-01 4.76617140e-01  4.16894812e-01 3.50693457e-01 2.93915696e-01 2.61161370e-01  2.41357496e-01 1.57009724e-01 9.41349650e-02 7.98628010e-02  5.93990378e-02 5.26187835e-02 4.94775918e-02 1.33044823e-04  7.48803097e-04 1.58933787e-03 6.90046388e-03 8.17763986e-03  1.54812714e-02 1.80550070e-02 2.43408378e-02 2.74394025e-02  3.11594025e-02 2.99728939e-02] Eigen values Shape: (30,) Eigen Vector Shape: (30, 30)>

고유값을 내림차순으로 정렬하고 그에 따라 대응하는 고유벡터를 정렬합니다.

파이썬3

# Index the eigenvalues in descending order> idx>=> eigenvalues.argsort()[::>->1>]> # Sort the eigenvalues in descending order> eigenvalues>=> eigenvalues[idx]> # sort the corresponding eigenvectors accordingly> eigenvectors>=> eigenvectors[:,idx]>
>
>

설명된 분산은 원래 특징 공간 대신 ​​주성분을 선택하여 유지된 전체 분산의 양에 대한 아이디어를 제공하는 용어입니다.

파이썬3

explained_var>=> np.cumsum(eigenvalues)>/> np.>sum>(eigenvalues)> explained_var>
>
>

산출 :

array([0.44272026, 0.63243208, 0.72636371, 0.79238506, 0.84734274,  0.88758796, 0.9100953 , 0.92598254, 0.93987903, 0.95156881,  0.961366 , 0.97007138, 0.97811663, 0.98335029, 0.98648812,  0.98915022, 0.99113018, 0.99288414, 0.9945334 , 0.99557204,  0.99657114, 0.99748579, 0.99829715, 0.99889898, 0.99941502,  0.99968761, 0.99991763, 0.99997061, 0.99999557, 1. ])>

주성분 수 결정

여기서 우리는 선택한 값의 주성분 수를 고려하거나 설명된 분산을 제한하여 고려할 수 있습니다. 여기서는 설명된 분산이 50% 이상인 것을 고려하고 있습니다. 여기에 얼마나 많은 주요 구성 요소가 포함되는지 확인해 보겠습니다.

파이썬3

n_components>=> np.argmax(explained_var>>=> 0.50>)>+> 1> n_components>
>
>

산출 :

2>

선택한 주요 구성 요소에 데이터 투영

  • 투영 행렬을 구하면, 이는 데이터의 공분산 행렬의 가장 큰 고유값에 해당하는 고유 벡터의 행렬입니다. 고차원 데이터세트를 저차원 부분공간에 투영합니다.
  • 데이터의 공분산 행렬의 고유 벡터를 데이터의 주축이라고 하며, 이러한 주축에 대한 데이터 인스턴스의 투영을 주성분이라고 합니다.

파이썬3

# PCA component or unit matrix> u>=> eigenvectors[:,:n_components]> pca_component>=> pd.DataFrame(u,> >index>=> cancer[>'feature_names'>],> >columns>=> [>'PC1'>,>'PC2'>]> >)> # plotting heatmap> plt.figure(figsize>=>(>5>,>7>))> sns.heatmap(pca_component)> plt.title(>'PCA Component'>)> plt.show()>
>
>

산출 :

  • 그런 다음 다음 공식을 사용하여 데이터세트를 투영합니다.

egin{정렬} Proj_{P_i}(u) &= frac{P_icdot u}u  &=P_icdot u end{정렬}

자바에서 문자열 비교
  • 그런 다음 대부분의 분산을 설명하는 축(차원)만 유지하고 다른 모든 축은 삭제하여 차원 축소를 얻습니다.

PCA에서 투영 찾기

파이썬3

# Matrix multiplication or dot Product> Z_pca>=> Z @ pca_component> # Rename the columns name> Z_pca.rename({>'PC1'>:>'PCA1'>,>'PC2'>:>'PCA2'>}, axis>=>1>, inplace>=>True>)> # Print the Pricipal Component values> print>(Z_pca)>
>
>

산출 :

 PCA1 PCA2 0 9.184755 1.946870 1 2.385703 -3.764859 2 5.728855 -1.074229 3 7.116691 10.266556 4 3.931842 -1.946359 .. ... ... 564 6.433655 -3.573673 565 3.790048 -3.580897 566 1.255075 -1.900624 567 10.365673 1.670540 568 -5.470430 -0.670047 [569 rows x 2 columns]>

데이터의 공분산 행렬의 고유 벡터를 데이터의 주축이라고 하며, 이러한 주축에 대한 데이터 인스턴스의 투영을 주성분이라고 합니다. 그런 다음 대부분의 분산을 설명하는 축(차원)만 유지하고 다른 모든 축은 삭제하여 차원 축소를 얻습니다.

Sklearn을 사용하는 PCA

주성분 분석의 전체 프로세스를 패키지에 함수로 구현하여 자동화한 다양한 라이브러리가 있으며 원하는 주성분 수만 전달하면 됩니다. Sklearn은 아래와 같이 PCA에 사용할 수 있는 라이브러리 중 하나입니다.

파이썬3

# Importing PCA> from> sklearn.decomposition>import> PCA> # Let's say, components = 2> pca>=> PCA(n_components>=>2>)> pca.fit(Z)> x_pca>=> pca.transform(Z)> # Create the dataframe> df_pca1>=> pd.DataFrame(x_pca,> >columns>=>[>'PC{}'>.> >format>(i>+>1>)> >for> i>in> range>(n_components)])> print>(df_pca1)>
>
>

산출:

 PC1 PC2 0 9.184755 1.946870 1 2.385703 -3.764859 2 5.728855 -1.074229 3 7.116691 10.266556 4 3.931842 -1.946359 .. ... ... 564 6.433655 -3.573673 565 3.790048 -3.580897 566 1.255075 -1.900624 567 10.365673 1.670540 568 -5.470430 -0.670047 [569 rows x 2 columns]>

위의 Z_pca 결과는 정확히 동일한 값이므로 일치시킬 수 있습니다.

파이썬3

# giving a larger plot> plt.figure(figsize>=>(>8>,>6>))> plt.scatter(x_pca[:,>0>], x_pca[:,>1>],> >c>=>cancer[>'target'>],> >cmap>=>'plasma'>)> # labeling x and y axes> plt.xlabel(>'First Principal Component'>)> plt.ylabel(>'Second Principal Component'>)> plt.show()>
>
>

산출:

파이썬3

# components> pca.components_>
>
>

산출 :

array([[ 0.21890244, 0.10372458, 0.22753729, 0.22099499, 0.14258969,  0.23928535, 0.25840048, 0.26085376, 0.13816696, 0.06436335,  0.20597878, 0.01742803, 0.21132592, 0.20286964, 0.01453145,  0.17039345, 0.15358979, 0.1834174 , 0.04249842, 0.10256832,  0.22799663, 0.10446933, 0.23663968, 0.22487053, 0.12795256,  0.21009588, 0.22876753, 0.25088597, 0.12290456, 0.13178394],  [-0.23385713, -0.05970609, -0.21518136, -0.23107671, 0.18611302,  0.15189161, 0.06016536, -0.0347675 , 0.19034877, 0.36657547,  -0.10555215, 0.08997968, -0.08945723, -0.15229263, 0.20443045,  0.2327159 , 0.19720728, 0.13032156, 0.183848 , 0.28009203,  -0.21986638, -0.0454673 , -0.19987843, -0.21935186, 0.17230435,  0.14359317, 0.09796411, -0.00825724, 0.14188335, 0.27533947]])>

주성분 분석의 장점

  1. 차원 축소 : 주성분 분석은 널리 사용되는 기법입니다. 차원 축소 , 이는 데이터세트의 변수 수를 줄이는 과정입니다. PCA는 변수 수를 줄여 데이터 분석을 단순화하고 성능을 향상하며 데이터 시각화를 더 쉽게 만듭니다.
  2. 기능 선택 : 주성분 분석을 위해 활용 가능 기능 선택 , 이는 데이터세트에서 가장 중요한 변수를 선택하는 과정입니다. 이는 변수의 수가 매우 많아 가장 중요한 변수를 식별하기 어려운 기계 학습에 유용합니다.
  3. 데이터 시각화 : 주성분 분석을 위해 활용 가능 다중공선성 : 주성분 분석을 이용하여 처리할 수 있습니다. 다중공선성 이는 두 개 이상의 독립변수가 높은 상관관계를 갖는 회귀분석에서 흔히 발생하는 문제입니다. PCA는 데이터의 기본 구조를 식별하고 회귀 모델에 사용할 수 있는 새로운 비상관 변수를 생성하는 데 도움이 됩니다.
  4. 소음 감소 : 주성분 분석을 통해 데이터의 노이즈를 줄일 수 있습니다. 주성분 분석은 잡음을 나타내는 것으로 가정되는 분산이 낮은 주성분을 제거함으로써 신호 대 잡음비를 개선하고 데이터의 기본 구조를 더 쉽게 식별할 수 있도록 해줍니다.
  5. 데이터 압축 : 데이터 압축을 위해 주성분 분석(Principal Component Analysis)을 사용할 수 있습니다. PCA는 데이터의 대부분의 변동을 포착하는 더 적은 수의 주성분을 사용하여 데이터를 표현함으로써 스토리지 요구 사항을 줄이고 처리 속도를 높일 수 있습니다.
  6. 이상치 감지 : 이상치 검출을 위해 주성분 분석(Principal Component Analysis)을 사용할 수 있습니다. 특이치 데이터 세트의 다른 데이터 포인트와 크게 다른 데이터 포인트입니다. 주성분 분석은 주성분 공간의 다른 지점에서 멀리 떨어져 있는 데이터 지점을 찾아 이러한 이상값을 식별할 수 있습니다.

주성분 분석의 단점

  1. 주요 구성 요소의 해석 : 주성분 분석을 통해 생성된 주성분은 원래 변수의 선형 결합이므로 원래 변수의 관점에서 해석하기 어려운 경우가 많습니다. 이로 인해 PCA 결과를 다른 사람에게 설명하기가 어려울 수 있습니다.
  2. 데이터 스케일링 : 주성분 분석은 데이터 규모에 민감합니다. 데이터의 크기가 적절하게 조정되지 않으면 PCA가 제대로 작동하지 않을 수 있습니다. 따라서 주성분 분석을 적용하기 전에 데이터 규모를 조정하는 것이 중요합니다.
  3. 정보 손실 : 주성분 분석으로 인해 정보가 손실될 수 있습니다. 주성분 분석은 변수 수를 줄이는 반면 정보 손실로 이어질 수도 있습니다. 정보 손실 정도는 선택한 주성분의 수에 따라 달라집니다. 따라서 유지할 주성분의 수를 신중하게 선택하는 것이 중요합니다.
  4. 비선형 관계 : 주성분 분석에서는 변수 간의 관계가 선형이라고 가정합니다. 그러나 변수 간에 비선형 관계가 있는 경우 주성분 분석이 제대로 작동하지 않을 수 있습니다.
  5. 계산 복잡성 : 주성분 분석 계산은 대규모 데이터 세트의 경우 계산 비용이 많이 들 수 있습니다. 이는 데이터 세트의 변수 수가 많은 경우 특히 그렇습니다.
  6. 과적합 : 주성분 분석은 때때로 다음과 같은 결과를 초래할 수 있습니다. 과적합 이는 모델이 훈련 데이터에 너무 잘 맞고 새 데이터에서는 성능이 좋지 않은 경우입니다. 이는 너무 많은 주성분이 사용되거나 모델이 작은 데이터 세트에서 훈련되는 경우 발생할 수 있습니다.

자주 묻는 질문(FAQ)

1. 주성분 분석(PCA)이란 무엇입니까?

PCA는 가장 중요한 정보를 보존하면서 고차원 데이터를 저차원 표현으로 변환하기 위해 통계 및 기계 학습에 사용되는 차원 축소 기술입니다.

2. PCA는 어떻게 작동하나요?

주성분은 PCA가 데이터의 가장 큰 변화를 포착하기 위해 찾아 사용하는 원래 특징의 선형 조합입니다. 그들이 설명하는 분산의 양에 따라 이러한 직교 구성요소가 배열됩니다.

3. PCA는 언제 적용해야 합니까?

다중 공선형 또는 고차원 데이터 세트로 작업할 때 PCA를 사용하는 것이 유리합니다. 특징 추출, 노이즈 감소 및 데이터 전처리가 이를 위한 주요 용도입니다.

4. 주성분은 어떻게 해석되나요?

새 축은 각 주성분으로 특징 공간에 표시됩니다. 데이터 변동성을 포착하는 데 있어 구성 요소의 중요성을 나타내는 지표는 더 큰 변동을 설명하는 능력입니다.

5. 주요 구성요소의 중요성은 무엇입니까?

주성분은 데이터가 가장 많이 변하는 방향을 나타냅니다. 처음 몇 개의 구성 요소는 일반적으로 데이터 분산의 대부분을 캡처하므로 보다 간결하게 표현할 수 있습니다.