다중 레이블 분류(Multi-label classification)는 머신 러닝과 패턴 인식 분야에서 사용되는 분류 문제의 한 유형입니다. 이 문제에서 각 데이터 포인트는 하나 이상의 레이블(클래스)에 속할 수 있습니다. 다중 레이블 분류는 다음과 같은 상황에 적용될 수 있습니다:
태그 예측: 웹 페이지, 이미지, 음악, 동영상 등과 같은 매체에 대해 관련된 태그 또는 주제를 예측합니다. 예를 들어, 특정 이미지가 "자연 풍경", "동물", "해변"과 같은 여러 주제 또는 태그에 속할 수 있습니다.
텍스트 분류: 텍스트 문서가 여러 주제 또는 카테고리에 속할 수 있는 경우에 사용됩니다. 뉴스 기사 분류, 자연어 처리 작업에서 각 문장의 감정 분류, 주제 분류 등이 이에 해당합니다.
생물 정보학: 유전자 또는 단백질의 기능을 예측하는 경우, 각각의 기능 또는 역할은 다중 레이블이 될 수 있습니다.
텍스트 태깅: 텍스트 데이터에서 각 단어 또는 어구에 대해 여러 개의 태그를 예측하는 작업으로, 자연어 처리에서 중요한 역할을 합니다.
다중 레이블 분류 문제는 일반적인 분류 문제와는 다르게, 각 데이터 포인트마다 여러 클래스에 대한 이진 분류 문제를 풀어야 합니다. 이는 각 레이블에 대한 확률 값을 독립적으로 예측하는 것을 의미합니다. 예를 들어, 주어진 문서가 "과학", "기술", "스포츠" 세 가지 주제 중 하나 또는 그 이상에 속할 수 있다고 가정하면, 각 주제에 대한 확률 값을 독립적으로 계산하여 예측합니다.
다중 레이블 분류에 사용되는 알고리즘에는 다중 레이블 이진 분류 알고리즘, 다중 출력 분류 알고리즘, One-vs-Rest(OvR) 등이 있습니다. 각 알고리즘은 다중 레이블 문제를 해결하기 위해 데이터와 문제의 특성에 따라 선택됩니다.
정리하면, 다중 레이블 분류는 각 데이터 포인트가 하나 이상의 레이블에 속할 수 있는 분류 문제로, 실제 세계의 다양한 문제에서 활용되는 중요한 머신 러닝 태스크 중 하나입니다.
예측
다중 레이블 분류에서 각 레이블에 대한 예측은 독립적으로 이루어지므로, 모든 레이블이 정확하게 예측되었을 때만 정확도가 100%가 됩니다. 그러나 하나 이상의 레이블이 잘못 예측된 경우에는 정확도가 감소합니다.
따라서 다중 레이블 분류 문제에서는 정확도 외에도 다른 평가 지표를 사용하는 것이 일반적입니다. 주로 사용되는 평가 지표로는 다음과 같은 것들이 있습니다:
정밀도 (Precision): 각 레이블에 대해 정밀도를 계산하여 해당 레이블이 정확하게 예측된 비율을 나타냅니다.
재현율 (Recall): 각 레이블에 대해 재현율을 계산하여 실제로 속한 레이블 중에서 정확하게 예측된 비율을 나타냅니다.
F1 점수 (F1-Score): 정밀도와 재현율의 조화 평균인 F1 점수는 모델의 성능을 종합적으로 평가하는 데 사용됩니다.
Hamming Loss: 다중 레이블 분류에서 예측된 레이블과 실제 레이블 간의 다른 비트의 수를 측정하여 모든 레이블에 대한 오차를 계산합니다.
따라서 정확도는 다중 레이블 분류 문제에서 주의 깊게 고려해야 할 지표가 아니며, 다른 평가 지표를 사용하여 모델의 성능을 평가하는 것이 더 적절합니다.
예제
다음은 케라스를 사용한 멀티 클래스의 조합 예측을 위한 간단한 예제입니다. 이 예제에서는 텍스트 데이터를 기반으로 문서가 어떤 주제들을 다루고 있는지 예측하는 작업을 수행합니다.
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, Flatten
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer
# 가상의 문서 데이터 생성
documents = [
"이 책은 소설입니다. 로맨스, 판타지, 미스터리입니다.",
"과학 책을 읽고 있습니다. 과학, 교육입니다.",
"오늘 날씨 어떤지 궁금합니다. 날씨, 기상입니다.",
"영화를 보러 갈 예정입니다. 영화, 엔터테인먼트입니다."
]
labels = [
["로맨스", "판타지", "미스터리"],
["과학", "교육"],
["날씨", "기상"],
["영화", "엔터테인먼트"]
]
# 토큰화 및 정수 인코딩
max_words = 1000
tokenizer = Tokenizer(num_words=max_words, oov_token='<OOV>')
tokenizer.fit_on_texts(documents)
sequences = tokenizer.texts_to_sequences(documents)
# 패딩
max_sequence_length = 10
sequences = pad_sequences(sequences, maxlen=max_sequence_length, padding='post', truncating='post')
# 다중 레이블 이진화
mlb = MultiLabelBinarizer()
binary_labels = mlb.fit_transform(labels)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(sequences, binary_labels, test_size=0.2, random_state=42)
# 모델 구성
model = Sequential()
model.add(Embedding(input_dim=max_words, output_dim=50, input_length=max_sequence_length))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(len(mlb.classes_), activation='sigmoid')) # 다중 레이블 분류이므로 활성화 함수로 sigmoid 사용
# 모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 모델 훈련
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
# 모델 평가
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Test Loss: {loss:.4f}, Test Accuracy: {accuracy:.4f}")
이 코드는 멀티 클래스의 조합을 예측하기 위한 간단한 신경망 모델을 생성하고 훈련하는 예제입니다. 주어진 문서에 대한 텍스트 데이터를 입력으로 사용하고, 다중 레이블 이진 분류를 수행합니다. 결과로는 다양한 주제 조합을 예측할 수 있는 모델이 생성됩니다.
주의할 점은 이 예제는 간단한 데이터와 모델 구조를 사용한 것이며, 실제 문제에 대응하려면 데이터의 양과 모델 복잡성을 조절해야 할 수 있습니다.
해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.
'AI > Deep-Learning' 카테고리의 다른 글
오토인코더(Autoencoder) (0) | 2023.09.13 |
---|---|
딥 클러스터링(Deep Clustering) (0) | 2023.09.12 |
[Keras] pad_sequences() (0) | 2023.09.12 |
[Keras] 다중 클래스 분류 손실 함수 (0) | 2023.09.12 |
DNN(Digital Neural Network) 용어 정리 (1) | 2023.09.11 |