ML | 임의의 수치를 예측해보자 - Regression



Linear Regression
wikipedia



회귀Regression은 주어진 변수들의 상관관계를 예측해 모델을 구하고 임의의 숫자를 예측하는 알고리즘입니다. 아래와 같은 예를 들 수 있습니다.

  • 어떤 집값을 예측하고 싶을 때, 주변에 비슷한 집 몇개의 시세를 보고 예측할 수도 있습니다.
  • 운동할 때 걸은 거리와 시간을 기록했다면, 더 먼 거리를 갔을 때 얼마나 걸릴지도 예상할 수 있습니다.



1. K-Nearest NeighborKNN Regression

KNN을 통해 regression을 수행하는 예시를 들어보겠습니다. KNN classification은 가장 가까운 데이터의 라벨을 다수결로 결정해 분류를 합니다. KNN regression은 가장 가까운 이웃들의 값에서 대표값을 구하면 됩니다. 사이킷런의 KNeighborsRegressor는 이웃들의 타겟 값에서 평균을 내어 값을 반환해줍니다. 아래는 농어의 길이 (x축)와 농어의 무게 (y축) 데이터의 분포이고 임의의 길이를 가지고 어느정도의 무게를 가질 지 예측한 그림입니다.



주어진 데이터의 x값과 가장 가까운 5개의 Y (target)값의 평균을 계산하여 Y를 지정해 그렸습니다.

이런 모델을 만들 때는, 훈련 데이터와 테스트 데이터를 나누어야 하고 성능을 측정해야 합니다. Regression에서는 성능을 결정계수coefficient of determination를 통해 측정하고 R2으로 표시합니다.

Overfitting은 훈련 데이터의 성능이 테스트 데이터보다 훨씬 높을 때 일어납니다 (그 반대는 Underfitting입니다.) KNN의 경우 모델을 만들 때 이웃의 수를 n_neighbors로 지정할 수 있습니다. 예측에 사용할 이웃의 수에 따라 모델이 복잡해지기도 하고 단순해 지기도 합니다. 아래 그림에서 이웃의 수에 따라 예측이 달라지는 것을 확인 할 수 있습니다.

겹쳐서 잘 안보이지만, 범례를 누르면 숨길 수 있어요



n이 커질수록 모델은 단순해지고, n이 작을 수록 복잡하게 예측하는 것을 확인 할 수 있습니다.



2. Linear Regression

KNN도 Regression이 가능하지만 학습시킨 데이터 중에서 가까운 이웃을 지정하여 평균을 내기 때문에 예측을 할 수 있는 범위가 한정되어 있다는 한계가 있습니다.

가장 많이 사용되는 Regression 방법인 Linear Regression을 이용하면 주어진 데이터를 이용해 feature와 target의 관계를 나타내는 선형 방정식을 찾습니다. 방정식만 있다면 어떠한 데이터가 들어와도 계산하여 예측을 할 수 있습니다.

아래 데이터는 농어의 길이와 무게 데이터입니다. 농어의 길이를 가지고 무게를 예측해주는 KNN Regression과 Linear Regression을 비교해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
44.0])
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
1000.0])




데이터를 train과 test로 나눕니다.

1
2
3
4
5
6
7
from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = \
train_test_split(perch_length, perch_weight, random_state=42)

train_input = train_input.reshape(-1, 1)
test_input = train_input.reshape(-1, 1)



데이터 분포는 다음과 같습니다.

농어의 길이 데이터는 10~ 40 정도 분포를 가지고 있습니다. 여기서 길이 50cm와 100cm의 농어가 있다고 치고 무게를 예측해보겠습니다.

1
2
3
4
5
6
7
8
9
10
from sklearn.neighbors import KNeighborsRegressor

knr = KNeighborsRegressor(n_neighbors=3)
knr.fit(train_input, train_target)

print(knr.predict([[50]]))
# [1033.33333333]

print(knr.predict([[100]]))
# [1033.33333333]

둘다 1033을 내었는데, 이는 주어진 데이터의 가장 가까운 3개의 이웃이 가진 데이터의 평균입니다. 농어 길이데이터는 40가량까지 밖에 없으므로 가장 긴 길이를 가진 농어의 평균 무게를 예측해서 값을 줍니다.

이번엔 Linear Regression을 수행해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
from sklearn.linear_model import LinearRegression

lr = LinearRegression()

lr.fit(train_input, train_target)

print(lr.predict([[50]]))
# [1241.83860323]

print(lr.predict([[100]]))
# [3192.69585141]




각각 1241과 3192라는 값을 주었습니다. Linear Regression은 주어진 feature 데이터에서 target데이터의 관계를 설명할 수 있는 방정식을 찾기 때문입니다.

여기서는 농어의 길이만을 가지고 예측했으므로 다음과 같은 방정식을 찾았을 겁니다.

농어의 무게 = 기울기 * 농어의 길이 + 절편

기울기와 절편은 LinearRegression 모델에 포함되어 있습니다.

1
2
print(lr.coef_, lr.intercept_)
# [39.01714496] -709.0186449535477



lr.coef_는 기울기로 계수coefficient 혹은 가중치weight 라고도 부릅니다. lr.intercept_가 절편입니다. 모델이 찾아준 기울기와 절편을 이용한 Line을 분포데이터에 그리면 다음과 같습니다.

앞서 결정계수를 통해 성능을 측정하는데 Overfitting과 Underfitting이 일어날 수 있다고 말씀드렸습니다. 이런 경우 훈련 데이터에 너무 맞추지 않도록 모델을 복잡도를 조절하거나, 규제Regularization를 이용하여 학습하지 못하도록 방해하는 방법도 있습니다.

Linear Regression에서는 규제를 추가한 모델에는 릿지Ridge와 라쏘Lasso가 있습니다. 사이킷런에서도 이들을 RidgeLasso로 제공해줍니다.

하지만 규제를 한다는 것은 어느 정도로 할지는 사용자 마음대로 조절 할 수 있어야 합니다. 이는 모델이 알아서 정하는 것이 아닌 사람이 사전에 정애햐 하는 파라미터이고, 하이퍼 파라미터hyperparameter라고 합니다. 릿지와 라쏘의 사용방법은 위에서 보여드린 Linear Regression과 같으므로 자세히는 다루지 않겠습니다.

이번글에는 Regression의 예시로 KNN, Linear Regression을 이용하였고 결정계수, Overfitting과 Underfitting에 대해 간략히 정리하였습니다.

읽어주셔서 감사드립니다. 👋



p.s. 커피 선물 감사드립니다 ☕️