일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 통계학
- 스터디노트
- 재귀함수
- Machine Learning
- 기계학습
- 문제풀이
- tree.fit
- Slicing
- DataFrame
- matplotlib
- 등비수열
- python
- Folium
- 순열
- INSERT
- 조합
- SQL
- 머신러닝
- 리스트
- pandas
- pandas 메소드
- 자료구조
- plt
- MacOS
- 등차수열
- barh
- maplotlib
- pandas filter
- 파이썬
- numpy
Archives
- Today
- Total
코딩하는 타코야끼
[ML] 2-3강_모델 추론 본문
728x90
반응형
1. 그런데 이 결과가 맞을까?
- 모델이 추론한 결과가 맞다는 것을 어떻게 보증할 수 있을까?
- 모델을 최종 서비스에 적용하기 전에 모델의 성능을 확인하는 작업이 필요하다.
📍머신러닝 프로세스
🌓 훈련데이터셋과 평가(테스트)데이터 분할
- 위의 예는 우리가 만든 모델이 성능이 좋은 모델인지 나쁜 모델인지 알 수 없다.
- 전체 데이터 셋을 두개의 데이터셋으로 나눠 하나는 모델을 훈련할 때 사용하고 다른 하나는 그 모델을 평가할 때 사용한다.
- 보통 훈련데이터와 테스트데이터의 비율은 8:2 또는 7:3 정도로 나누는데 데이터셋이 충분하다면 6:4까지도 나눈다.
💡 데이터셋 분할시 주의
- 분류 문제의 경우 각 클래스(분류대상)가 같은 비율로 나뉘어야 한다.
🌓 scikit-learn의 train_test_split( ) 함수를 이용해 iris 데이터셋 분할
- train_test_split() : 하나의 데이터셋을 두개의 세트로 분할 하는 함수
from sklearn.datasets import load_iris # Iris dataset을 제공하는 함수
from sklearn.model_selection import train_test_split # Dataset을 분리하는 함수
from sklearn.tree import DecisionTreeClassifier # DecisionTree의 분류 모델을 제공하는 클래스
from sklearn.metrics import accuracy_score # 정확도 (몇개 맞았는지.) 평가 지표함수
import numpy as np
iris = load_iris()
X = iris.data
y = iris.target
- X : input data == Features == 독립변수
- y : output data == Labels == Targets == 종속변수
# X, y(전체 데이터셋)을 Train dataset 과 Test dataset으로 분리.
X_train, X_test, y_train, y_test = train_test_split(X, # 전체데이터셋 중 Features, input
y, # 전체데이터셋 중 Labels, output(target)
test_size = 0.2,# (20%) // 전체중 test set의 비율 (기본값: 0.25)
stratify = y, # 전체 데이터셋의 출력 클래스의 비율과 동일한 비율로 나눠지도록 한다.분류 Dataset을 나눌때 필수, (회귀는 하지 않음.)
shuffle = True, # 데이터셋을 나누기 전에 섞는지(랜덤) 여부: True - 섞는다.(기본값), False - 안 섞는다.
random_state = 0 # random seed 값.
)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
print(X.shape, y.shape)
>>>
(120, 4) (30, 4) (120,) (30,)
(150, 4) (150,)
150 * 0.8
>>>
120.0
np.unique(y, return_counts = True)
>>>
(array([0, 1, 2]), array([50, 50, 50]))
np.unique(y_train, return_counts = True) # 80%
>>>
(array([0, 1, 2]), array([40, 40, 40]))
np.unique(y_test, return_counts = True) # 20%
>>>
(array([0, 1, 2]), array([10, 10, 10]))
🌓 모델생성
- DecisionTreeClassifier(max depth = 1, random_state = 0)
- 이와같이 max depth는 "Hyper parameter"라 불린다.
- 성능에 영향을 주는 paramete
- 이와같이 max depth는 "Hyper parameter"라 불린다.
tree = DecisionTreeClassifier(random_state = 0)
🌓 모델 학습
tree.fit(X_train, y_train)
🌓 평가
- 머신러닝 평가지표 함수들은 sklearn.metrics 모듈에 있다.
- 정확도(accuracy)
- accuracy_score() 함수 이용
- 전체 예측한 개수 중 맞춘 개수의 비율
- 전체중 몇개가 일치하는지 비율 // 1.0 = 100%
- accuracy_score(정답, 모델의 예측결과)
pred_train = tree.predict(X_train)
pred_test = tree.predict(X_test)
acc_train = accuracy_score(y_train, pred_train)
acc_test = accuracy_score(y_test, pred_test)
print(f'Train set 예측결과의 정확도: {acc_train}')
print(f'Test set 예측결과의 정확도: {acc_test}')
>>>
Train set 예측결과의 정확도: 1.0
Test set 예측결과의 정확도: 0.9666666666666667
🌓 혼동행렬 (Confusion Matrix) 을 통해 확인
- 모델이 예측한 결과와 실제 정답간의 개수를 표로 제공
- 분류의 평가 지표로 사용된다.
- sklearn.metrics 모듈의 confusion_matrix() 함수 이용
- 결과 ndarray 구조
- axis=0의 index: 정답(실제)의 class
- axis=1의 index: 예측결과의 class
- value: 개수(각 class별 정답/예측한 개수)
from sklearn.metrics import confusion_matrix
train_cm = confusion_matrix(y_train, pred_train) # (정답, 모델의 예측결과)
test_cm = confusion_matrix(y_test, pred_test)
print(train_cm)
print(test_cm)
>>>
[[40 0 0]
[ 0 40 0]
[ 0 0 40]],
[[10 0 0]
[ 0 10 0]
[ 0 1 9]]
반응형
'[T.I.L] : Today I Learned > Machine Learning' 카테고리의 다른 글
[ML] 2-2강_머신러닝을 이용한 예측 (0) | 2023.05.28 |
---|---|
[ML] 2-1강_머신러닝 분석 - Iris 분석 (0) | 2023.05.28 |
[ML] 1강_머신러닝 개요 (0) | 2023.05.28 |