선형 회귀에서 최소자승법 (OLS)라고 불리는 방법은 가장 간단하고 기본적인 방법이다. 선형 회귀는 w 가중치와 b y절편의 값을 mean squared error를 통해 예측과 원본 값의 차이를 최소화 하는 값을 찾는다. 이 mean squared error는 예측값과 원본 값의 차이를 제곱하여 구한다.
Example 1. make_wave
!pip install mglearn
from sklearn.model_selection import train_test_split
import mglearn
먼저 필요한 데이터셋을 불러오기 위해서 mglearn 라이브러리를 설치해주자.
from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)
train_input, test_input, train_target, test_target = train_test_split(
X, y, random_state=42)
mglearn에서 데이터를 불러온 다음에 훈련 데이터셋과 테스트 데이터셋으로 나눠준다.
lr = LinearRegression().fit(train_input, train_target)
print(lr.coef_, lr.intercept_)
훈련 데이터셋을 훈련시킨 다음, 가중치와 y절편을 구해보면
[0.39390555] -0.031804343026759746
다음과 같은 결과값이 도출된다.
import matplotlib.pyplot as plt
a = np.arange(-3, 4)
fig, ax = plt.subplots()
ax.scatter(train_input, train_target)
ax.scatter(test_input, test_target)
ax.plot(a, lr.coef_*a + lr.intercept_)
훈련 데이터셋과 테스트 데이터셋의 데이터 분포 정도를 파악하기 위해서 다음과 같이 그래프에 표시해주었고, 해당 가중치와 y절편 값에 알맞게 -3부터 3까지의 데이터를 그래프화 하였다. 해당 그래프에서 볼 수 있듯이 해당 그래프로 부터 멀리 떨어져있는 데이터들이 다수 존재해서, 선형회귀 모델만으로는 해당 데이터셋을 정확하게 파악하는 것은 어렵다고 판단했다.
print(lr.score(train_input, train_target))
print(lr.score(test_input, test_target))
0.6700890315075756
0.65933685968637
해당 데이터 셋에 대한 결과값도 높은 편은 아니라는 것을 알 수 있다. 데이터가 하나밖에 없으면 대부분 과적합을 예상하는데, 데이터의 양도 적었을 뿐만 아니라 예측값을 결정하는 데이터가 하나밖에 없어서 좋은 모델을 구현하는데 지장을 주었다고 판단했다. 그래서 해당 모델이 과소적합이 되었다고 생각하고 다양한 데이터가 존재하는 boston 집 데이터를 통해 해당 모델을 다시 학습해보려한다.
X, y = mglearn.datasets.load_extended_boston()
train_input, test_input, train_target, test_target = train_test_split(
X, y, random_state=0)
해당되는 데이터를 불러온 이후에
lr = LinearRegression().fit(train_input, train_target)
훈련 데이터셋을 훈련시키고
print("train_score = {}\n".format(lr.score(train_input, train_target)))
print("test_score = {}\n".format(lr.score(test_input, test_target)))
train_score = 0.9520519609032729
test_score = 0.6074721959665904
다음과 같은 결과값이 나오는데, 충분한 데이터를 제공했음에도 불구하고 테스트 점수가 매우 낮게 나오는 모습을 볼 수 있다. 훈련 점수는 높지만, 테스트 점수가 낮다는 것은 해당 모델이 과적합 되었다는 것을 의미하고 훈련 세트에 특정한 규제를 해야한다고 생각했다.
이럴 때 사용할 수 있는 모델이 릿지회귀이다.
릿지 회귀는 회귀에서 선형 모델 중 하나로, OLS와 같은 방식으로 특정 값을 예측하기 위해서 사용한다. 릿지 회귀에서 가중치의 값은 단지 훈련 데이터셋 뿐만 아니라 추가적인 제약에 의해 결정된다. 또한 우리는 계수의 규모가 가능한 크지 않기를 원한다. 다시 말해서 대부분의 가중치의 값은 0에 가깝다. 가중치의 값이 0에 가깝다는 것은 정확한 예측을 하면서 해당 특성들이 결과에 대해 적은 영향을 미친다는 것이다. 이러한 제약을 바로 규제라고 부른다. 규제는 해당 모델이 과적합 되는 것을 막는다.
from sklearn.linear_model import Ridge
ridge = Ridge().fit(train_input, train_target)
print("train_score = {}\n".format(ridge.score(train_input, train_target)))
print("test_score = {}\n".format(ridge.score(test_input, test_target)))
train_score = 0.8857966585170941
test_score = 0.7527683481744751
해당 결과값을 볼 수 있듯이 릿지 모델로 훈련시켰을 때 일반 선형모델로 훈련시켰을 때보다는 훈련세트 점수가 낮긴하지만, 테스트세트에 대한 점수는 높아진 것을 확인할 수 있다. 릿지는 더 제한된 모델이고, 그래서 우리는 과적합 시킬 확률이 줄어든다. 덜 복잡한 모델이 낮은 성과를 내는 것이 아니다. 대신 더 일반화 되어 있는 것이다. 우리가 일반화에 대한 성과에 더 관심있듯이 우리는 선형회귀 모델과 릿지 모델에 대한 쓰임에 대해 정확히 판단해야 한다.
릿지 모델은 모델의 단순성과 훈련 세트에 대한 성과에 관계에 따라 분류된다. 모델의 중점이 단순함인지, 훈련세트에 대한 성과인지를 파악하는 것이 사용자들이 판단해야할 내용이고, alpha 매개변수를 이용해서 알아내야한다. 이전 예시에서 우리는 alpha=1.0이라는 값을 사용했다. Ridge 모델에 특정 alpha값을 넣지 않으면 1.0인것으로 간주된다.
ridge10 = Ridge(alpha=10).fit(train_input, train_target)
print("train_score = {}\n".format(ridge10.score(train_input, train_target)))
print("test_score = {}\n".format(ridge10.score(test_input, test_target)))
alpha의 값을 낮추는 것은 해당 모델을 덜 제한한다는 것을 의미한다. alpha의 값이 매우 작아진다면, 선형회귀의 모델을 닮아간다는 것을 알 수 있다.
train_score = []
test_score = []
for n in number:
ridge = Ridge(alpha=n).fit(train_input, train_target)
train_score.append(ridge.score(train_input, train_target))
test_score.append(ridge.score(test_input, test_target))
fig, ax = plt.subplots()
ax.scatter(number, train_score)
ax.scatter(number, test_score)
0부터 100까지 10간격으로 규제값(alpha)을 결정할 때 어떤 값이 적당한지 보면
규제를 심하게 하면 할 수록 해당 값의 결과 값이 떨어진다는 것을 볼 수 있다.
train_score = []
test_score = []
for n in number:
ridge = Ridge(alpha=n).fit(train_input, train_target)
train_score.append(ridge.score(train_input, train_target))
test_score.append(ridge.score(test_input, test_target))
fig, ax = plt.subplots()
ax.scatter(number, train_score)
ax.scatter(number, test_score)
규제값을 0~1 사이의 값으로 줄었을 대 0.1에서 가장 좋은 값을 보인다는 것을 알 수 있다. 이렇게 alpha의 값이 해당 결과값에 어떻게 작용하는지 파악하는 것이 중요하다.
'Artificial Intelligence > Machine Learning' 카테고리의 다른 글
[Machine Learning] Linear Regression_Part 2 (0) | 2023.09.12 |
---|---|
[Machine Learning] Linear Models_Part 1 (0) | 2023.09.06 |
[Machine Learning] K-NN Algorithms_Part 2 (0) | 2023.09.05 |
[Machine Learning] K-NN Algorithms_Example (0) | 2023.09.04 |
[Machine Learning] K-NN Algorithms (0) | 2023.09.03 |