TensorFlow와 W&B Weave를 활용한 텍스트 분류
TensorFlow와 W&B Weave를 활용해 텍스트 분류 모델을 체계적으로 평가하고 최적화하여 비정형 데이터에서 견고하고 신뢰할 수 있는 인사이트를 도출하는 방법을 알아보세요. 이 글은 AI 번역본입니다. 오역이 의심되는 부분이 있으면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment
텍스트 데이터는 어디에나 있지만, 비정형 형식 때문에 분석과 해석이 자주 복잡해집니다. 자연어 처리 (NLP)인공지능의 한 분야인 는 기계가 방대한 텍스트 정보를 효율적으로 이해하고 처리할 수 있도록 함으로써 이러한 문제를 극복하도록 돕습니다.
자연어 처리의 핵심 과제인 텍스트 분류는 지도 학습 보지 못한 텍스트 문서의 레이블을 자동으로 분류하거나 예측하는 방법. 기업은 다음과 같은 다양한 활용 사례에 텍스트 분류를 적용합니다. 감성 분석, 주제 분류그리고 스팸 감지에 이르기까지 적용되어 워크플로를 단순화하고 의사 결정의 정확도를 높입니다.

출처: Author
목차
텍스트 분류란 무엇인가요?
텍스트 분류는 자연어 처리(NLP) 분야에서 핵심적인 작업으로, 다양한 적용 사례를 위해 텍스트 데이터를 자동으로 분석하고 범주화할 수 있도록 해줍니다.
본질적으로 텍스트 분류는 문서의 내용에 따라 미리 정의된 범주나 레이블을 텍스트 문서에 부여하는 작업을 의미합니다. 이 과정은 기계가 텍스트 정보를 이해하고 그에 기반해 의사 결정을 내리도록 하며, 이는 사람이 글을 분류하고 정리하는 방식과 유사합니다.

텍스트 분류의 중요성은 다양한 비즈니스 과제를 해결하는 데 있어 높은 활용도로 더욱 분명해집니다. 감성 분석부터 주제 분류, 스팸 감지까지 텍스트 분류는 텍스트 데이터에서 가치 있는 인사이트를 추출하는 데 필요한 기초 도구로 기능합니다.
머신러닝 기법을 활용하면 텍스트 분류 모델은 레이블이 달린 학습 데이터로부터 학습하여 텍스트의 특정 패턴을 해당 범주와 연결합니다. 이러한 학습 과정을 통해 모델은 보지 못한 텍스트 문서도 높은 정확도로 분류할 수 있게 되어, 다양한 작업에서 자동화와 효율성을 실현합니다.
텍스트 분류의 과제

텍스트 분류는 텍스트 데이터 분석을 크게 자동화하고 단순화하지만, 다음과 같은 핵심 과제들을 반드시 고려해야 합니다:
- 불균형 데이터: 일부 범주는 과도하게 대표되어 모델 예측에 편향을 유발할 수 있습니다. 모든 클래스에서 신뢰할 수 있는 정확도를 달성하려면 효과적인 균형화 기법이 필수적입니다.
- 문맥적 해석: 모델은 애매함, 풍자, 구어체와 같은 미묘한 의미를 파악하는 데 자주 어려움을 겪습니다. 정확한 분류를 위해서는 고도화된 문맥 이해가 필요합니다.
- 대규모 데이터셋 관리: 텍스트 데이터셋의 방대한 규모와 복잡성은 저장, 처리, 그리고 계산 자원 측면에서 상당한 난관을 야기합니다. 대규모 데이터를 효과적으로 다루기 위해서는 효율적인 데이터 관리와 확장 가능한 처리 기법이 매우 중요합니다.
- 특징 공학의 복잡성: 원시 텍스트 데이터에서 유의미한 특징을 선별하고 표현하는 일은 매우 중요하지만 동시에 어렵습니다. 특히 비정형 텍스트의 특성을 고려할 때, 적절하게 설계된 특징은 분류 성능을 향상시키는 데 핵심적입니다.
- 도메인 특화 문제: 의학이나 법률처럼 특수화된 분야는 고유한 용어와 전문 용례가 존재하므로, 정확한 텍스트 분류를 위해서는 해당 분야를 겨냥한 데이터셋과 도메인 지식이 필수적입니다.
이러한 과제를 성공적으로 해결하려면 깊은 도메인 전문성, 정교한 머신러닝 기법, 세심한 데이터 전처리를 결합해야 합니다. 이 장애물을 극복하면 견고한 텍스트 분류 모델을 구축할 수 있으며, 궁극적으로 통찰력 있고 정확한 데이터 기반 의사결정을 가능하게 합니다.
텍스트 분류를 위한 모델 아키텍처 탐구
텍스트 분류에는 다양한 머신러닝 모델이 사용되며, 각 모델은 고유한 아키텍처와 역량을 갖추고 있습니다. 아래는 일반적으로 널리 사용되는 일부 모델에 대한 개요입니다:
나이브 베이즈

