BlogFeedback 피쳐셀렉션 (Feature Selection) (feat. Lasso, Ridge)
데이터 셋 (Data Set)
출처 (Source) : archive.ics.uci.edu/ml/datasets/BlogFeedback
열이 218개가 있을 정도로 아주 큰 데이터입니다. 데이터를 이루는 각 열의 attribute를 확인하겠습니다.
열이 281개로 이렇게 많은 데이터 셋은 다뤄본 적이 없는데 처음에 많이 당황했습니다. 그래도 각 열에 대한 설명이 있기 때문에 다행이네요. 이렇게 열이 많이 있을 때 어떤 columns를 이용해서 마지막 열인 댓글 수를 예측해야 할 지 모릅니다. 그러므로, 우리는 마지막 열과 상관관계가 높은 열들만 골라서 예측을 진행해볼 것입니다. 그리고 우리는 이것을 feature selection이라고 부릅니다. 인간이 일일이 모든 열을 조사하고 분석할 수 없기 때문에 이런 데이터 셋이 있으면 자동으로 상관관계가 높은 columns를 골라줄 수 있도록 자동화합니다.
코드 (Code)
첫 줄은 당연하게도 필요한 라이브러리들을 수입(?) 해줍니다 ㅎㅎ import necessary libraries.
데이터 셋을 불러와서 읽고, train 변수에 저장합니다. 데이터 셋 자체에 Header가 없기 때문에 None이라고 반드시 할 필요 없습니다. Optional 입니다.
혹시나 missing value가 있는지 train.isna().sum().sum()을 출력해줌으로써 확인해줍시다. 만일 blank, empty, NaN 값이 데이터 셋에 포함되어 있다면 the number of missing values을 출력해줍니다.
빠진 데이터가 한 개도 없기 때문에 데이터를 따로 손 봐줄 필요가 없어 보입니다. (예를 들어, 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를 import하고, 데이터 셋의 분포도를 plotting하니 0에 가까운 데이터들이 많이 있다는 것을 한 눈에 확인할 수 있었습니다.
그리고 이제 이 포스트의 목적인 feature selection을 진행할 것입니다.
Xtrain에는 마지막 열을 제외한 데이터, ytrain에는 마지막 열 (댓글 개수, number of comments)을 할당해줍니다. 그리고 a_list에는 alpha의 후보들을 할당해줍니다.
이제는 Ridge, Lasso, ElasticNet에서는 실제로 feature selection이 어떻게 진행되고 어떤 결과를 뱉어내는지 확인할 것입니다.
Ridge
릿지 교차검증에 미리 만들어 놓은 알파 후보들을 가지고 있는 'a_list'를 파라미터로 입력합니다. 그리고 ridge.fit(Xtrain, ytrain)을 통해서 훈련을 진행합니다.
훈련을 마치고 최고 알파값, 선정된 피쳐들, 메트릭 결과를 확인해봅니다.
그 다음으로 Lasso, ElasticNet의 결과를 보고 어떤 모델이 좋은지 비교하고 확인할 것입니다.
Lasso
Lasso도 Ridge와 동일하게 진행합니다.
ElasticNet
엘라스틱넷 역시 이전 Ridge와 Lasso를 진행했던 것과 동일하게 진행합니다.
Summary Table (요약표)
세 모델 모두 R^2 및 MSE 측면에서 유사한 결과를 보였습니다. 적합도 측면에서 모든 모델의 결과가 상당히 유사합니다. 하지만, feature가 더 적을수록 예측하기에 간단해지는 경향이 있기 때문에, 가장 적은 feature selection 결과를 출력한 두 모델인 Lasso와 Elastic Net을 다시 테스트해 볼 것입니다. 이 경우에는 Lasso와 Elatic Net이 있습니다.
Final Summary Table (최종 요약표)
두 모델을 테스트 셋에서 다시 진행했을 때 feature selection 결과에 대해 변함은 없었지만, R^2와 MSE (Mean Squared Error)에서는 약간의 변함이 있었습니다. (이 부분은 모델을 동작할 때 마다 예측값이 변동하기 때문에 반드시 생기는 문제입니다.)
요약표의 결과를 고려할 때 두 모델은 적합도 면에서 상당히 동일합니다. 하지만, Lasso는 feature selection의 개수가 Elastic Net과 비교했을 때 아직도 적고, MSE 역시 낮습니다. 따라서, Lasso 모델을 이용해서 예측을 진행하기로 결정했습니다.
Lasso 모델과 Elastic Net 모델이 어떤 columns을 feature selection을 했는지 궁금합니다. 그러면 아래와 같이 입력하고 출력할 수 있습니다.
print(lasso.coef_.nonzero()[0])
Lasso 모델이 선정한 피쳐들을 출력하면 피쳐들의 인덱스가 출력됩니다.
이상 칼럼이 많은, 열이 많은, 피쳐들이 많은 데이터 셋을 다룰 때 피쳐 셀렉션하는 방법에 대해서 알아보았습니다!
'공부 > 인공지능' 카테고리의 다른 글
블로그 댓글 개수 예측하기(using Random Forest) (0) | 2021.01.13 |
---|---|
커리어넷 대학정보 크롤링하기 (feat. Python Selenium) (0) | 2020.12.30 |
파킨스 텔레모니터링 데이터 셋 분석과 모델 훈련 (feat. 랜덤 포레스트) (1) | 2020.12.23 |
QSAR Aquatic Toxicity LC50 예측 (feat. TPOT) (1) | 2020.12.20 |
ML/DL for Everyone with PyTorch (Sung Kim) (0) | 2020.12.13 |
댓글