본문 바로가기
코드스테이츠 Ai Boostcamp

[선형대수]Dimension Reduction(차원축소)

by mintee
728x90

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%가 넘어가는 것을 확인할 수 있다.
728x90

댓글