본문 바로가기

Python/[머신러닝]

3주차: 분류

728x90
반응형
이번 포스팅에서는 분류 시스템을 집중적으로 다뤄보도록 한다.

3.1 MNIST

여기서는 고등학생과 미국 인구 조사국 직원들이 손으로 쓴 70,000개의 작은 숫자 이미지로 구성된 MNIST 데이터셋을 사용한다. 각 이미지에는 어떤 숫자인지를 나타내는 레이블이 포함되어 있다.

 

사이킷런(Scikit-learn)에서 제공하는 여러 헬퍼 함수를 사용하여 잘 알려진 데이터셋을 쉽게 내려받을 수 있다. MNIST도 그중 하나다. 다음은 OpenML.org에서 MNIST 데이터셋을 내려받는 코드이다.

from sklearn.datasets import fetch_openml
mnist = fetch_openml(’mnist_784’, as_frame=False)

 

sklearn.datasets 패키지에 있는 함수는 대부분 세 가지 종류로 나뉜다.

  1. fetch 함수: fetch_openml()과 같이 실제 데이터를 다운로드하기 위한 함수이다.
  2. load 함수: 사이킷런에 번들로 포함된 소규모 데이터셋을 로드하기 위한 함수로, 인터넷에서 데이터를 다운로드할 필요 없이 바로 사용할 수 있다.
  3. make 함수: 테스트에 유용한 가짜 데이터를 생성하기 위한 함수이다. 생성된 데이터셋은 일반적으로 넘파이 배열이며, 입력 데이터와 타깃 데이터를 포함한 (X, y) 튜플로 반환된다.

일부 데이터셋은 sklearn.utils.Bunch 객체로 반환된다. 이 객체는 다음과 같은 항목을 속성으로 참조할 수 있는 딕셔너리 형태를 띤다.

  • DESCR: 데이터셋 설명
  • data: 입력 데이터, 일반적으로 2D 넘파이 배열
  • target: 레이블, 일반적으로 1D 넘파이 배열

MNIST 데이터셋은 이미지 데이터이므로 데이터프레임 형식이 적합하지 않다. 따라서, as_frame=False로 지정하여 넘파이 배열로 데이터를 받아야 한다.

MNIST 데이터셋에는 총 70,000개의 이미지가 있으며, 각 이미지는 784개의 특성으로 구성되어 있다. 이는 이미지가 28x28 픽셀로 이루어져 있기 때문이다. 각 특성은 픽셀의 밝기를 나타내며, 값은 0(흰색)에서 255(검은색) 사이이다.

 

데이터셋에서 하나의 이미지를 시각적으로 확인하려면, 해당 샘플의 특성 벡터를 28x28 크기의 배열로 변환한 뒤, Matplotlibimshow() 함수를 사용하면 된다. 이때, cmap="binary" 설정을 통해 0은 흰색, 255는 검은색으로 표현되는 흑백 컬러 맵을 적용할 수 있다.

위 이미지를 넣어보면 아래와 같은 결과를 얻을 수 있다.

>>> y[0]
’ 5 ’

 

이때 데이터를 자세히 조사하기 전에 항상 태스트 세트를 만들고 따로 떼어놓아야한다.

 

훈련 세트는 이미 무작위로 섞여 있어, 교차 검증을 수행할 때 각 폴드가 유사한 구성을 갖도록 해준다. 이는 특정 숫자가 한 폴드에서 빠지지 않도록 보장하는 중요한 과정이다. 또한, 일부 학습 알고리즘은 훈련 샘플의 순서에 민감하기 때문에 비슷한 샘플이 연속으로 제공될 경우 성능 저하가 발생할 수 있다. 데이터를 미리 섞어 주면 이러한 문제를 예방할 수 있다.

3.2 이진분류기훈련

 

문제를 간단하게 만들어서 특정 숫자, 예를 들어 숫자 5만 식별하는 작업을 진행해 보자. 이 '5-감지기'는 숫자 5와 그렇지 않은 숫자를 구분하는 이진 분류기이다. 이를 위해 타깃 벡터를 생성하여, '5'와 '5 아님'의 두 클래스를 나눌 것이다.

 

y_train_5 = (y_train == '5')
y_test_5 = (y_test =='5')

 

