데이터 출처 : www.kaggle.com/lodetomasi1995/income-classification
Income classification
Prediction task is to determine whether a person makes over 50K a year.
www.kaggle.com
Ipynb File : github.com/sangHa0411/DataScience/blob/main/Income_Prediction_Part1.ipynb
sangHa0411/DataScience
Contribute to sangHa0411/DataScience development by creating an account on GitHub.
github.com
Part2에서는 Part1에서 분석한 결과를 토대로 특성 선택 및 데이터 전처리를 하겠습니다. 그리고 Logistic Regression의 원리를 알아보고 알고리즘을 구현해보겠습니다.
Part1 의 분석 결과를 통해서 저희는 어떠한 특성이 Income과 연관이 있는지 확인을 하였습니다. 그리고 저는 아래의 데이터의 속성들을 이용할 계획입니다.
따라서 먼저 특성을 선택하고 Target Data를 분리합니다.
그리고 Data의 국가를 US 이외의 국가를 Other로 수정함으로써 US 와 Other로 이분합니다.
전처리에 필요한 Scikit learn 항목들을 불러옵니다.
위의 Scikit-learn 함수들을 이용해서 데이터를 전처리합니다.
먼저 데이터를 분할하고 훈련 데이터에 대해서만 전처리 항목들을 학습을 시키고 이를 이용해서 훈련 데이터 및 테스트 데이터를 전처리합니다.
이산적인 속성에 대해서는 원 핫 인코딩을 이용할 것이며
연속적인 속성에 대해서는 StandardSclaer을 이용할 것입니다.
데이터 구조를 확인해본 결과 하나의 데이터 항목은 44개의 속성을 가지게 된 것을 확인할 수 있습니다. 이러한 속성을 통해서 우리는 해당 사람의 Income.이 50k가 넘는가 넘지 못하는 가를 예측할 수 있게 됩니다.
Logistic Regression을 위해서는 먼저 시그모이드 함수가 필요합니다.
시그모이드 함수를 자세하게 보면 아래와 같습니다. 시그모이드 함수의 출력 값은 0~1 사이의 값을 가지므로 저희는 이 출력 값을 확률로도 생각할 수 있습니다. 따라서 저희는 해당 출력의 결과가 0.5 보다 크면 해당 클래스는 1로 예측하고 출력의 결과가 0.5보다 적으면 해당 클래스는 0으로 분류할 것입니다.
Logistic Regression의 전체적인 과정은 아래와 같습니다. 저희는 Input Data의 속성이 총 44개가 되는 것을 확인하였습니다. 따라서 저희는 Weight Vector를 만드는 데 이는 44개의 weight들로 구성이 되어있습니다.
정리하면 input 과 weight 행렬을 곱해서 하나 의 값을 구하고 해당 값을 sigmoid 함수에. 입력해서 출력 값을 구합니다. 그리고 출력 값을 정답 값과 비교해서 구한 loss function을 기준으로 weight 값을 갱신하는 구조입니다.
weight 값을 주정하는 방법은 유명한 경사하강법을 이용할 것 입니다.
경사하강법에 대해서는 다음 사이트에 가면 쉽게 이해하실 수 있습니다.
developers.google.com/machine-learning/crash-course/reducing-loss/gradient-descent
손실 줄이기: 경사하강법 | 머신러닝 단기집중과정 | Google Developers
예상 시간: 10분 반복 방식 다이어그램(그림 1)에는 '매개변수 업데이트 계산'이라는 두루뭉술한 모양의 녹색 상자가 포함되어 있었습니다. 이 애매모호한 알고리즘을 좀 더 실질적인 것으로 대��
developers.google.com
이제 저희는 데이터에 알맞는 weight Vector를 가지는 것임을 알 수 있습니다.
그리고 이는 경사하강법을 이용해서 weight 값을 조정할 것인데 구체적인 방법은 Back Propagation을 이용할 것입니다.
아래의 사진은 Back Propagation의 예시를 보여드린 것입니다.
따라서 저희는 손실함수를 가중치로 미분한 값을 가지는 것이 목표인데 이를 위해서는 손실함수를 sigmoid의 입력 값이 되는 값들로 미분한 값이 필요한 것을 알 수 있습니다.
아래는 저희가 사용하는 sigmoid 함수에 대해서 sigmoid의 출력 값과 실제 정답의 손실함수를 sigmoid의 출력값으로 미분한 값을 구하는 수입니다.
이를 이용해서 SGD Optimizer 방법을 이용해서 가중치를 갱신합니다.
가중치의 값들을 모두 1로 설정합니다, 그리고 데이터의 입력과 가중치의 곱한 값을 sigmoid에 입력함으로써 sigmoid의 출력 값과 정답 값을 비교해서 손실함수를 출력에 대해서 미분한 값을 구합니다.
그리고 해당 값을 이용해서 손실함수를 가중치로 미분한 값을 구해서 가중치값을 조정합니다.
이렇게 구한 weight Vector를 통해서 test data로 성능을 검사해보고 손실 값이 어떻게 조정되는지 확인해보겠습니다.
getAccuracy 함수는 위 github 주소에 가시면 확인하실 수 있습니다.
성능 결과로만 보면 나쁘지 않아 보이지만 Loss graph를 확인해본 결과 Loss 가 수렴하지 않고 값이 크게 진동하는 것을 확인할 수 있습니다. 따라서 저희 목표인 weight 값을 조정하는 것을 만족시키지 못한 것으로 생각하였습니다.
따라서 저는 SGD로 Optimizer로 weight 값을 조정하는 것이 아니라 AdaGrad 방법으로 가중치를 조정해보았습니다.
AdaGrad 의 공식은 다음과 같습니다.
이를 구현한 함수는 아래와 같습니다.
이를 SGD와 같이 성능을 체크해보고 Loss 값을 확인해보았습니다.
전체적인 성능은 SGD와 크게 다르지는 않지만 Loss 값이 진동하는 것이 아니라 0 값에 수렴에 가는 것을 확인할 수 있었습니다,
이로써 이번 목표인 데이터에 맞게 Weight Vector의 값을 조정하는 것을 만족시켰다고 판단할 수 있습니다.
참고자료 1. www.yes24.com/Product/Goods/9046762
머신러닝 인 액션
최고의 한 수를 위한 데이터 마이닝!개발자를 위한 지침서. 기계 학습 소개, 다양한 예제로 기계 학습 실습하기, 매일 발생되는 데이터 분석하기, 어프라이어리와 에이다부스트 같은 전형적인 ��
www.yes24.com
참조자료2 : www.yes24.com/Product/Goods/34970929
밑바닥부터 시작하는 딥러닝
직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서 이 책은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며 즐겁게 배울 수 있는 본격 딥
www.yes24.com
'Machine Learning' 카테고리의 다른 글
Machine Learning - SVM 마스크 착용 여부 검사하기 (0) | 2020.10.06 |
---|---|
Machine Learning - Logistic Regression 연봉 예측하기 Part3 (0) | 2020.10.05 |
Machine Learning - Logistic Regression 연봉 예측하기 Part1 (0) | 2020.10.05 |
MachineLearning - Decision Tree 타이타닉 생존자 예측하기 Part3 (0) | 2020.10.05 |
MachineLearning - Decision Tree 타이타닉 생존자 예측하기 Part2 (0) | 2020.10.05 |