KerasTuner: Keras 모델을 위한 하이퍼파라미터 튜닝 라이브러리 (RandomSearch, Hyperband, BayesianOptimization 지원).
또는 GridSearchCV/RandomizedSearchCV와 Keras 모델을 래핑하는 KerasClassifier/KerasRegressor (from scikeras.wrappers 또는 과거 tf.keras.wrappers.scikit_learn)를 함께 사용할 수 있으나, KerasTuner가 더 권장됨.
XGBoost/LightGBM:
Scikit-learn 래퍼 사용 시 GridSearchCV/RandomizedSearchCV 활용.
자체 API 사용 시, 반복문을 통해 직접 탐색하거나 Optuna, Hyperopt와 같은 베이지안 최적화 도구 사용.
베이지안 최적화 도구 (고급): Optuna, Hyperopt, Scikit-Optimize (skopt) 등. 이전 탐색 결과를 바탕으로 다음 탐색 지점을 효율적으로 결정.
# 하이퍼파라미터 튜닝 예시 (Random Forest 모델, RandomizedSearchCV 사용)
# (Day 90, 91의 X_train_tfidf, y_train 사용 가정)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint # 정수형 랜덤 값 생성용
# 1. 튜닝할 모델 정의
rf_model = RandomForestClassifier(random_state=42, n_jobs=-1)
# 2. 하이퍼파라미터 탐색 공간 정의
param_dist_rf = {
'n_estimators': randint(50, 300), # 50에서 299 사이의 정수
'max_depth': [None] + list(randint(5, 30).rvs(5)), # None 또는 5~29 사이 랜덤 정수 5개
'min_samples_split': randint(2, 20),
'min_samples_leaf': randint(1, 20),
'max_features': ['sqrt', 'log2', None] + list(np.random.uniform(0.1, 1.0, 3)), # 문자열 또는 0.1~1.0 사이 랜덤 실수 3개
'bootstrap': [True, False],
'criterion': ['gini', 'entropy']
}
# 3. RandomizedSearchCV 객체 생성
# n_iter: 시도할 조합 수
# cv: 교차 검증 폴드 수
# scoring: 평가지표
# random_state: 재현성
# verbose: 로그 출력
random_search_rf = RandomizedSearchCV(
estimator=rf_model,
param_distributions=param_dist_rf,
n_iter=20, # 예시로 20번 시도 (실제로는 더 많이)
cv=3, # 예시로 3-폴드 (실제로는 5 또는 StratifiedKFold 객체)
scoring='f1_macro',
random_state=42,
verbose=1,
n_jobs=-1 # 모든 코어 사용
)
print("\nRandomForest 하이퍼파라미터 튜닝 시작 (RandomizedSearch)...")
# X_train_tfidf, y_train 사용 (Day 90에서 생성된 데이터)
# --- 데이터 준비 (Day 90, 91 코드 참고) ---
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
data_for_modeling = {
'processed_text': [
"movie great wonderful", "terrible film hated", "not bad could better",
"amazing masterpiece cinema", "okay nothing special write home",
"fantastic story engaging characters", "boring plot uninspired acting",
"truly enjoyed this experience", "would not recommend this", "a must see film",
"very good indeed", "awful and boring", "quite nice actually", "superb film", "meh it was okay"
] * 2, # 데이터 양 늘리기
'sentiment': [1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0] * 2,
}
df_model = pd.DataFrame(data_for_modeling)
X_text_data = df_model['processed_text']
y_target = df_model['sentiment']
X_train_text, _, y_train, _ = train_test_split( # 테스트셋은 여기선 불필요
X_text_data, y_target, test_size=0.2, random_state=42, stratify=y_target
)
tfidf_vectorizer = TfidfVectorizer(max_features=100)
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train_text)
# --- 데이터 준비 끝 ---
random_search_rf.fit(X_train_tfidf, y_train)
print("튜닝 완료!")
print("\n최적 하이퍼파라미터 (RandomForest):", random_search_rf.best_params_)
print("최적 교차 검증 F1 (Macro) 점수:", random_search_rf.best_score_)
# 최적 모델 저장 또는 사용
best_rf_model = random_search_rf.best_estimator_
# (KerasTuner 예시는 복잡도가 있어 생략, 필요시 공식 문서 참고)
# https://keras.io/keras_tuner/
Day 89에서 생성했거나, Day 91의 오류 분석을 통해 새로 고안한 특징들을 실제 모델 학습에 적용해보고 성능 변화를 관찰합니다.
방법:
새로운 특징을 추가하거나 기존 특징을 수정한 데이터셋을 준비합니다.
이전과 동일한 모델(또는 튜닝된 모델)로 학습하고 (교차) 검증 성능을 비교합니다.
성능이 향상되었다면 해당 특징을 채택하고, 그렇지 않다면 다른 아이디어를 시도하거나 기존 특징을 유지합니다.
예시 (어제 아이디어 기반):
(감성 분석) 문장 내 느낌표(!)나 물음표(?) 개수를 특징으로 추가.
(감성 분석) 긍정/부정 사전 단어의 등장 비율을 특징으로 추가.
(텍스트) 텍스트 길이를 로그 변환한 특징 사용.
주의: 새로운 특징을 추가할 때마다 모델의 복잡도가 증가하고 과적합의 위험이 생길 수 있으므로, 항상 검증 세트 성능을 기준으로 판단해야 합니다. 특징 선택(Feature Selection) 기법을 병행할 수도 있습니다.
# 특징 공학 효과 검증 예시 (기존 X_train_tfidf에 새로운 특징 추가 가정)
# (실제로는 Day 89에서 만든 특징을 사용)
from scipy.sparse import hstack # 희소 행렬 결합용
# 예시: 텍스트 길이 특징 추가 (이미 계산되어 있다고 가정)
# X_train_text_lengths = np.array([len(text.split()) for text in X_train_text]).reshape(-1, 1)
# (StandardScaler 등으로 스케일링 필요할 수 있음)
# X_train_combined_features = hstack([X_train_tfidf, X_train_text_lengths])
# 이 X_train_combined_features를 사용하여 모델 학습 및 평가, 이전 결과와 비교
# random_search_rf.fit(X_train_combined_features, y_train)
# print("새로운 특징 추가 후 최적 F1 점수:", random_search_rf.best_score_)
Day 93: 프로젝트를 위한 간단한 UI 또는 프레젠테이션 구축 (Building a simple UI or presentation for the project) - 최적화된 모델을 사용하여 예측 결과를 보여줄 수 있는 간단한 사용자 인터페이스를 만들거나, 프로젝트 결과를 발표할 프레젠테이션 자료 준비 시작.