이제 분류 모델을 선택하고 훈련을 시작해 보자. 먼저, 사이킷런 의 SGDClassifier 클래스를 사용해 확률적 경사 하강법(SGD)을 기반으로 하는 분류기를 적용해 볼 수 있다. 이 분류기의 주요 장점은 매우 큰 데이터셋을 효율적으로 처리할 수 있다는 점이다. SGD는 한 번에 하나씩 데이터를 처리할 수 있어, 특히 온라인 학습에 적합하다. 이제 SGDClassifier를 사용하여 전체 훈련 세트를 기반으로 모델을 훈련시켜 보겠다.

from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier(random_state= 42)
sgd_clf .fit (X_trainJ y_train_5)

 

이제 훈련된 모델을 사용하여 숫자 5를 감지해 보자.

>>> sgd_clf.predict([some_digit])
array([ True])

 

분류기가 이 이미지를 숫자 5로 예측했고, 결과는 정확했다.

이 샘플에 대해서는 모델이 옳은 판단을 내린 것으로 확인할 수 있다. 그렇다면 이제 이 모델의 전반적인 성능을 평가해 보자.

3.3 성능측정

교차 검증은 모델의 성능을 평가하는 매우 효과적인 방법이다.

 

여기서는 cross_val_score() 함수를 사용하여 3개의 폴드를 가진 k-폴드 교차 검증을 적용해 SGDClassifier 모델을 평가해 보겠다.

 

k-폴드 교차 검증이란 훈련 데이터를 k개의 폴드로 나누고, 매번 다른 폴드를 평가용으로 남겨둔 채 나머지 폴드로 모델을 훈련하는 과정을 k번 반복하는 방법이다).

from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

# StratifiedKFold 객체 생성
skfolds = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)

# 데이터셋이 미리 섞여 있지 않다면 shuffle=True를 추가하세요.
for train_index, test_index in skfolds.split(X_train, y_train_5):
    # 분류기 복제
    clone_clf = clone(sgd_clf)
    
    # 학습용 데이터 및 타겟 추출
    X_train_folds = X_train[train_index]
    y_train_folds = y_train_5[train_index]
    
    # 테스트용 데이터 및 타겟 추출
    X_test_fold = X_train[test_index]
    y_test_fold = y_train_5[test_index]
    
    # 모델 학습
    clone_clf.fit(X_train_folds, y_train_folds)
    
    # 예측
    y_pred = clone_clf.predict(X_test_fold)
    
    # 정확도 계산
    n_correct = sum(y_pred == y_test_fold)
    print(n_correct / len(y_pred))  # 정확도 출력

 

모든 교차 검증 폴드에서 정확도(정확한 예측의 비율)가 95% 이상으로 나온 것을 확인가능하다.

from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score

# 더미 분류기 생성 (전략을 지정하지 않으면 기본적으로 가장 빈도가 높은 클래스만 예측)
dummy_clf = DummyClassifier(strategy="most_frequent")

# 모델 학습
dummy_clf.fit(X_train, y_train_5)

# 예측 결과
y_pred = dummy_clf.predict(X_train)

# False가 출력됩니다. 즉, True로 예측된 것이 없습니다.
print(any(y_pred))  # 전체가 False일 경우 False가 출력됨

# 정확도 계산
accuracy = accuracy_score(y_train_5, y_pred)

# 정확도 출력
print("Accuracy:", accuracy)

 

결과는 예상대로 정확도가 90% 이상으로 나왔다. 이는 이미지 중 약 10%만이 숫자 5이기 때문에, 모든 이미지를 '5 아님'으로 예측하는 것만으로도 90%의 정확도를 달성할 수 있기 때문이다. 마치 예언자처럼 높은 정확도를 얻었지만, 이것은 분류기의 실제 성능을 제대로 반영하지 않는다.

 

이 예시는 왜 정확도를 성능 평가 지표로 선호하지 않는지를 잘 보여준다. 특히, 클래스 간의 데이터 불균형이 심한 경우에는 더욱 그렇다. 따라서 분류기의 성능을 평가하기 위해서는 오차 행렬(confusion matrix)을 살펴보는 것이 더 좋은 방법이다.

3.3.2 오차행렬

