정규화 (Regularization)
정규화는 과적합을 줄이는 기술로, 신경망이 훈련 데이터를 학습하기보다는 암기하려고 할 때 발생한다. 인간은 또한 과적합을 할 수 있다. 기계가 어떻게 우연히 과적합되는지를 조사하기 전에, 먼저 인간이 어떻게 기계로부터 고통을 받을 수 있는지를 탐구해야 한다. 인간 프로그래머들은 종종 주어진 프로그래밍 언어로 그들의 능력을 보여주기 위해 자격증 시험을 치른다. 이러한 시험을 준비하는 것을 돕기 위해, 시험 제작자들은 종종 연습 시험을 이용할 수 있게 한다. 연습 시험을 보고, 더 공부하고, 그리고 나서 연습 시험을 다시 보는 루프에 들어가는 프로그래머를 생각해보자. 프로그래머는 개별 문제를 파악하는 데 필요한 기술을 배우기보다는 어느 시점에서 연습 시험의 많은 부분을 암기했다. 그 프로그래머는 이제 연습 시험에 너무 적합하다. 이 프로그래머가 실제 시험을 볼 때, 그의 실제 점수는 그가 연습 시험에서 얻은 점수보다 낮을 것이다.
신경망이 훈련 데이터에서 높은 점수를 받았지만, 이 결과는 동일한 신경망이 훈련 세트 안에 있지 않은 데이터에서 높은 점수를 받는다는 것을 의미하지 않는다. 컴퓨터는 또한 너무 잘 맞을 수 있다. 정규화는 과적합을 방지할 수 있는 기술 중 하나입니다. 몇 가지 다른 정규화 기법이 존재한다. 대부분의 작업은 신경망이 훈련할 때의 가중치를 분석하고 잠재적으로 수정함으로써 이루어진다.
L1 and L2 (Ridge and Lasso)
L1 및 L2 정규화는 과적합의 영향을 줄일 수 있는 두 가지 표준 정규화 기법이다. 이러한 알고리즘은 목적 함수와 함께 작동하거나 역전파 알고리즘의 일부로 작동할 수 있다. 정규화 알고리즘은 두 경우 모두 목표를 추가하여 훈련 알고리즘에 부착된다.
이러한 알고리즘은 신경망 훈련에 가중치 페널티를 추가하여 작동한다. 이 페널티는 신경망이 가중치를 작은 값으로 유지하도록 장려한다. L1과 L2 모두 이 패널티를 다르게 계산한다. 이 패널티 계산을 역전파와 같은 그레이디언트 강하 기반 알고리즘에 대해 계산된 그레이디언트에 추가할 수 있다. 페널티는 시뮬레이션 어닐링과 같은 목표 기능 기반 훈련의 목표 점수와 부정적으로 결합된다.
자동 mpg 데이터를 설정하고 선형 회귀 분석을 통해 L1 및 L2 정규화가 어떻게 작동하는지 알아본다.
from sklearn.linear_model import LassoCV
import pandas as pd
import os
import numpy as np
from sklearn import metrics
from scipy.stats import zscore
from sklearn.model_selection import train_test_split
df = pd.read_csv("https://data.heatonresearch.com/data/t81−558/auto−mpg.csv",
na_values = ['NA', '?'])
# Handle missingvalue
df['horsepower'] = df['horsepower'].fillna(df['horsepower'].median())
# Pandas to Numpy
names = ['cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'year', 'origin']
x = df[names].values
y = df['mpg'].values # regression
# Split into train / test
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size =0.25, random_state = 45)
선형 회귀 분석은 모형의 계수를 조사하는 것이 유용하다.
# Simple function to evaluate the coefficients of a regression
%matplotlib inline
from IPython.display import display, HTML
def report_coef(names, coef, intercept):
r = pd.DataFrame({'coef' : coef, 'positive' : coef >= 0}, index = names)
r = r.sort_values(by = ['coef'])
display(r)
print(f"Intercept : {intercept}")
r['coef'].plot(kind = 'barh', color = r['positive'].map({True : 'b', False : 'r'}))
Linear Regression
연구자들은 선형 회귀를 위한 정규화의 L1 / L2 형태를 처음 도입했다. 또한 신경망을 위해 L1 / L2를 사용할 수 있다. 선형 회귀 분석을 사용하여 자동 MPG 데이터 세트를 적합시킨다. 보고된 RMSE는 신경망만큼 좋지 않을 것이다.
import sklearn
# Create linear regression
regressor = sklearn.linear_model.LinearRegression()
# Fit / train linear regression
regressor.fit(x_train, y_train)
# Predict
pred = regressor.predict(x_test)
# Measure RMSE error. RMSE is common for regression.
score = np.sqrt(metrics.mean_squared_error(pred, y_test))
print (f"Final score(RMSE) : {score}")
report_coef(names, regressor.coef_, regressor.intercept_)
Final score (RMSE) : 3.0019345985860784
Intercept : −19.101231042200112
'DNN with Keras > Regularization and Dropout' 카테고리의 다른 글
과적합을 줄이기 위한 드롭아웃 (0) | 2023.07.24 |
---|---|
과적합을 줄이기 위한 L1 및 L2 정규화 (0) | 2023.07.24 |
홀드아웃 (Holdout) 방법 (0) | 2023.07.24 |
K-Fold Cross-validation (0) | 2023.07.24 |
L1 / L2 정규화 (0) | 2023.07.24 |