코딩하는 타코야끼

[ML] 2-3강_모델 추론 본문

[T.I.L] : Today I Learned/Machine Learning

[ML] 2-3강_모델 추론

가스오부시 2023. 5. 28. 02:45
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
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]]
반응형