오차 행렬의 핵심 개념은 각 클래스 A와 B 쌍에 대해, 클래스 A의 샘플이 얼마나 자주 클래스 B로 잘못 분류되었는지를 세는 것이다. 예를 들어, 분류기가 숫자 8을 0으로 잘못 예측한 횟수를 알고 싶다면, 오차 행렬에서 8번 행과 0번 열을 확인하면 된다.

 

오차 행렬을 만들기 위해서는 먼저 실제 타깃과 비교할 수 있는 예측값이 필요하다.

 

이때, 테스트 세트를 사용하고 싶을 수 있지만, 테스트 세트는 프로젝트의 마지막 단계에서만 사용해야 한다는 점을 기억하자(테스트 세트는 최종적으로 모델이 완성된 후에만 사용한다). 대신, 우리는 cross_val_predict() 함수를 사용할 수 있다.

from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf) X_train) y_train_5) cv= 3)

 

cross_val_predict() 함수는 cross_val_score()와 비슷하게 k-폴드 교차 검증을 수행하지만, 평가 점수를 반환하는 대신 각 테스트 폴드에서 예측한 결과를 반환해 준다. 이 과정에서 얻는 예측값은 모델이 학습하는 동안 보지 못한 샘플에 대한 것이므로, 모든 훈련 샘플에 대해 '깨끗한' 예측을 얻게 된다.

 

이제 confusion_matrix() 함수를 사용해 오차 행렬을 생성할 수 있다. 타깃 클래스인 y_train_5와 예측된 값 y_train_pred를 넣어 호출하면 오차 행렬이 만들어진다.

>>> from sklearn.metrics import confusion_matrix
>>> cm = confusion_matrix(y_train_5) y_train_pred)
>>> cm
array([[53892 687], [ 1891, 3530]])

 

오차 행렬에서 행은 실제 클래스를, 열은 예측한 클래스를 나타낸다. 첫 번째 행은 '5 아님' 이미지를 의미하며, 즉 음성 클래스(negative class)이다. 여기서 53,892개의 샘플은 '5 아님'으로 정확하게 분류되었으며, 이를 진짜 음성(true negative)이라고 부른다.

반면, 687개의 샘플은 '5'로 잘못 예측되었는데, 이는 거짓 양성(false positive) 또는 1종 오류(Type I error)라고 한다.

 

두 번째 행은 '5' 이미지에 해당하는 양성 클래스(positive class)이다. 1,891개의 샘플은 '5 아님'으로 잘못 분류되었으며, 이를 거짓 음성(false negative)이라고 부른다.

나머지 3,530개의 샘플은 '5'로 정확히 분류되었고, 이는 진짜 양성(true positive)이다.

이론적으로 완벽한 분류기는 진짜 양성과 진짜 음성만 존재해야 하므로, 오차 행렬에서는 주대각선(왼쪽 위에서 오른쪽 아래로)만 0이 아닌 값을 갖게 된다.

정밀도는 모델이 양성 클래스라고 예측한 것들 중에서 실제로 양성인 샘플의 비율을 나타낸다. 즉, 양성 예측이 얼마나 정확한지를 평가하는 척도이다. 높은 정밀도는 거짓 양성(False Positive)이 적다는 것을 의미한다. 예를 들어, 모델이 '5'라고 예측한 이미지들 중 실제로 '5'인 이미지의 비율이 정밀도가 된다.

재현율은 실제 양성 샘플 중에서 모델이 양성으로 정확하게 예측한 비율을 의미한다. 즉, 모델이 실제 양성을 얼마나 잘 찾아냈는지를 평가하는 지표이다. 높은 재현율은 거짓 음성(False Negative)이 적다는 뜻이다. 예를 들어, 모든 '5' 이미지를 놓치지 않고 얼마나 많이 찾아냈는지가 재현율에 해당한다.

 

이 두 지표는 서로 상충하는 경향이 있다. 즉, 정밀도를 높이려면 재현율이 낮아질 수 있고, 반대로 재현율을 높이면 정밀도가 낮아질 수 있다. 이 때문에 모델을 평가할 때는 상황에 맞게 두 지표 간의 균형을 고려하는 것이 중요하다.

3.3.3 정밀도와 재현율

머신러닝에서 F1 점수(F1 score)는 정밀도와 재현율을 하나의 숫자로 결합하여 성능을 평가할 때 유용하다. 특히, 두 개의 분류기를 비교할 때 더욱 그렇다. F1 점수는 정밀도와 재현율의 조화 평균(harmonic mean)으로 계산된다.

