한 개 이상의 특성이 있을 때의 경사 하강법
한 개 이상의 특성이 있을 때의 경사하강법도 크게 다르지 않다. 일단 식은 다음과 같다.
코드를 작성하는 방법은 크게 두 가지가 있다. 첫 번째는 이중 반복문을 사용하는 것이다.
for _ in range(iterations):
predictions = x.dot(theta)
for i in range(theta.size):
partial_marginal = x[:, i]
errors_xi = (predictions - y) * partial_marginal
theta[i] = theta[i] - alpha * (1.0 / m) * errors_xi.sum()
theta_history.append(theta)
cost_history.append(compute_cost(x, y, theta))
하지만 이중 반복문은 당연히 시간 복잡도상으로 좋지 않다. 다른 방법은 벡터화를 사용하는 것이다.
for i in range(0, num_iterations):
hypothesis = x.dot(x, theta)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * m)
gradient = np.dot(xTrans, loss) / m
theta = theta - alpha * gradient
모델의 성능 평가하기
모델의 성능을 평가하는 방법에는 대표적으로 3가지가 있다.
가장 먼저, Mean Absolute Error(MAE)이다. 이는 잔차의 ‘절댓값의 합’을 구한다. 공식은 다음과 같다.
코드 구현은 다음과 같다.
# 방법 1
np.abs(y - predictions).sum() / len(y)
# 방법 2
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y, predictions)
다음으로 Root Mean Squared Error(RMSE)가 있다. (간혹 제곱근을 하지 않기도 한다.) 공식과 코드는 다음과 같다.
# 방법 1
np.sqrt(np.mean((y - predictions) ** 2))
# 방법 2 - MSE 구하기
from sklearn.metrics import mean_squared_error
mean_squared_error(y, predictions)
마지막으로 R-squared이다. 앞선 두 개 와는 다르게 1에 가까울수록(클수록) 좋다. 공식과 코드는 다음과 같다.
# 방법 1
1 - (np.sum((y - predictions) ** 2) / np.sum((y - y.mean()) ** 2))
# 방법 2
from sklearn.metrics import r2_score
r2_score(y, predictions)
Hold-out Method
데이터 셋을 train set과 test set으로 나누는 것을 ‘Hold-out Method’라고 한다. 데이터를 나누어야 하는 이유는 과대적합을 방지하여 모델의 성능을 높이기 위함이다. 각 set의 비율은 보통 train set 2: test set 1 정도로 하지만, 데이터의 양에 따라 달라진다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.
댓글남기기