관리 메뉴

DeseoDeSeo

[Machine Learning] BMI 학습 본문

Python

[Machine Learning] BMI 학습

deseodeseo 2023. 8. 25. 17:42

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

 머신 러닝 과정을 이해해보자.

 Panda 및 시각화
import pandas as pd
import matplotlib.pyplot as plt

 

모델 관련해서 불러오는 코드
knn모델 불러오기, 측정 도구 불러오기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

 

데이터 준비(수집)
: ./ 하면 machine learning 폴더임을 알려줌,
data = pd.read_csv('./Data/bmi_500.csv', index_col ='Label')
data

데이터 정보 확인
: 전체 행, 컬럼의 개수 및 정보, 결측치 여부 확인
data.info()

< 알 수 있는 것들 >

  • shape : (행, 컬럼) (500,3)
  • 성별 컬럼 , 키, 몸무게 모두 결측치 없는 상태
  • 데이터 확인 필수 ! => 머신러닝 모델은 문자를 이해할 수 없음.

 

데이터 분석(탐색)
-기술 통계 확인 : 평균, 최솟값, 중앙값( 오름차순으로 정렬했을 때, 정 중앙 값), 최대값
- 시각화를 통해 데이터의 분포 확인해보기.
data.describe()
  •  describe()는 숫자형태인 int, float컬럼에 대해서 먼저 작용됨. 그래서 gender가 출력 안 됨.
  • 현재 data안에는 비만에 대한 사람의 데이타가 많이 있음을 알 수 있음.
  • 평균mean과 50%의 결과를 비교했을 때, 결측치가 많은지 알 수 있음.

 

라벨 확인
data.index.unique()

value_counts() 
:각각의 값의 횟수를 셀 수 있는 함수(기능)
data.index.value_counts()

시각화
< x축 키, y 축 몸무게를 기준으로 산점도 그려보기  >
  • Extreme Obesity 에 해당하는 행만 접근하기
d = data.loc['Extreme Obesity']
plt.scatter(d['Height'],d['Weight'], c='blue', label ='ext obes' ) #d.loc[:,'Height']
plt.legend() # 범례에 표시해주랑.
plt.show()

 

그래프를 그리는 함수 정의

 

def bmi_draw(label, color):
    d2 = data.loc[label]
    plt.scatter(d2['Height'],d2['Weight'], c=color, label = label )

 

Label을 하나씩 연결하면서 , 색감도 설정하면서 함수를 6번 호출(사용)

 

bmi_draw('Extreme Obesity','blue')
bmi_draw('Obesity','cyan')
bmi_draw('Normal' ,'orange')
bmi_draw('Overweight' ,'green')
bmi_draw('Weak','yellow')
bmi_draw('Extremely Weak' ,'pink')
plt.legend()
plt.show()

 

< 모델링 >

 

df.reset_index() 
: 인덱스에 있는 label을 컬럼쪽으로 연결하기(이동하기)
data2 = data.reset_index()
data2

 

# 문제와 답으로 컬럼 분리 !
x = data2.loc[:,'Height':'Weight']
y = data2.loc[:,'Label']

 

크기확인
print('문제크기: ',x.shape)
print('답 크기: ',y.shape)

√ 행이 총 몇개 ? 500개
√  train, test 데이터로 분리하는 비율 : 7:3정도의 비율
√ 500개 중에서 70%에 속하는 데이터의 개수는 ? ~ 350개  
x_train : x에서 ~350개까지
x_train =  x.iloc[:350,:]
x_test : x에서 350개 부터 끝까지
x_test=  x.iloc[350:,:]

 

y_train : y에서 ~ 350개까지
y_train= y.iloc[:350]

 

 

y_test : y에서 350번째 부터~ 
y_test = y.iloc[350:]

 

print(y_train.shape)
print(y_test.shape)

<  모델링 >
- 모델 객체 생성
- 모델 학습모델
- 평가 및 예측

 

데이터 클래스(카테고리)의 개수는 ? 6개
from sklearn.neighbors import KNeighborsClassifier

 

6개 중에서 1개를 판단하는 것 -> 다중분류
from sklearn.metrics import accuracy_score # 정확도 지표

 

knn_model 이라는 변수로 모델 객체 생성
사람이 설정하는 매개변수 -> 하이퍼 파라미터
이웃의 수 n_neighbors : 5개
knn_model =  KNeighborsClassifier(n_neighbors=5)
모델 학습
fit(훈련문제, 훈련 답)
knn_model.fit(x_train, y_train)

 예측 시켜보기
predict(테스트 문제)
pre = knn_model.predict(x_test)
pre.size

정확도가 약 90%이다.