일반적인 평균은 모든 값을 동일하게 취급하지만, 조화 평균은 상대적으로 낮은 값에 더 큰 가중치를 둔다. 그 결과, F1 점수를 높이려면 정밀도와 재현율이 모두 고르게 높아야 한다. 즉, 둘 중 하나라도 낮으면 F1 점수는 크게 줄어든다. 그래서 F1 점수는 두 지표의 균형을 고려해야 할 때 좋은 선택이다.

 

F1 점수를 계산하려면 fl_score() 함수를 호출하면 된다.

>>> from sklearn.metrics import f1_score
>>> f1_score(y_train_5, y_train_pred)

 

F1 점수는 정밀도와 재현율이 비슷한 분류기에서 높게 나타나지만, 항상 바람직한 것은 아니다. 특정 상황에서는 정밀도나 재현율 중 하나가 더 중요할 수 있다. 예를 들어, 이메일 스팸 필터를 만든다면, 중요한 메일이 스팸으로 분류되지 않도록 정밀도가 더 중요한 경우가 많다. 반면, 질병 진단 시스템에서는 질병이 있는 사람을 놓치지 않는 것이 중요하므로 재현율이 더 중요하다.

 

그러나 두 지표는 상충하는 관계가 있어, 정밀도를 높이면 재현율이 떨어지고, 재현율을 높이면 정밀도가 떨어지는 정밀도-재현율 트레이드오프가 발생한다.

3.3.4 정밀도/재현율 트레이드오프

SGDClassifier는 각 샘플에 점수를 부여하고, 그 점수가 임곗값을 넘으면 양성 클래스로 분류한다. 임곗값을 올리면 정밀도는 높아지지만 재현율은 낮아지고, 임곗값을 내리면 재현율은 높아지지만 정밀도는 떨어진다. 이는 정밀도-재현율 트레이드오프의 대표적인 예시이다.

사이킷런에서는 임곗값을 직접 설정할 수 없지만, 예측에 사용된 점수는 확인할 수 있다. predict() 대신 decision_function() 메서드를 호출하면 각 샘플에 대한 점수를 얻을 수 있으며, 이를 기반으로 임곗값을 설정하여 예측을 수정할 수 있다.

>>> y_scores = sgd_clf .decision_function([some_digit])
>>> y_scores 
array([2164.22030239])
>>> threshold = 0
>>> y_some_digit_pred = (y_scores > threshold)
>>> y_some_digit_pred
array([True])

 

기본적으로 SGDClassifier는 임곗값이 0으로 설정되어 있어 predict()와 동일한 결과를 반환한다. 그러나 임곗값을 높이면 재현율이 감소하는 현상이 발생한다. 예를 들어, 이미지가 실제로 숫자 5일 때, 임곗값이 0이면 분류기가 이를 올바르게 감지하지만, 임곗값을 3,000으로 높이면 해당 샘플을 놓치게 된다.

 

그렇다면 적절한 임곗값을 어떻게 정할 수 있을까?

 

먼저, cross_val_predict() 함수를 이용해 훈련 세트의 모든 샘플에 대한 점수를 얻어야 한다. 이때, 예측 값 대신 결정 점수를 반환하도록 설정해야 한다. 이후, precision_recall_curve() 함수를 사용해 모든 가능한 임곗값에 대해 정밀도와 재현율을 계산할 수 있다. 이 함수는 마지막에 정밀도를 1로, 재현율을 0으로 추가해 무한 임곗값의 경우까지 고려한 결과를 제공한다.

 

from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
...이하 생략

 

이제 Matplotlib을 사용하여 임곗값에 따른 정밀도와 재현율의 변화를 시각화할 수 있다.

임곗값을 3,000으로 설정했을 때의 그래프는 아래와 같다.

 

임곗값을 3,000으로 설정했을 때, 정밀도는 약 90%이고 재현율은 약 50%이다. 이처럼 정밀도와 재현율 간의 균형을 찾는 것이 중요하다.

 

좋은 정밀도/재현율 트레이드오프를 선택하는 또 다른 방법은 재현율에 대한 정밀도 곡선을 그리는 것이다. 이 곡선은 임곗값을 변화시키면서 정밀도와 재현율이 어떻게 변하는지를 시각적으로 보여주기 때문에, 특정 임곗값에서 두 지표의 관계를 명확하게 파악할 수 있다. 그래프 상에서 적절한 지점을 선택하면, 특정 상황에서 원하는 성능을 가진 모델을 설정하는 데 유용하다.

 

