24.01.11
UnderFit VS. OverFit
- 내 학습 상태: Bais — variance (Under Fit/ Over fit)
- Under Fit: 너무 심플함. 학습량이 적은 상태 ( Simple Model )
- Over fit: 학습량이 과해서 예측이 잘 안되는 상태 ( Complex Model )
- ▶ 새로운 데이터가 등장해도 그것에 대해서도 잘 대응하자가 목표
- 참고)
- Train으로만 학습을 하면 over Fit 된다 → K - Fold CV : 전체데이터 1번 학습이 아닌 데이터를 나누어서 여러번에 거쳐서 학습 시킴
- train 데이터를 k개 집합으로 분리한다 : Random Sampling
- 비율유지하는 Stratified 등
- 데이터 펌핑 repeated 등
- Train으로만 학습을 하면 over Fit 된다 → K - Fold CV : 전체데이터 1번 학습이 아닌 데이터를 나누어서 여러번에 거쳐서 학습 시킴
Scikit-Learn : train_test_split 모듈
- 주요 인자
- test_size
- train_size
- shuffle
- random_state
KNN
현실적으로 많이 쓰이지는 않음
여러개 모델들을 바탕으로 조합해야할 때 (앙상블) 사용하는 알고리즘이 KNN과 유사하게 진행됨
- 분류, 회귀 모두 가능
- 알고리즘이 아닌(최적 파라미터 찾는거 x) → 거리 계산만 하는것
- 단순 계산이지 알고리즘 최적화 과정이 아님
- 단순 계산이기 때문에 생각보다 오래 걸림
- 중요 포인트
- 가깝다 기준을 무엇으로 할까?
- 나와 가까운 몇 명을 기준으로 할까?
- 다수결 등
⇒ 응용) Weighted-KNN
- 동등한 k가 아니라 중요도에 따른 가중치를 고려해서 모델링을 진행
실습
# 패키지
import numpy as np
import pandas as pd
# 샘플데이터
from sklearn.datasets import fetch_openml
# 데이터 셋 분리
from sklearn.model_selection import train_test_split
# 내가 사용할 모델 : knn
from sklearn.neighbors import KNeighborsClassifier
# 4) 평가 지표: accuracy
from sklearn.metrics import accuracy_score
- 손글씨 데이터(mnist) 가져오기
mnist = fetch_openml( "mnist_784", version=1, as_frame=False)
X = mnist["data"]
y = mnist['target']
X.shape
y.shape
# 데이터 분리: train_test_split
train_data, test_data, train_label, test_label = train_test_split(
X, # 문제들
y, # 정답지
test_size=0.25, # 분리 비율
random_state=1234 # 시드값 설정
)
len(train_data)
len(test_data)
# 1개 데이터 샘플 확인
train_data[0].shape
모델을 돌리기 전에 체크할 2가지
1) 결측치 여부
2) 전부 수치형 데이터인지 확인
# 정답지 분포 확인
np.unique(train_label, return_counts=True)
# 모델 불러오기
knn = KNeighborsClassifier( n_neighbors = 5,
n_jobs=-1)
# 모델 학습
knn.fit( train_data, train_label)
# 모델 예측치 확인
pred = knn.predict(test_data)
# 모델 평가
accuracy_score(test_label, pred)
위와 같이 간단한 baseline의 모델 성능을 확인하고
HPT 단계를 거치면서 세부적인 모델 성능 조정 및 향상 작업을 진행한다.
# 모델 성능을 높이기 위한 교차 검증 진행
# k-fold cross validation
from sklearn.model_seleciton import cross_val_score
# Hyper Parameter Tunning ! HPT
neighbors = [i for i in range(1,10) if i%2 ==1] # 홀수 값으로 임의 지정
cv_scores = []
# 테스트해볼 파라미터들 롤링
for k in neighbors:
# 모델준비
knn = KNeighborsClassifier(n_neighbors=k, n_jobs=-1)
# k-fold CV: 어떤 모델, 문제/정답, 몇 등분, 채점기준,
scores = cross_val_score(knn, train_data, train_label, cv=10, scoring='accuracy')
cv_scores.append(scores.mean())
print(str(k)+ 'k values Accuracy :', scores.mean())
'ASAC 빅데이터전문가과정 > ML' 카테고리의 다른 글
ASAC 36일차_머신러닝 6일차 (0) | 2024.08.24 |
---|---|
ASAC 35일차_머신러닝 5일차 (0) | 2024.08.22 |
ASAC 34일차_머신러닝 4일차 (0) | 2024.08.21 |
ASAC 29일차_머신러닝 2일차 (0) | 2024.08.21 |
ASAC 28일차_머신러닝 1일차 (0) | 2024.08.13 |