설명
나이브 베이즈는 특징들 간의 독립성을 가정하고 베이즈 정리에 기반한 확률적 분류기입니다. 구조가 단순하고 특징 독립성이라는 “나이브”한 가정을 사용함에도 불구하고, 텍스트 분류 과제에서 놀랄 만큼 좋은 성능을 보이는 경우가 많습니다.
강점
- 단순성: 나이브 베이즈는 구현과 이해가 간단해 빠른 프로토타이핑에 매우 적합한 선택입니다.
- 효율성: 다른 모델에 비해 학습 데이터와 메모리 요구량이 상대적으로 적어 계산 효율성이 높습니다.
- 고차원 데이터에서도 잘 동작함: 나이브 베이즈는 데이터셋에 매우 많은 특징(단어)이 있어도 성능이 좋아 텍스트 분류 작업에 적합합니다.
약점
- 강한 독립 가정: 특징들이 서로 독립적이라는 “나이브”한 가정은 실제 환경에서 자주 성립하지 않으며, 그 결과 성능이 최적보다 떨어질 수 있습니다.
- 표현력의 한계: 단순한 구조 때문에 나이브 베이즈는 특징들 간의 복잡한 관계와 상호작용을 포착하는 데 어려움을 겪을 수 있습니다.
적용 분야
- 이메일 스팸 탐지: 나이브 베이즈의 대표적인 적용 사례 중 하나는 이메일 스팸 필터링으로, 특정 키워드나 특징의 존재 여부를 바탕으로 수신 이메일을 스팸인지 비스팸인지 분류합니다.
- 문서 분류: 나이브 베이즈는 뉴스 기사, 학술 논문, 고객 리뷰 등을 미리 정의된 범주로 분류하는 문서 분류 작업에도 사용됩니다.
- 감성 분석: 감성 분석에서는 나이브 베이즈가 텍스트 데이터(예: 제품 리뷰, 소셜 미디어 게시글)를 긍정, 부정, 중립 감성 범주로 분류할 수 있습니다.
단순화된 가정에도 불구하고, 나이브 베이즈는 학습 데이터가 제한적이거나 계산 자원이 제약된 상황에서 특히 텍스트 분류 작업의 강력한 기준선 모델로 활용될 수 있습니다.
서포트 벡터 머신(SVM)

