Search

머신러닝 모델 훈련 중 과적합(Overfitting) 발생 해결

카테고리
Python
태그
머신러닝
과적합
생성 일시
2023/02/20
상황: 머신러닝 모델을 훈련할 때, 모델이 훈련 데이터에 지나치게 적합되어 새로운 데이터에 대한 예측 성능이 저하되는 현상인 과적합이 발생할 수 있습니다. 이 문제를 해결하여 모델의 일반화 성능을 향상시키고자 합니다.
해결방안: 교차 검증(Cross-validation) 및 드롭아웃(Dropout) 기법을 사용하여 과적합을 완화합니다.
1.
교차 검증 데이터를 훈련 세트와 검증 세트로 나누어 모델의 일반화 성능을 평가합니다. K-겹 교차 검증을 사용하면 더욱 견고한 결과를 얻을 수 있습니다.
예를 들어, scikit-learn 라이브러리를 사용하여 K-겹 교차 검증을 수행하는 코드는 다음과 같습니다.
pythonCopy code from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target clf = RandomForestClassifier(random_state=42) cv_scores = cross_val_score(clf, X, y, cv=5) print("CV scores:", cv_scores) print("Mean CV score:", cv_scores.mean())
Python
복사
2.
드롭아웃 기법 신경망 모델에서 과적합을 방지하기 위해 드롭아웃 기법을 적용할 수 있습니다. 드롭아웃은 훈련 과정에서 일부 뉴런을 무작위로 비활성화하여 모델의 일반화 성능을 향상시킵니다.
예를 들어, TensorFlow와 Keras를 사용하여 드롭아웃을 적용하는 코드는 다음과 같습니다.
pythonCopy code import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.optimizers import Adam from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, OneHotEncoder iris = load_iris() X, y = iris.data, iris.target # 데이터 전처리 X = StandardScaler().fit_transform(X) y = OneHotEncoder(sparse=False).fit_transform(y.reshape(-1, 1)) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = Sequential([ Dense(64, activation='relu', input_shape=(4,)), Dropout(0.5), Dense(64, activation='relu'), Dropout(0.5), Dense(3, activation='softmax') ]) model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2) test_loss, test_acc = model.evaluate(X_test, y_test) print("Test accuracy:", test_acc)
Python
복사
이 예제에서는 두 개의 은닉층에 드롭아웃을 적용하였으며, 드롭아웃 비율은 0.5로 설정되어 있습니다. 드롭아웃 비율은 무작위로 비활성화되는 뉴런의 비율을 의미합니다. 이를 통해 모델의 일반화 성능이 향상됩니다.