앞에서와 동일한 임곗값을 사용하여 재현율에 대한 정밀도 곡선을 그려보면, 각 지표의 변화에 따라 최적의 트레이드오프를 결정할 수 있다.

재현율이 80%에 가까워지면 정밀도가 급격히 떨어지기 때문에, 그 직전 지점에서 정밀도와 재현율의 균형을 맞추는 것이 좋다. 예를 들어, 재현율이 60% 일 때가 적합할 수 있다. 만약 정밀도 90%를 목표로 한다면, 정밀도가 최소 90%에 도달하는 가장 낮은 임곗값을 argmax() 메서드로 찾아낼 수 있다.

3.3.5 ROC 곡선

수신기 조작 특성(ROC, Receiver Operating Characteristic) 곡선은 분류 문제에서 널리 사용되는 평가 도구이다. ROC 곡선은 정밀도-재현율 곡선과 매우 유사하지만, ROC는 정밀도 대신 거짓 양성 비율(FPR, False Positive Rate)에 대한 진짜 양성 비율(TPR, True Positive Rate)을 나타낸다.

 

거짓 양성 비율(FPR)은 음성 클래스(실제로 해당 클래스가 아닌 샘플)를 잘못 양성으로 분류한 비율을 의미한다. FPR은 1에서 진짜 음성 비율(TNR, True Negative Rate), 즉 특이도(specificity)를 뺀 값으로 계산한다. 반대로, 진짜 양성 비율(TPR)은 실제 양성 샘플을 정확히 양성으로 분류한 비율로, 이는 재현율(recall)과 동일하다.

 

따라서 ROC 곡선은 재현율(민감도)에 대한 1-특이도(거짓 양성 비율)의 그래프가 된다. 이 ROC 곡선을 그리기 위해서는 먼저 roc_curve() 함수를 사용하여 다양한 임곗값에 대해 TPR과 FPR을 계산해야 한다.

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

 

각 임곗값에 대해 계산한 TPR과 FPR을 그래프로 나타내면 ROC 곡선을 그리면. X축은 거짓 양성 비율(FPR), Y축은 재현율(TPR)을 나타내며, 곡선의 모양에 따라 모델의 분류 성능을 평가할 수 있다. 이상적인 ROC 곡선은 좌상단에 가까운 모양을 가지며, 이는 재현율이 높고 거짓 양성 비율이 매우 낮음을 의미한다.

  • 곡선의 위치: ROC 곡선이 좌상단에 가까울수록 모델의 성능이 우수하다. 이는 재현율이 높고, 거짓 양성 비율이 낮다는 것을 의미한다.
  • 대각선과의 비교: ROC 곡선이 45도 대각선에 가까울수록 모델의 성능은 랜덤 추측과 유사해지며, 이 경우 분류 성능이 낮다는 것을 의미한다. 반면, 곡선이 대각선에서 멀어질수록 성능이 뛰어나다는 것을 나타낸다.
  • AUC (Area Under the Curve): ROC 곡선 아래 면적(AUC)은 모델 성능의 종합적인 척도이다. AUC 값이 1에 가까울수록, 모델이 양성과 음성 샘플을 잘 구분한다는 뜻이다.

3.5 오류분석

실제 프로젝트에서 머신러닝을 적용할 때는 체크리스트를 따르고, 데이터 준비와 여러 모델 실험을 통해 최적의 모델을 찾은 후, 하이퍼파라미터를 세밀하게 조정하는 과정을 거친다. 

 

모델의 성능을 개선하는 한 가지 방법은 오차 행렬(confusion matrix)을 분석하는 것이다. cross_val_predict() 함수로 예측을 만들고, confusion_matrix() 함수를 사용해 예측 결과와 실제 레이블을 비교하면 오차 행렬을 얻을 수 있다. 하지만 다중 클래스(예: 10개의 클래스)가 있을 경우, 숫자만으로는 행렬을 분석하기가 어렵다.

 

이때, ConfusionMatrixDisplay.from_predictions() 함수를 사용해 오차 행렬을 시각적으로 표현하면, 컬러 그래프를 통해 오류의 종류를 더 쉽게 분석할 수 있다.