설명
서포트 벡터 머신은 분류 작업에 사용되는 강력한 지도 학습 알고리즘입니다. SVM의 목표는 특성 공간에서 각 클래스를 가장 잘 분리하는 최적의 초평면을 찾는 것입니다. 입력 데이터를 고차원 특성 공간으로 사상한 뒤, 클래스 간 마진을 최대화하는 초평면을 찾아 작동��니다.
강점
- 고차원 공간에서 효과적임: SVM은 텍스트 데이터처럼 고차원 공간에서 잘 작동하므로, 특성 공간이 크게 형성되는 텍스트 분류 작업에 적합합니다.
- 과적합에 강함: SVM은 클래스 간 마진을 최대화하는 특성 덕분에, 특히 고차원 공간에서 과적합에 덜 취약합니다.
- 소규모 데이터셋에서도 잘 작동함: SVM은 비교적 작은 데이터셋에서도 성능이 좋아, 데이터가 제한된 상황에 적합합니다.
약점
- 계산 비용이 큼: SVM은 이차 최적화 문제를 풀어야 하므로, 특히 대규모 데이터셋을 다룰 때 계산 비용이 많이 들 수 있습니다.
- 하이퍼파라미터 튜닝에 민감함: SVM의 성능은 커널 함수와 정규화 파라미터와 같은 하이퍼파라미터 선택에 민감하며, 이에 대해 신중한 튜닝이 필요할 수 있습니다.
- 해석 가능성이 제한됨: SVM이 만들어내는 결정 경계는, 특히 고차원 공간에서 해석하기 어려울 수 있습니다.
적용 분야
- 텍스트 분류: SVM은 특징에 기반해 텍스트 데이터를 여러 클래스으로 구분합니다.
- 이미지 분류: SVM은 추출된 특징을 사용해 이미지를 서로 다른 여러 클래스로 분류합니다.
- 필기체 인식: SVM은 추출된 특징에 기반해 손글씨 문자를 분류합니다.
서포트 벡터 머신(SVM)은 고차원 특징 공간과 제한된 학습 데이터가 있는 상황에서 특히 강력하고 다재다능한 텍스트 분류 접근법을 제공합니다. 매개변수를 신중하게 튜닝하고 특징을 적절히 선택하면, SVM은 다양한 텍스트 분류 작업에서 높은 정확도를 달성할 수 있습니다.
사전 학습 모델의 힘

BERT와 GPT와 같은 사전 학습 모델은 텍스트 데이터에서 풍부한 의미적·문맥적 정보를 포착하는 사전 학습 언어 표현을 제공함으로써 NLP에 혁신을 가져왔습니다. Google이 소개한 BERT와 OpenAI가 개발한 GPT는 텍스트 분류와 같은 작업에서 강력한 성능을 제공합니다.
BERT는 양방향 언어 이해로 잘 알려져 있으며, 최소한의 수정만으로 텍스트 분류 작업에 파인튜닝할 수 있습니다. 마찬가지로 생성 능력으로 유명한 GPT도 분류 작업을 위해 파인튜닝할 수 있습니다.
이러한 사전 학습 모델은 전이 학습을 가능하게 하여, 대규모 사전 학습 과제에서 학습된 지식을 라벨이 제한된 다운스트림 작업에 이전하고 파인튜닝할 수 있게 합니다. 또한 깊은 의미적·구문적 정보를 포착하는 문맥적 임베딩을 생성해 분류 성능을 향상시킵니다.
사전 학습 모델의 활용 사례에는 감정 분석, 주제 분류, 스팸 탐지와 같은 텍스트 분류 작업뿐 아니라 개체명 인식, 질의응답과 같은 다른 NLP 작업도 포함됩니다.
요약하면, 사전 학습 모델은 문맥 정보를 정교하게 포착하고 유용한 표현을 생성하는 강력한 도구를 제공함으로써 텍스트 분류를 혁신했습니다. 이를 통해 개발자는 적은 학습 데이터로도 최신 수준의 모델을 구축하고, 다양한 NLP 작업 전반에서 뛰어난 성능을 달성할 수 있습니다.
텍스트 분류 모델 평가 지표

