- Published on
당뇨병 위험 분류 예측
인터넷 강의를 통해 머신런닝 이론을 공부했으니 이제 적용을 하면서 내가 잘 알고 있는지 확인할 차례이다. 내가 정확히 알고 있는지 확인하는 방법으로는 2가지가 있다. 첫번째 방법은 다른 사람에게 설명하는 방법이고, 두번째 방법은 직접 문제를 풀면서 내가 알고 있는 지식들을 적용해보는 방법이 있다. 지금은 내 설명을 들어줄 사람이 없으므로 문제를 직접 풀어보려 한다.
문제를 풀 수 있는 플랫폼 중에 대표적으로 Kaggle과 Dacon이 있는데 Kaggle은 너무 많은 문제가 있고, 또 영어로 되어 있어서 처음 시작하기에는 어려워보였다. 다행히 국내 서비스인 Dacon은 한글로 되어 있었고, 또 수준별로 학습할 수 있는 곳도 있어서 좋아보였다.
수준별로 나눠져 있는 문제들
아래 사진처럼 입문, 초급, 중급 3가지 수준으로 학습 할 수 있고, 배운 내용들을 해커톤에서 풀어볼 수 있다. 유료 서비스이기는 하지만 학습 카테고리는 Step by Step으로 한단계씩 진행할 수 있어서 전체적인 문제 풀이 방법을 쉽게 이해할 수 있었다.
선택한 문제 : 당뇨병 위험 분류 예측
해결할 문제로 당뇨병 위험 분류 예측 문제를 선택했다. 학습 과정에 초급, 중급으로 나눠져 있어서 단계별로 접근할 수 있었고, 또 의료 분야에서 AI가 어떻게 사용되는지도 궁금했다.
진행
컴퓨터를 전공한 대학생이라면 알고리즘 풀이 방법 중에 Divide and conquer 라는 말을 알 것이다. 복잡해 보이는 문제를 풀 때 한꺼번에 다 해결하려고 하지 말고, 작게 나눠서 하나씩 해결하면 쉽게 해결할 수 있다는 뜻이다. 한꺼번에 복잡한 풀이들을 이해하거나 풀려고 하지 않고, 처음에는 정답률이 낮지만 가장 간단한 코드를 작성해두고, 조금씩 개선하는 방법으로 진행하려 한다.
시작 코드 작성
좋지 코드가 아니더라도 돌아가는 간단한 코드를 작성해두고 조금씩 개선하면서 개념들을 이해하다보면 효율적으로 학습할 수 있다고 생각한다.
# 필요한 라이브러리 import
import pandas as pd
import csv
from sklearn.linear_model import LogisticRegression
# 전처리 (데이터 입력 및 가공)
data = pd.read_csv('train.csv')
train_df_labels = data["Outcome"].copy()
train_df = data.drop(["ID", "Outcome"], axis=1)
# 모델 생성
model = LogisticRegression()
hello = model.fit(train_df, train_df_labels)
# 정답 도출
test = pd.read_csv('test.csv')
x_test = test.drop('ID', axis = 1)
predict = model.predict(x_test)
위의 코드는 가장 기본적인 Logistic Regression을 사용해서 문제를 해결한다. Scaling도 하지 않았고, 어떤 데이터 처리도 없이 계산했지만 아래 이미지처럼 78점의 점수를 얻었다. 시작치고 나쁘지 않았다.
데이터 가중치 확인
Logistic Regression은 Deep Learning과 다르게 작동하는 방식을 살펴볼 수 있다. 아래처럼 가중치를 확인할 수 있는데 DiabetesPedigreeFunction 값의 가중치가 95%로 가장 중요함을 확인할 수 있다.
아래는 각 Feature의 뜻인데 많은 데이터가 있지만 이 중에서는 DiabetesPedigreeFunction 값이 압도적으로 중요함을 알 수 있다.
- Pregnancies : 임신횟수
- Glucose : 포도당 농도
- BloodPressure : 혈압
- SkinThickness : 피부두께
- Insulin : 인슐린
- BMI : 체질량지수
- DiabetesPedigreeFunction : 당뇨병 혈통 기능
- Age : 나이
기타 내용들
언제 Linear Regression을 사용하고, 언제 Logistic Regression을 사용하나요?
- 연속적인 값을 예측할 때는 Linear Regression을 사용하고, 상태를 분류할 때는 Logistic Regression을 사용한다.
Scaling을 꼭 해야 하나요?
- Linear Regression에서는 스케일링이 꼭 필요하지는 않습니다. 하지만 특성 간에 스케일 차이가 크면 성능에 영향을 미칠 수 있습니다. 위의 예제에서도 스케일링을 하지 않았을 때는 155번 학습 사이클을 돌아야 했지만, 스케일링을 했을 때는 11번의 학습 사이클로 완료했다. 학습 사이클 횟수는 n_iter_ 속성 값을 통해서 알 수 있다.
앞으로의 고민
- 어떻게 개선할 수 있을까?
- Feature를 어떻게 다루고 개선해야 하는지를 공부하면 좋을 것 같다. Feature Engineering 강의를 찾아봐야겠다.
- 어떻게 더 날카로워질 수 있을까?
- 도메인 지식을 확보하기 위해 논문을 볼 수 있어야 한다. 논문에 대한 이해 능력을 높일 수 있다면 경쟁력을 가질 수 있을 것이다.
- 더 많은 지식과 경험이 경쟁력이 된다. 언어 능력은 경쟁력이다.
- 더 많은 문제를 풀어보자. 다양한 경험 속에서 의미있는 여러가지를 알 수 있게 될 것이다.
- 데이터의 mean, std, 값의 분포 등을 미리 살펴보라고 하는데 이게 왜 중요한지 아직 잘 모르겠다. 막연히 값이 중요하다는 생각은 들지만, 실질적으로 활용해본 적이 없어서 잘 모르겠다.
교훈
- 머신러닝이란 사람이 직접 분석하기 데이터에서 어떤 값이 유의미한 영향을 끼치는지 쉽게 알 수 있도록 도와주는 기술인 것 같다. 아래와 같은 경우에 도움이 될 것 같다.
- 서비스를 운영할 때 유료 결제하는 회원들의 특징을 알아냄으로써 마케팅 타겟을 효율적으로 정할 수 있을 것 같다.
- 논문 등을 작성할 때 어떤 값이 중요한지 이해하는데 도움을 받을 수 있다.
- 챗 GPT 등을 활용해서 직원들에게 사내 데이터를 분석한 결과를 쉽게 알려줄 수 있다.
- Regression(회귀분석)은 언제 사용하면 좋을까?
- 딥러닝에 비해 데이터가 적은 경우에 효율적.
- 이해와 설명이 중요할 때 좋다. 어떤 데이터가 얼마나 중요한지 설명할 수 있기 때문이다. 프로젝트 중에는 '왜'가 '얼마나'보다 더 중요한 경우가 있다.
- 도메인에 대한 지식 또한 중요하다.
- 회사에서 일할 때 확보되어있는 데이터 속에서 충분한 결과를 뽑아낼 수 있다면 상관없지만, 만약 데이터가 없다면 새로운 데이터를 만들어야 한다. 이 경우 도메인에 대한 지식이 정말 중요할 것 같다. 모든 데이터를 수집할 수 없으니 어떤 데이터를 수집해야 할지 정할 때 해당 분야의 논문 등에서 유의미하다고 보고된 값이 무엇인지 알고 있다면 훨씬 효율적으로 결과를 추출할 수 있기 때문이다. 모든 도메인을 공부할 수는 없으니 관심 분야 위주로 공부해보고, 또 해당 분야의 사람들과 커뮤니케이션 하는 것 또한 중요한 능력일 것 같다.