[디스플레이센서 이상요인 분석] 2021/8/1 분산, 상관관계, VIF를 이용한 컬럼제거

August 01 2021

오늘 한 것

1.분산이 0인 컬럼제거

38_K-Digital_Training_Project
  • VarianceThreshold(threshold)는 분산을 구하고 threshold에 설정한 임계치에 수렴하는 컬럼을 제거해줍니다.
  • get_support함수로 남겨지는 컬럼 index를 반환해주는데 이를 이용하여 남겨지는 컬럼명과 삭제할 컬럼명을 출력할 수도 있습니다.
   from sklearn.feature_selection import VarianceThreshold
   
   # 분산이 0에 수렴하는 컬럼을 제거하고 DataFrame을 반환하는 함수
   def VarianceThreshold_selector(data):
       # 임계값으로 0을 지정
       selector = VarianceThreshold(0)
       selector.fit(data)
       # 남겨지는 컬럼index 저장
       features = selector.get_support(indices = True)
       # 남겨지는 컬럼명 저장
       features = [data.iloc[:,column].name for column in features]
       # 삭제 컬럼명 출력
       deleted_columns = [column for column in data.columns if column not in features]
       print('삭제된 컬럼명의 개수 : ', len(deleted_columns))
       print('\n 삭제된 컬럼명 : ')
       for i in deleted_columns:
           print(i)
       selector = pd.DataFrame(selector.transform(data))
       selector.index = data.index
       selector.columns = features
       # DataFrame 반환
       return selector
   
   print('컬럼제거 전 : ',  fact_data.shape)
   fact_data = VarianceThreshold_selector(fact_data)
   print('컬럼제거 후 : ',  fact_data.shape)
  • 삭제된 컬럼명
20_K-Digital_Training_Project

2.높은 상관관계의 컬럼제거

  • 상관관계가 1.0인 컬럼에 대해 같은 그룹내에서 하나만 남기고 나머지를 제거하는 작업을 하려고 했는데 columns의 순서쌍과 상관관계를 list에 담으려니 상관관계를 구하는 시간도 오래걸리고 그룹화하는 작업도 매우 번거로웠습니다.
  • 그래서 한번에 모든 컬럼에 대한 상관관계를 구하고 기준을 낮추어 0.9이상의 컬럼을 제거하는 처리를 구현하였고 무려 679개의 컬럼이 삭제 되었습니다.

3.VIF계수가 30이하가 될때까지 반복하여 컬럼 제거

  • 컬럼이 제거되기 전인 841개의 컬럼에 대해 VIF계수를 한번 구할때 약 40분 정도가 소요되었는데 많은 컬럼이 삭제되어 약 8분정도가 소요됩니다. 그래도 아직 상관계수가 $15e+7$ 라서 가장 높은 VIF계수가 30이 될 때까지 반복해서 VIF계수를 구하는 처리를 구현하였고 지금 실행 중입니다. 결과는 수 시간뒤에 나올 것 같습니다.

4.PCA 주성분분석

  • 위의 VIF계수를 구하는 처리가 될 때까지 PCA주성분 분석에 대해 공부해봐야겠습니다.


5.PPT작성

  • 7/29 목요일 멘토링 시간에 발표한 내용을 포함하여 8/2 월요일에 발표할 PPT를 작성하였습니다.

Leave a comment