본문 바로가기
공부/인공지능

BlogFeedback 피쳐셀렉션 (Feature Selection) (feat. Lasso, Ridge)

by 혼밥맨 2020. 12. 21.
반응형

BlogFeedback 피쳐셀렉션 (Feature Selection) (feat. Lasso, Ridge)

 

데이터 셋 (Data Set)

출처 (Source) : archive.ics.uci.edu/ml/datasets/BlogFeedback

 

blogData_train.csv

열이 218개가 있을 정도로 아주 큰 데이터입니다. 데이터를 이루는 각 열의 attribute를 확인하겠습니다. 

데이터 셋의 열이 281개 ...

열이 281개로 이렇게 많은 데이터 셋은 다뤄본 적이 없는데 처음에 많이 당황했습니다. 그래도 각 열에 대한 설명이 있기 때문에 다행이네요. 이렇게 열이 많이 있을 때 어떤 columns를 이용해서 마지막 열인 댓글 수를 예측해야 할 지 모릅니다. 그러므로, 우리는 마지막 열과 상관관계가 높은 열들만 골라서 예측을 진행해볼 것입니다. 그리고 우리는 이것을 feature selection이라고 부릅니다. 인간이 일일이 모든 열을 조사하고 분석할 수 없기 때문에 이런 데이터 셋이 있으면 자동으로 상관관계가 높은 columns를 골라줄 수 있도록 자동화합니다.

 

코드 (Code)

import libraries

첫 줄은 당연하게도 필요한 라이브러리들을 수입(?) 해줍니다 ㅎㅎ import necessary libraries.

 

 

파일 불러오기 & 읽기

데이터 셋을 불러와서 읽고, train 변수에 저장합니다. 데이터 셋 자체에 Header가 없기 때문에 None이라고 반드시 할 필요 없습니다. Optional 입니다.

 

혹시나 missing value가 있는지 train.isna().sum().sum()을 출력해줌으로써 확인해줍시다. 만일 blank, empty, NaN 값이 데이터 셋에 포함되어 있다면 the number of missing values을 출력해줍니다.

 

Number of missing values is equal to zero.

 빠진 데이터가 한 개도 없기 때문에 데이터를 따로 손 봐줄 필요가 없어 보입니다. (예를 들어, NaN 채우기, 빈칸 채우기 등등. 우리는 이것을 데이터 클리닝 (data cleaning)이라고 부릅니다.

 

print(train.shape) # 52397 x 281

열 (column) = 특성 (feature) 이라고 하고, 행 (row) = 샘플 (sample) 이라고 합니다.

 

52397행과 281열로 이루어진 데이터 셋임을 다시 확인했습니다.

 

 

 

주성분분석 (PCA; Principal component Analysis)

PCA는 데이터 하나 하나에 대한 성분을 분석하는 것이 아니라, 여러 데이터들이 모여 하나의 분포를 이룰 때 이 분포의 주 성분을 분석해 주는 방법입니다. 여기서 주성분이라 함은 그 방향으로 데이터들의 분산이 가장 큰 방향벡터를 의미합니다. Sci-kit learn에서 PCA를 import해서 데이터의 분포를 확인할 것입니다.

 

주성분분석 (PCA; Principal component Analysis)

사이킷 런에서 PCA를 import하고, 데이터 셋의 분포도를 plotting하니 0에 가까운 데이터들이 많이 있다는 것을 한 눈에 확인할 수 있었습니다.

 

 

그리고 이제 이 포스트의 목적인 feature selection을 진행할 것입니다.

 

Xtrain에는 마지막 열을 제외한 데이터, ytrain에는 마지막 열 (댓글 개수, number of comments)을 할당해줍니다. 그리고 a_list에는 alpha의 후보들을 할당해줍니다.

 

이제는 Ridge, Lasso, ElasticNet에서는 실제로 feature selection이 어떻게 진행되고 어떤 결과를 뱉어내는지 확인할 것입니다. 

 

Ridge

Ridge

릿지 교차검증에 미리 만들어 놓은 알파 후보들을 가지고 있는 'a_list'를 파라미터로 입력합니다. 그리고 ridge.fit(Xtrain, ytrain)을 통해서 훈련을 진행합니다. 

 

훈련을 마치고 최고 알파값, 선정된 피쳐들, 메트릭 결과를 확인해봅니다. 

 

그 다음으로 Lasso, ElasticNet의 결과를 보고 어떤 모델이 좋은지 비교하고 확인할 것입니다.

 

Lasso

Lasso도 Ridge와 동일하게 진행합니다.

 

 

 

 

ElasticNet 

엘라스틱넷 역시 이전 Ridge와 Lasso를 진행했던 것과 동일하게 진행합니다.

 

 

Summary Table (요약표)

Summary Table (Ridge, Lasso, Elastic Net)

세 모델 모두 R^2 및 MSE 측면에서 유사한 결과를 보였습니다. 적합도 측면에서 모든 모델의 결과가 상당히 유사합니다. 하지만, feature가 더 적을수록 예측하기에 간단해지는 경향이 있기 때문에, 가장 적은 feature selection 결과를 출력한 두 모델인 Lasso와 Elastic Net을 다시 테스트해 볼 것입니다. 이 경우에는 Lasso와 Elatic Net이 있습니다. 

 

Final Summary Table (최종 요약표)

Lasso vs Elastic Net
Final Summary Table (Lasso and Elastic Net)

두 모델을 테스트 셋에서 다시 진행했을 때 feature selection 결과에 대해 변함은 없었지만, R^2와 MSE (Mean Squared Error)에서는 약간의 변함이 있었습니다. (이 부분은 모델을 동작할 때 마다 예측값이 변동하기 때문에 반드시 생기는 문제입니다.)

 

요약표의 결과를 고려할 때 두 모델은 적합도 면에서 상당히 동일합니다. 하지만, Lasso는 feature selection의 개수가 Elastic Net과 비교했을 때 아직도 적고, MSE 역시 낮습니다. 따라서, Lasso 모델을 이용해서 예측을 진행하기로 결정했습니다. 

 

Lasso 모델과 Elastic Net 모델이 어떤 columns을 feature selection을 했는지 궁금합니다. 그러면 아래와 같이 입력하고 출력할 수 있습니다.

 

선정된 피쳐들 출력하기
Lasso 모델이 선정한 피쳐들 목록

print(lasso.coef_.nonzero()[0])

Lasso 모델이 선정한 피쳐들을 출력하면 피쳐들의 인덱스가 출력됩니다.

 

이상 칼럼이 많은, 열이 많은, 피쳐들이 많은 데이터 셋을 다룰 때 피쳐 셀렉션하는 방법에 대해서 알아보았습니다!

반응형

댓글