머신러닝
머신러닝 - ex2_BMI
인생진리
2023. 2. 14. 16:50
### 문제정의
- 머신러닝을 통해서 어떤 문제를 해결할 것인가?
- 지도 vs 비지도 vs 강화
- 지도학습 - 분류(bmi 이닌깐)
- 비만을 판단하는 모델
### 데이터 수집
- csv파일로 이루어진 데이터 수집
- 500명의 성별,키,몸무게, 비만도 등급
import pandas as pd
bmi = pd.read_csv('./data/bmi_500.csv')
bmi
### 데이터 전처리
- 결측치 처리 : 비어있는 데이터를 채워주기
- 이상치 처리 : 정상적인 범위를 벗어난 데이터 수정하기
#### 결측치 확인
- info() 함수 사용
bmi.info()
#### 이상치 확인
- describe() : 수치형 데이터만 분석가능
# 거의 다 정상적인 데이터로 판단됨
bmi.describe()
### 탐색적 데이터 분석(Exploratory Data Analysis)
- 데이터 자세히 살펴보기
- 비만도별로 데이터가 잘 나뉘어져 있는지
#### 비만도 등급확인
# 중복 제거하고 값을 확인
bmi['Label'].unique()
#### Label Weak인 사람들만 추리기
bmi
# 불리언 인덱싱
bolWeak = bmi['Label'] == 'Weak'
scatter_data = bmi.loc[bolWeak]
scatter_data
import matplotlib.pyplot as plt
#### Weak 인 사람들을 그래프로 그리기
# plt.scatter(x,y)
plt.scatter(scatter_data['Height'],scatter_data['Weight'],
color = 'blue' ,label='Weak')
plt.legend() #차트에서 그린 label출력
plt.show()
#### OverWeight 그래프 그리기
- 초록색으로 그리기
# 불리언 인덱싱
bolOver = bmi['Label'] == 'Overweight'
scatter_data = bmi.loc[bolOver]
plt.scatter(scatter_data['Height'],scatter_data['Weight'],
color = 'green' ,label='OverWeight' )
#### 함수로 만들어서 그래프 그리기
def myScatter(Label,color):
bol = bmi['Label'] == Label
scatter_data = bmi.loc[bol]
plt.scatter(scatter_data['Height'],scatter_data['Weight'],
color = color ,label= Label )
#### 전체 그래프 그리기
# 그래프 크기 조정
plt.figure(figsize=(12,8))
myScatter('Extremely Weak','black')
myScatter('Weak','blue')
myScatter('Normal','green')
myScatter('Overweight','pink')
myScatter('Obesity','purple')
myScatter('Extreme Obesity', 'red')
plt.legend()
plt.show()
bmi['Label'].unique()
#### 이상치 골라내기
bmi.loc[bmi['Weight']==78] #다음시간에 알려준다함
bmi.loc[231,'Label'] = 'Obersity'
bmi.loc[231,'Label']
### 모델 선택 및 하이퍼 파라미터 튜닝
- 머신러닝 모델을 불러와서 사용하는 단계
- 머신러닝 모델의 학습에 변화를 주고 싶다 - 하이퍼 파라미터 튜닝
- 하이퍼 파라미터 = 수정 가능한 파라미터
#### 모델 로드
- KNN 모델 : 머신러닝 모델
from sklearn.neighbors import KNeighborsClassifier
Knn_bmi = KNeighborsClassifier(n_neighbors = 5) #짝수 엄마가 아빠가 좋아여서 홀수로 준다
#### 문제와 정답 분리
# 문제 = Height, Weight
X = bmi.loc[:,'Height':'Weight']
# 정답 = Label
y = bmi.loc[:,'Label']
#### 훈련(train)과 평가(test)로 분리
- 훈련: 평가 = 7:3
X_train = X.iloc[:350]
X_test = X.iloc[350:]
y_train = y.iloc[:350]
y_test = y.iloc[350:]
##### 훈련, 평가 데이터 분리 라이브러리
from sklearn.model_selection import train_test_split
X_train, X_test, y_train,y_test = train_test_split(X,y,test_size =0.3)
X_train.shape, X_test.shape,y_train.shape,y_test.shape
### 학습
# fit(문제, 정답)
# KNN 모델 BMI데이터를 학습> BMI데이터에 대한 규칙을 찾음
# X데이터(Height, Weight)를 통해서 y데이터(Label)의 규칙을 찾음
Knn_bmi.fit(X_train,y_train)
### 평가
- 모델이 제대로 만들어졌는지 평가 = score
- 새로운 데이터에 대해서 예측 = predict
# 예측
# predict(문제)
# 문제는 2차원 데이터
Knn_bmi.predict([[174,68]])
# 만들어진 모델을 평가
# score(문제데이터, 정답데이터)
# X_test가 예측한 정답 정답 데이터를 (y_test)비교
Knn_bmi.score(X_test,y_test)
# 학습을 할 때 사용도니 데이터이기 때문에 test데이터보다 score 값이 높음
Knn_bmi.score(X_train,y_train)
# 오류코드(핑크)제거
import warnings
warnings.filterwarnings(action='ignore')
### 하이퍼 파라미터 튜닝
- KNN모델의 하이퍼 파라미터(n_neighbors)의 변화에 따라 scorer값을 확인
# 점수를 저장할 list 생성
train_acc = []
test_acc =[]
#n_neighbors를 1~30까지 돌림
for i in range(1,31):
# n_neighbors를 변경해가면서 모델 생성
knn = KNeighborsClassifier(n_neighbors = i )
#생성된 모델에 학습
knn.fit(X_train, y_train)
#만들어진 규칙으로 score 값 저장
train_acc.append(knn.score(X_train,y_train))
test_acc.append(knn.score(X_test,y_test))
print(f"{i}번째 score : {knn.score(X_train,y_train)}")
# x 축 = n_neighbors = range(1,31)
# y 축 = score
plt.plot(range(1,31),train_acc, label='Train')
plt.plot(range(1,31),test_acc, label='Test')
plt.legend()
plt.show()
이 코드는 BMI 데이터를 불러와서 전처리를 수행하고, 탐색적 데이터 분석을 통해 시각화를 하고, KNN(K-최근접 이웃) 알고리즘을 사용하여 비만도를 예측하는 모델을 학습하는 코드입니다.
개선방안
- 데이터 불러오기 부분에서 파일 경로를 상대경로로 작성하면 코드를 실행하는 컴퓨터마다 파일 경로가 다를 수 있습니다. 절대경로나 데이터 파일을 프로젝트 폴더 내부에 저장해야한다.
- 불필요한 코드가 있는데, 이는 주석을 이용해서 제거해야 한다.
- 예를 들면 'bmi['Label'].unique()' 코드를 여러 번 실행하는 것은 필요하지 않다.
- 데이터 전처리 단계에서 결측치와 이상치를 처리하는 코드가 없는데, 이를 처리하는 과정이 모델의 성능에 큰 영향을 미칩니다. 이를 추가하는 것이 좋다.
- 훈련과 평가 데이터를 분리하는 부분에서 데이터 분리 비율을 설정하지 않았는데, 이를 명시하는 것이 좋다. 데이터 분리 라이브러리를 사용하여 데이터를 분리해야한다.