텍스트 분류 모델의 성능을 평가하는 일은 텍스트 데이터를 미리 정의된 클래스나 범주로 정확하게 분류하는 능력을 판단하는 데 필수적입니다. 다양한 평가 지표는 모델의 정확도, 정밀도, 재현율, 전반적인 성능에 대한 통찰을 제공하여, 개발자가 모델 하이퍼파라미터를 최적화하고 분류 결과를 개선하도록 돕습니다.
정확도: 정확도는 데이터셋의 전체 인스턴스 중 올바르게 분류된 인스턴스의 비율을 측정하는 기본 평가 지표입니다. 이는 클래스 레이블 예측의 전반적인 정확성을 평가하며, 올바르게 분류된 인스턴스 수를 전체 인스턴스 수로 나눈 비율로 계산됩니다.
정밀도: 정밀도는 양성으로 예측된 모든 인스턴스(참양성과 거짓양성 모두) 중에서 참양성 예측(올바르게 분류된 인스턴스)의 비율을 측정합니다. 이는 모델이 거짓양성 예측을 얼마나 잘 피하는지를 정량화하며, 참양성 예측 수를 양성 예측의 총수로 나눈 비율로 계산됩니다.
재현율(민감도): 재현율은 민감도 또는 참양성률이라고도 하며, 데이터셋에서 양성 클래스에 속하는 모든 인스턴스 중 참양성으로 예측된 비율을 측정합니다. 이는 모델이 모든 양성 인스턴스를 놓치지 않고 포착하는 능력을 정량화하며, 참양성 예측 수를 실제 양성 인스턴스의 총수로 나눈 비율로 계산됩니다.
F1 점수: F1 점수는 정밀도와 재현율의 조화 평균으로, 거짓양성과 거짓음성 모두를 고려한 균형 잡힌 성능 지표입니다. 정밀도와 재현율 사이의 균형을 맞추는 지표로, 각 메트릭의 분자와 분모를 모두 반영하여 정밀도와 재현율의 조화 평균으로 계산됩니다.
혼동 행렬: 혼동 행렬은 모델의 성능을 표 형태로 나타낸 것으로, 참양성, 참음성, 거짓양성, 거짓음성 예측의 개수를 요약합니다. 이는 모델의 분류 오류에 대한 통찰을 제공하며, 정확도, 정밀도, 재현율, F1 점수 등 다양한 평가 지표를 계산하는 데 사용할 수 있습니다.
평가 지표는 텍스트 분류 모델의 성능을 평가하고 모델 최적화 및 개선 작업을 이끄는 데 핵심적인 역할을 합니다. 이러한 지표는 개발자가 모델의 강점과 약점을 파악하도록 돕고, 실제 환경에서의 성능과 견고성을 높이기 위한 합리적인 의사결정을 내리게 합니다.
텍스트 분류 모델 구축과 최적화
우리는 텍스트 문서 분류를 수행하고 있습니다 데이터셋 정치, 스포츠, 기술, 엔터테인먼트, 비즈니스의 다섯 가지 범주로 분류된 2225개의 텍스트 문서를 포함하고 있습니다. 목표는 TensorFlow와 W&B를 사용해 텍스트 분류 모델을 개발하는 것입니다. 데이터 정제와 준비부터 시작하여 CNN 모델을 구성하고, 실험 추적과 하이퍼파라미터 튜닝을 위해 W&B를 통합합니다. 마지막으로 최적의 모델 구성을 찾기 위해 하이퍼파라미터 튜닝 스위프를 수행합니다.
1. 라이브러리 설치
!pip install -q nltk!pip install -q wandb
2. 라이브러리 불러오기
pandas, numpy, seaborn, matplotlib.pyplot, nltk, 그리고 wandb를 포함한 필수 라이브러리를 임포트합니다.
import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltimport nltkfrom nltk.corpus import stopwords
3. 데이터 로딩 및 탐색
데이터셋을 pandas DataFrame으로 불러온 뒤, 배열 차원과 고유 라벨을 탐색합니다.
df = pd.read_csv('df_file.csv')dfdf.shapedf['Label'].unique()df['Label'].value_counts()uniques = df['Label'].unique().for label in uniques:df_unique = df[df['Label'] == label]print(f"Label : {label} \n")print(f"First: {df_unique['Text'].values[0]} \n")print(f"Second: {df_unique['Text'].values[1]} \n")
4. 데이터 정제
NLTK를 사용해 텍스트를 정제합니다. 이 과정에는 소문자 변환, 구두점과 특수 문자 제거, 토큰화, 불용어 제거, 그리고 토큰 표제어 추출이 포함됩니다.
nltk.download('stopwords')nltk.download('punkt')nltk.download('wordnet')stop_words = set(stopwords.words('english'))lemmatizer = WordNetLemmatizer()def clean_text(text):text = text.lower()text = re.sub(r'[^a-zA-Z\s]', '', text)tokens = word_tokenize(text)cleaned_tokens = [lemmatizer.lemmatize(token) for token in tokens if token not in stop_words]return cleaned_tokenstext_1 = df['Text'].values[0]print(f"Original text: \n {text_1}")cleaned_text = clean_text(text_1)print(f"Result after cleaning: \n {cleaned_text}")cleaned_data = []for text in df['Text']:cleaned_text = clean_text(text)cleaned_data.append(cleaned_text)print(cleaned_data[0])len(cleaned_data)
5. 시퀀스로 변환
TensorFlow를 사용해 토크나이즈된 텍스트 데이터를 정수 시퀀스(단어 인덱스)로 변환하고, 시퀀스 길이를 맞추기 위해 패딩을 적용합니다.
tokenizer = tf.keras.preprocessing.text.Tokenizer()tokenizer.fit_on_texts(cleaned_data)sequences = tokenizer.texts_to_sequences(cleaned_data)max_length = max(len(seq) for seq in sequences)padded_sequences = tf.keras.preprocessing.sequence.pad_sequences(sequences, maxlen=max_length)padded_sequences
6. 레이블 준비
TensorFlow를 사용해 수치형 레이블을 원-핫 인코딩으로 변환합니다.
tokenizer = tf.keras.preprocessing.text.Tokenizer()tokenizer.fit_on_texts(cleaned_data)sequences = tokenizer.texts_to_sequences(cleaned_data)max_length = max(len(seq) for seq in sequences)padded_sequences = tf.keras.preprocessing.sequence.pad_sequences(sequences, maxlen=max_length)padded_sequences
7. 모델 생성
TensorFlow를 사용해 임베딩 레이어, 최대 풀링이 포함된 합성곱 레이어, 밀집 레이어, 그리고 정규화를 위한 드롭아웃 레이어로 구성된 순차 모델을 만듭니다.
model = tf.keras.Sequential([tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=max_length),tf.keras.layers.Conv1D(filters=256, kernel_size=5, activation='relu'),tf.keras.layers.MaxPooling1D(pool_size=2),tf.keras.layers.Conv1D(filters=128, kernel_size=3, activation='relu'),tf.keras.layers.GlobalMaxPooling1D(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dropout(0.5), # Add dropout layer for regularizationtf.keras.layers.Dense(num_classes, activation='softmax')])
8. 모델 컴파일
옵티마이저, 손실 함수, 평가 지표를 지정해 모델을 컴파일합니다.
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])model.summary()num_epochs = 10batch_size = 64
9. 학습을 위한 데이터 분할
scikit-learn의 train_test_split을 사용해 데이터를 학습용과 테스트용 세트로 분할합니다.
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(padded_sequences, one_hot_labels, test_size=0.2, random_state=42)
10. W&B 초기화
wandb.init(project="text-classification-project", config={"vocab_size": vocab_size,"embedding_dim": embedding_dim,"max_length": max_length,"num_classes": num_classes,"conv1_filters": 256,"conv1_kernel_size": 5,"pool1_size": 2,"conv2_filters": 128,"conv2_kernel_size": 3,"dense_units": 64,"dropout_rate": 0.5,"optimizer": "adam","loss_function": "categorical_crossentropy","epochs": num_epochs,"batch_size": batch_size})wandb.config.update({"optimizer": "adam","loss_function": "categorical_crossentropy"})
11. 모델 학습
history = model.fit(X_train, y_train, epochs=num_epochs, batch_size=batch_size, validation_data=(X_test, y_test),callbacks=[wandb.keras.WandbCallback()])wandb.finish()