from sklearn.metrics import ConfusionMatrixDisplay
y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv= 3)
ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred)
plt.show()

ConfusionMatrixDisplay.from_predictions(y_train, y_train_pred ,normalize= "true", values_format=".Ø%")
plt.show()

 

이렇게 하면 오차 행렬의 왼쪽 그래프가 생성된다. 이 행렬은 대체로 양호한 결과를 보여주며, 대부분의 이미지가 주대각선에 위치해 있어 올바르게 분류되었음을 나타낸다. 그러나 5번 행과 5번 열에서 약간 더 많은 오류가 발생했음을 볼 수 있는데, 이는 모델이 숫자 5를 분류하는 데 어려움을 겪거나 데이터에서 숫자 5가 적기 때문일 수 있다.

 

이를 해결하기 위해, 각 셀의 값을 해당 클래스의 총 이미지 수로 나눠 오차 행렬을 정규화하는 것이 중요하다. 이를 위해 normalize="true" 옵션을 사용하면 간편하게 작업할 수 있으며, values_format="1.0%"로 지정하면 소수점 없는 백분율로 표시할 수 있다.

 

오차 행렬을 통해 분류기의 오류를 더 명확히 파악할 수 있다. 예를 들어, 많은 이미지가 숫자 8로 잘못 분류되는 것을 확인할 수 있으며, 이는 대부분의 클래스에서 가장 빈번한 오류이다.

 

하지만 백분율을 해석할 때 주의해야 하며, 그래프는 각 클래스에서 발생한 오류 중 어느 클래스에 잘못 분류되었는지를 보여준다. 또한, 오차 행렬을 열 단위로 정규화하면 잘못된 예측 비율을 더 정확하게 분석할 수 있다. 성능을 개선하려면 8로 잘못 분류되는 문제를 해결해야 하며, 이를 위해 더 많은 훈련 데이터를 추가하거나 이미지 전처리 기법을 적용할 수 있다.

3.6 다중 레이블 분류

다중 레이블 분류는 한 개의 샘플에 대해 여러 개의 레이블을 예측하는 문제를 말한다. 일반적인 분류 문제에서는 샘플이 하나의 레이블에만 속하지만, 다중 레이블 분류에서는 한 샘플이 여러 클래스에 동시에 속할 수 있다.

 

예를 들어, 이미지 분류에서 하나의 사진이 동시에 '강아지'와 '실외'라는 두 가지 레이블을 가질 수 있다. 다중 레이블 분류는 각각의 레이블에 대해 독립적으로 이진 분류를 수행하여, 여러 레이블을 동시에 예측할 수 있는 모델을 만든다.

 

사이킷런 의 MultiLabelBinarizer 같은 도구를 사용하면 데이터를 적절하게 변환하여 다중 레이블 분류를 수행할 수 있다. 모델 성능을 평가할 때는 정확도(accuracy)나 F1 점수 대신, 각 레이블에 대한 평균적인 성능을 측정하는 방식이 유용하다.

3.7 다중 출력 분류

다중 출력 분류는 다중 레이블 분류의 확장판으로, 여러 레이블을 예측할 뿐만 아니라 각 레이블이 여러 값(범주)을 가질 수 있는 문제를 다룬다. 즉, 다중 출력 분류는 한 샘플에 대해 여러 개의 값을 예측해야 한다.

 

예를 들어, 이미지 노이즈 제거 작업을 생각해 보자. 이미지의 각 픽셀에 대해 노이즈가 제거된 픽셀 값을 예측해야 한다. 이때 각 픽셀은 하나의 레이블처럼 작동하고, 모델은 이 모든 픽셀에 대해 출력을 만들어야 한다.

 

다중 출력 분류는 각각의 출력에 대해 독립적인 분류 또는 회귀 문제를 해결하는 방식으로 진행된다. 모델은 각 출력에 대해 별도로 예측을 수행하며, 이를 통해 여러 출력 값을 동시에 생성할 수 있다.

 

사이킷런에서는 다중 출력 문제를 다룰 수 있는 다양한 알고리즘을 제공하며, 이를 통해 여러 레이블과 출력을 동시에 처리하는 모델을 구현할 수 있다.

728x90
반응형
댓글