멀리 보는 연습

머신러닝_BMI(체질량지수) 실습(K-Nearest Neighbors) 본문

빅데이터 분석 서비스/머신러닝

머신러닝_BMI(체질량지수) 실습(K-Nearest Neighbors)

푸실리 2021. 8. 29. 15:37

머신러닝 2번째 실습인 bmi 체질량지수를 통한 실습. 막연하게 머신러닝을 생각했을 땐, 어떻게 학습을 시켜서 어떻게 예측하게 만드나 궁금했는데, 생각보다 간단하게 진행되었다. 바로 7:3으로 나눠서 7을 학습시키고 3을 예측하게 시키는 것! 이번 실습은 500명의 키와 몸무게를 통해서 진행했는데, 앞으로 규모가 더 커지면 500명은 아무것도 아닐 거라는 생각이 들었다. 

01. 목표 (문제 정의)

- 500명의 키와 몸무게, 비만도 라벨을 이용해 비만을 판단하는 모델을 만들어보자.

 

import pandas as pd
import matplotlib.pyplot as plt

02. 데이터 수집

- bmi500.csv 파일 형식의 데이터 파일 가져오기

bmi_500.csv
0.01MB

data = pd.read_csv('data/bmi_500.csv', index_col='Label')
data

data.head()

data.tail()

 

# 전체 데이터(row) 수, 결측치 여부, 컬럼 별 정보, 데이터 타입
data.info()
# 결측치가 없다는 것을 알 수 있음

data.head() # 인덱스를 빼면 컬럼은 3개

# 기술 통계 확인 >> 4분위수로 나눈 값들을 나열 (min, 25%, 50%, 75%, max) 
data.describe()

data.index.unique()

#DataFrame
#df[컬럼명]
#df.loc[행]
#df.loc[행,열]
data.loc['Overweight'].head(2)

 

#과체중인 사람의 키 데이터
data.loc['Overweight','Height']

#보통인 사람의 몸무게 데이터
data.loc['Normal','Weight']

 

 

03. 전처리 생략

04. 탐색적 데이터 분석(EDA)

- 각 비만도 등급 별로 시각화

def myScatter (label, color) : 
    la_data = data.loc[label]
    plt.scatter(la_data['Weight'],
               la_data['Height'],
               c = color,
               label = label)
plt.figure(figsize=(5,5))
myScatter('Obesity','purple')
myScatter('Normal','red')
myScatter('Overweight','green')
myScatter('Extreme Obesity','pink')
myScatter('Weak','black')
myScatter('Extremely Weak','blue')

plt.legend()
plt.xlabel('Weight')
plt.ylabel('Height')
plt.show()

05. 모델링

- 1. 문제와 답으로 분리
- 2. train(훈련셋)과 test(평가셋) 분리
- 3. 모델 생성 및 하이퍼파라미터 조정
- 4. 학습 및 평가

 

#인덱스를 리셋해서 컬럼자리로 보내기
data.reset_index(inplace=True)
data.head()
#df.iloc[ 행 , 열]
#data.iloc[:,2:]
data[['Height','Weight']]

X = data.iloc[:,2:] #문제
y = data.iloc[:,0] # 정답
# 2. train(훈련셋)과 test(평가셋) 분리
# 7:3
# train > 350, test > 150
X_train = X.iloc[:350,:]# 훈련 문제
X_test = X.iloc[350:,:] # 평가 문제
y_train = y[:350] # 훈련 답
y_test = y[350:] # 평가 답
X_train.shape, y_train.shape

X_test.shape, y_test.shape

from sklearn.neighbors import KNeighborsClassifier #KNN 모델 Classifier 분류
knn_model=KNeighborsClassifier() #객체 생성
knn_model.fit(X_train, y_train) #학습하는 코드(문제, 답)
pre = knn_model.predict(X_test) # 예측하는 코드 (문제,답)
from sklearn import metrics #평가 지표 라이브러리
metrics.accuracy_score(pre, y_test) #예측한답, 실제답

학습 후 예측한 결과가 무려 90% 육박! 대박!

 

활용하기

knn_model.predict([[190,59]])

 

이렇게 키와 몸무게를 임의로 넣으면 스스로 분석해서  'Obesity', 'Normal', 'Overweight', 'Extreme Obesity', 'Weak', 'Extremely Weak' 6가지 카테고리 중 알맞는 상태(?)를 알려준다. 190cm에 59kg는 저체중(Weak)이라는 것을 알 수 있다. (육안으로만 봐도 알겠지만..)

Comments