Notice
Recent Posts
Link
아무것도 모르는 공대생의 지식 탐험기
[혼공머신]_2주차 회귀 알고리즘과 규제 본문

안녕하세요 !
오늘은 혼공머신 2주차 회귀 알고리즘과 규제에 대해서 알아보겠습니다 !
지도 학습 알고리즘
- 분류 (Classification) : 샘플을 몇 개의 클래스 중 하나로 구별하는 문제
- 회귀(Regression) : 기존 데이터 X가 주어졌을 때, 적절한 Y를 예측하는 알고리즘
k-최근접 이웃 분류 알고리즘
- 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다
- 샘플들의 클래스를 살펴보고, 다수의 클래스를 새로운 클래스로 예측한다

k-최근접 이웃 회귀 ( K-Nearest Neighbor Regression )
- 예측하고자 하는 샘플에 가장 가까운 샘플 k개 선택 (여기서 말하는 이웃 샘플의 타깃은 클래스가 아닌 임의의 수치
- 이웃 샘플의 수치를 확인한다
- 수치들의 평균을 구하고, 새로운 샘플의 타깃을 예측한다

데이터 준비 및 모델 만들기
더보기
import numpy as np
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])
import matplotlib.pyplot as plt
plt.scatter(perch_length, perch_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
#이 때, 사이킷런에 사용할 훈련 세트는 2차원 배열이여야 한다. 즉, [1, 2, 3] 과 같은 배열을 [[1], [2], [3]] 과 같은 배열로 바꿔야한다.넘파이 배열은 배열의 크기를 쉽게 바꿀 수 있는 reshape() 메서드를 제공한다. 따라서, 이를 이용해 앞의 train_input과 test_input의 크기를 바꾼다.
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 = test_input.reshape(-1, 1)
print(train_input.shape, test_input.shape)
(42, 1) (14, 1)
#reshape를 사용할 때, 남은 1개의 파라미터를 -1로 넣으면, 넘파이가 자동으로 계산해 넣어준다.
결정계수 (R²)
데이터를 준비한 이후에는 KNeighborsRegressor을 통해 모델을 학습시킨다.
그 후 테스트 데이터를 이용해 점수를 확인해본다.
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor()
# k-최근접 이웃 회귀 모델을 훈련함
knr.fit(train_input, train_target)
# TEST 데이터를 이용해 모델의 점수를 확인한다
print(knr.score(test_input, test_target))
#결과 : 0.9928094061010639
- 여기서 나오는 0.9928094061010639 라는 점수를 결정계수(coefficient of determination)이라고 하고 R² 라고도 부른다.
- R² = 1 - {(타깃-예측)²의 합}/{(타깃-평균)²의 합}
- 예측에 가까워질수록 1에 가까워진다
- 타깃의 평균 정도를 예측하는 수준일수록 0에 가깝다
- 이 값으로 얼마나 좋은지 직감적으로 알기 어렵기 대문에, 타깃과 예측한 값 사이의 차이를 구해봐야한다.

from sklearn.metrics import mean_absolute_error
# 테스트 세트에 대한 예측을 만든다.
test_prediction = knr.predict(test_input)
# 테스트 세트에 대한 평균 절댓값 오차를 계산한다.
mae = mean_absolute_error(test_target, test_prediction)
print(mae)
19.1571..
과대적합 vs 과소적합
- 일반적으로 모델을 훈련 세트에 훈련을 하게 되면 훈련 세트에 잘 맞는 모델이 만들어지고, 해당 모델을 훈련 세트와 테스트 세트에 각각 평가해보면 보총 훈련 세트의 점수가 높게 나온다
- 과대 적합 (Overfitting) : 훈련 세트에서 점수가 굉장히 높지만, 테스트 세트에서는 점수가 매우 낮은 경우 ( 훈련 세트에만 맞는 모델이라 테스트 세트와 새로운 샘플에 대해 잘못된 예측을 하게 된다)
- 과소 적합 (Underfitting) : 훈랸 세트 보다 테스트 세트의 점수가 높거나 두 점수 모두 매우 낮은 경우, 모델이 너무 단순하거나 데이터 세트가 너무 적을 때 발셍
선형 회귀 (linear regression)
- k-최근접 이웃의 한계는 새로운 샘플이 훈련세트의 범위를 넘어가면, 엉뚱한 값을 예측할 수 있다는 점이다.
- 선형 회귀 (linear regression) : 특성이 하나인 경우 어떤 직선을 학습하는 회귀 알고리즘
- 직선은 y = a * x + b 꼴로 만들어진다. - 하나의 직선을 그리기 위해서는 기울기 a와 y절편이 필요하다
- LinearRegression은 coef_ 속성에 기울기 a를, intercep_ 속성에 절편 b를 저장
coef_와 intercep_를 머신러닝이 찾은 값이라는 의미로 모델 파라미터(model parameter)라고 한다. - 머신러닝 알고리즘의 훈련과정은 최적의 모델 파라미터를 찾아과는 과정이다
- 모델 기반 학습 : 모델 파라미터가 있는 경우 최적의 모델 파라미터를 찾는 훈련
- 사례 기반 학습 : 모델 파라미터가 없으며, 훈련 세트를 저장하는 것만 있는 훈련 과정

다항 회귀 (Polynomial regression)
- 비선형 데이터를 학습하기 위해 다항식을 사용한 선형 회귀
- 2차 방정식의 그래프를 그리려면, 길이를 제곱한 항이 훈련 세트에 추가되어야 한다.
- 따라서, 각 특성의 거듭 제곱을 새로운 특성으로 추가하여, 확장된 특성을 포함한 데이터셋을 선형 모델에 훈련한다

다중 회귀 (Multiple regression)
- 여러 개의 특성을 사용한 선형회귀
- 3개의 특성을 각각 제곱하여 추가하는데, 거기에 각 특성을 서로 곱해서 또 다른 특성을 만들 것이다.
- 즉, 길이 * 높이를 새로운 특성으로 만드는 것인데, 이렇게 기존 특성을 이용해 새로운 특성을 뽑아내는 작업을 특성 공학(feature engineering)이라고 한다.
규제 (Regularization)
- 머신러닝 모델이 훈련 세트에 과대적합되지 않도록 만드는 일이다.
- 선형 회귀 모델의 경우 특성에 곱해지는 계수 또는 기울기의 크기를 작게 만든다

릿지(Ridge)와 라쏘(Lasso)
- 선형 회귀 모델에 규제를 추가한 모델
- 릿지(Ridge) : 계수를 제곱한 값을 기준으로 규제 적용 (보통 많이 쓴다)
- 라쏘(Lasso) : 계수의 절대값을 기준으로 규제 적용
- 릿지와 라쏘 모델을 사용할 때, Alpha 매개 변수를 사용하여 규제의 강도를 조절힌다
- alpha가 크면 -> 규제 강도 높아짐 -> 과소적합 되도록 유도함
- alpha 가 작으면 -> 규제 강도가 낮아짐 -> 과대 적합 되도록 유도
하이퍼파라미터 (Hyperparameter)
- 머신러닝 모델이 학습할 수 없고 사람이 알려줘야 하는 파라미터
- 사이킷런과 같은 머신러닝 라이브러리에서 하이퍼파라미터는 클래스와 메서드의 매개변수로 표현됨
기본 미션 : ch.03 (03-1) 2번 문제 출력 그래프 인증하기
knr = KNeighborsRegressor()
# 5에서 45까지 x 좌표를 만든다
x = np.arange(5, 45).reshape(-1, 1)
# n = 1, 5, 10일 때 예측 결과를 그린다
for n in [1, 5, 10]:
knr.n_neighbors = n
knr.fit(train_input, train_target)
# 지정한 범위 x에 대한 예측을 구한다
prediction = knr.predict(x)
# 훈련 세트와 예측 결과를 그래프로 그린다
plt.scatter(train_input, train_target)
plt.plot(x, prediction)
plt.title('n_neighbors = {}'.format(n))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
![]() |
![]() |
![]() |
선택 미션 : 모델 파라미터에 대해 설명하기
- 모델 파라미터란, 머신 러닝 알고리즘이 찾은 값이다.
- 선형 회기가 찾은 가중치 처럼, 머신러닝 모델에서 학습하는 최적의 파라미터
2주차 소감 : 본격적으로 머신러닝을 공부하게 되는 주차였던 거 같다
조금은 어려웠지만, 앞으로도 열심히 하면 끝엔 엄청난 지식이 쌓여있을 거라는 믿음으로 킵고잉 !