출처: Author
위 그래프들은 W&B에 기록된 결과를 보여줍니다. 첫 번째 그래프는 에포크 수가 증가할수록 학습 손실이 감소함을 나타내며, 이를 통해 더 많은 에포크로 파인튜닝하면 정확도를 개선할 수 있음을 평가할 수 있습니다. 두 번째 그래프(val_accuracy)는 에포크 수가 늘어날수록 모델이 1에 수렴함을 보여줍니다.
12. 스웨프 구성 정의
Weights & Biases를 사용해 하이퍼파라미터 튜닝 스웨프 구성을 정의합니다.
sweep_config = {'method': 'random', # Specify the search method'metric': {'name': 'val_accuracy', 'goal': 'maximize'}, # Metric to optimize'parameters': {'embedding_dim': {'values': [50, 100, 200]},'filters1': {'values': [64, 128, 256]},'kernel_size1': {'values': [3, 5, 7]},'filters2': {'values': [64, 128, 256]},'kernel_size2': {'values': [3, 5, 7]},'dense_units': {'values': [64, 128, 256]},'dropout_rate': {'values': [0.2, 0.3, 0.5]},"epochs": {"values": [1,2,3,5]},"learning_rate": {"distribution": "uniform","min": 0.0001,"max": 0.1},"batch_size": {"values": [8, 16, 32, 64, 128]}}}sweep_id = wandb.sweep(sweep_config, project="text-classification-project")from wandb.keras import WandbCallbackdef train():default_config = {"vocab_size": 27887,"embedding_dim": 100,"num_classes": 5,"conv1_filters": 256,"conv1_kernel_size": 5,"pool1_size": 2,"conv2_filters": 128,"conv2_kernel_size": 3,"dense_units": 64,"dropout_rate": 0.5,"optimizer": "adam","loss_function": "categorical_crossentropy","epochs": 10, # Adjust as needed"batch_size": 64}wandb.init(config=default_config)config = wandb.configmodel = tf.keras.Sequential([tf.keras.layers.Embedding(input_dim=config.vocab_size, output_dim=config.embedding_dim, input_length=max_length),tf.keras.layers.Conv1D(filters=config.conv1_filters, kernel_size=config.conv1_kernel_size, activation='relu'),tf.keras.layers.MaxPooling1D(pool_size=config.pool1_size),tf.keras.layers.Conv1D(filters=config.conv2_filters, kernel_size=config.conv2_kernel_size, activation='relu'),tf.keras.layers.GlobalMaxPooling1D(),tf.keras.layers.Dense(config.dense_units, activation='relu'),tf.keras.layers.Dropout(config.dropout_rate),tf.keras.layers.Dense(config.num_classes, activation='softmax')])model.compile(optimizer=config.optimizer, loss=config.loss_function, metrics=['accuracy'])X_train, X_test, y_train, y_test = train_test_split(padded_sequences, one_hot_labels, test_size=0.2, random_state=42)# Train the modelmodel.fit(X_train, y_train, epochs=config.epochs, batch_size=config.batch_size, validation_data=(X_test, y_test), callbacks=[WandbCallback()])wandb.agent(sweep_id, train, count=30)

출처: Author
스웨프 과정을 통해 모델에서 얻은 관찰을 바탕으로 검증 정확도가 가장 높은, 97.3%를 달성한 모델에 도달했습니다.
결론
텍스트 분류는 기계 학습을 활용해 텍스트 데이터를 자동으로 범주화하여, 비정형 콘텐츠에서 인사이트를 추출할 수 있게 합니다. Naive Bayes, SVM, 사전 학습 모델 같은 기법과 TensorFlow, W&B 같은 도구를 함께 사용하면 감성 분석, 주제 분류와 같은 작업에서 정확한 모델을 구축할 수 있습니다. 여러 도전 과제가 있음에도 불구하고, NLP 분야는 지속적으로 발전하며 텍스트 분류 성능을 향상시키고 다양한 산업에서 가치 있는 의사결정 지원을 제공하는 정교한 해결책을 제시하고 있습니다.
Add a comment