머신러닝 학습단계
1. 문제정의
2. 데이터 만들기
3. 데이터 전처리
4. 탐색적 데이터 분석(EDA) ==> 위 문제에서는 생략
5. 모델생성, 하이퍼 파라미터 튜닝
6. 학습
7. 평가
BMI 실습
### 문제정의
- 머신러닝을 통해서 어떤 문제를 해결할 것인가?
- 500명의 성별, 키, 몸무게, 비만도 등급을 이용하여 비만을 판단하는 머신러닝 모델 만들기
- 목표 : 머신러닝 전체 학습과정의 흐름을 이해하기
- 지도학습 => 분류
### 데이터 수집
- csv 파일로 이루어진 데이터 수집
- 500명의 성별, 키, 몸무게, 비만도 등급
import pandas as pd
bmi = pd.read_csv('./data/bmi_500.csv')
bmi
### 데이터 전처리
- 1. 결측치 처리 : 비어있는 데이터를 채워주기
- 2. 이상치 처리 : 정상적인 범위를 벗어난 데이터 수정하기
#### 결측치 확인
- info()
bmi.info()
#### 이상치 확인
- describe()
- 수치형 데이터만 분석이 가능. 기술통계
bmi.describe()
# count : 데이터 수
# mean : 평균
# std : 표준편차
# min : 최소값
# 25% : 1분위수
# 50% : 중앙값
# 75% : 3분위수
# max : 최대값
# 1. min, max 확인하기
# 2. 평균(mean), 중앙값(50%) 확인하기 => 두 수치가 비슷 : 이상치가 없다.
# 3. 비슷하지 않다면 min ~ max까지 5개의 간격을 확인하기
# => 각 구간의 간격이 고르게 분포가 되어있는지 확인
# 우리의 데이터는 거의 다 정상적인 데이터로 판단이 된다.
### 탐색적 데이터 분석(EDA)
- 데이터를 좀 더 자세하게 살펴보자
- 비만도별로 데이터가 잘 나뉘어져 있는지 확인
#### 비만도 등급 확인
# 중복을 제거하고 값을 확인 - unique()
bmi['Label'].unique()
#'Obesity' : 비만
#'Normal' : 정상
#'Overweight' : 과체중
#'Extreme Obesity' : 고도비만
#'Weak' : 저체중
#'Extremely Weak' : 극심한 저체중
#### Label이 'Weak'인 사람들만 추려보기
# 불리언 인덱싱
bol = bmi['Label'] == 'Weak' # 불리언 인덱싱한 결과를 사용하기 위해 변수에 저장
scatter_data = bmi.loc[bol] # 라벨이 Weak인 전체 행에 대한 데이터를 가지고 와서 변수에 저장
scatter_data
#### 'Weak'인 사람들을 그래프로 그리기
import matplotlib.pyplot as plt
# 산점도 차트 : plt.scatter(x, y)
plt.scatter(scatter_data['Height'], scatter_data['Weight'],
color = 'blue', label = 'Weak')
plt.legend()
plt.show()
#### 'Overweight'인 그래프 그리기
bo1 = bmi['Label'] == 'Overweight'
scatter_data1 = bmi.loc[bo1]
scatter_data1
plt.scatter(scatter_data1['Height'], scatter_data1['Weight'],
color = 'pink', label = 'Overweight')
plt.legend()
plt.show()
#### 함수로 만들어서 그래프 그리기
- 반복되는 부분을 함수로 간략화
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=(15,10))
myScatter('Obesity', 'red')
myScatter('Normal', 'green')
myScatter('Overweight', 'yellow')
myScatter('Extreme Obesity' , 'pink')
myScatter('Weak', 'blue')
myScatter('Extremely Weak', 'purple')
plt.legend()
plt.show()
bmi[bmi['Label'] == 'Obesity']
h_153 = bmi[bmi['Height'] == 153]
h_153
# 231 Female 153 78 Normal ==> 'Obesity'로 수정
# 키가 153이고 몸무게가 78인 사람이 Normal로 잘못 표기 => Obesity로 수정
bmi.loc[bmi['Weight'] == 78]
bmi.loc[231, 'Label'] = 'Obesity'
bmi.loc[bmi['Weight'] == 78]
### 모델 생성 및 하이퍼 파라미터 튜닝
- 머신러닝 모델을 불러와서 사용하는 단계
#### 모델 불러오기
- kNN 모델
from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier()
#### 문제데이터와 정답데이터로 분리
# 머신러닝은 수치형 데이터만 학습할 수 있음
# Height/Weight만 문제데이터로 정의
# 문제 : Height, Weight
X = bmi.loc[:, ['Height', 'Weight']]
display(X)
# 정답 : Label
y = bmi.loc[:, 'Label']
display(y)
#### 학습을 위해 훈련용(train)과 평가용(test)로 분리
- 훈련 : 평가 = 7: 3
# 훈련용 문제, 훈련용 정답(~350)
X_train = X.iloc[:350]
y_train = y.iloc[:350]
display(X_train)
display(y_train)
# 평가용 문제, 평가용 정답
X_test = X.iloc[350:]
y_test = y.iloc[350:]
display(X_test)
display(y_test)
display(X_train.shape)
display(y_train.shape)
display(X_test.shape)
display(y_test.shape)
### 학습
- fit
# knn_model.fit(X,y)
knn_model.fit(X_train, y_train)
### 평가
- 모델이 제대로 만들어졌는지 평가
- 새로운 데이터에 대해서 예측 : predict()
import warnings
warnings.filterwarnings('ignore')
knn_model.predict([[173, 53]])
# 만들어진 모델을 평가 => 학습에 사용하지 않은 새로운 데이터로 검증
# 새로운 문제(예측)와 정답(예측과 비교)이 필요 => 평가용 데이터
# 몇개를 맞혔는지 확인 필요
# score(문제데이터, 정답데이터)
# 정답데이터와 예측데이터를 비교
# 0 ~ 1 사이의 값을 출력
# 0 : 모델의 성능이 낮다, 규칙이 엉망이다. => 규칙을 찾지 못함
# 1 : 모델의 성능이 괜찮다. 규칙을 잘 찾음
knn_model.score(X_test, y_test)
# 0.9 : 10개 중에서 9개를 맞춤
# 훈련용 데이터의 정확도
knn_model.score(X_train, y_train)
- train을 사용한 score가 일반적으로 높음
- test를 사용한 score가 일반적으로 낮음
- => 정상
- train을 사용한 score가 낮음 => 과소적함
- test를 사용한 score가 높음
- => 규칙을 잘못 찾음, test는 운으로 잘 맞춤
- => 비정상
KNN
: K-미지의 수, 이웃의 수
: N-nearest
: N-neighbors
- 가까운 이웃을 찾아서 예측 포인트로 사용
- 분류 : 이웃 중에서 가장 많은 값으로 예측
- 회귀 : 이웃 값의 평균값으로 예측
- 이웃의 수를 적절하게 정해줘야 함
(n_neighbors 파라미터를 수정)
- 장점 : 간단하게 사용 가능하고 성능도 괜찮음
- 단점 : 특성값의 범위(scale)를 모두 동일하게 맞춰줘야 판단을 잘함
=> ex) 안경유무를 판단할 때 키(140~199), 시력(0.0~2.0)
개념상으로 시력이 안경의 유무에 중요하지만,
KNN은 거리기반으로 계산하기 때문에 키가 더 많이 작용
(값의 변화가 크기 때문에)
--> 데이터를 같은 범위로 만들어줘야 함.
--> 값들의 범위를 맞춰줌.
<일반적인 상황>
일반화 : 규칙이 적당해서 잘 맞춤
=> 일반화가 잘 된 모델을 찾는 것(머신러닝을 진행하면서 가져야 할 목표)
과대적합 : 규칙이 너무 많아서 특정 데이터(학습에 사용한)만 맞춤
과소적합 : 규칙이 너무 없어서 아무것도 못맞춤
<머신러닝 상황>
일반화 : 훈련세트에 적당히 학습해서 규칙이 적당히 만들어짐
=> 훈련세트는 적당히 맞추고, 평가세트를 잘 맞추는 현상
과대적합 : 훈련세트에 너무 많이 학습해서 규칙이 훈련세트에 맞춰짐
=> 훈련세트는 잘 맞추지만 평가세트는 잘 맞추지 못하는 현상
과소적합 : 훈련세트에 너무 적게 학습해서 규칙이 조금만 만들어짐
=> 훈련세트도 잘 맞추지 못하고 평가세트도 잘 맞추지 못하는 현상
'Computer Engineering > 머신러닝' 카테고리의 다른 글
타이타닉 데이터 실습_앙상블 (0) | 2023.06.15 |
---|---|
타이타닉 데이터 분류 (0) | 2023.06.13 |
Decision Tree_버섯데이터 분류 실습 (0) | 2023.06.08 |
KNN-iris 분류 실습 (2) | 2023.06.07 |
머신러닝 기초_AND 연산 (0) | 2023.06.02 |
댓글