-
혼공머신 Ch 03 회귀 알고리즘과 모델 규제Study/머신러닝 딥러닝 2025. 9. 23. 13:58

목차
들어가며: 예측 모델의 첫걸음, 회귀 알고리즘 파헤치기
1. k-최근접 이웃(k-NN) 회귀: 이웃의 평균으로 예측하기
1-1. k-NN 회귀의 기본 원리
1-2. 과대적합 vs 과소적합: 최적의 이웃(k) 찾기
2. 선형 회귀: 데이터에 딱 맞는 선을 긋다
2-1. k-NN 회귀의 한계와 선형 회귀의 등장
2-2. 단순 선형 회귀: 가장 기본적인 예측선
2-3. 다항 회귀: 직선을 곡선으로 업그레이드하기
3. 특성 공학과 다중 회귀: 더 많은 정보로 똑똑하게 예측하기
3-1. 특성 공학(Feature Engineering)이란?
3-2. 다항 특성으로 모델 성능 높이기
4. 규제 회귀: 모델이 과열되지 않도록 제어하기
4-1. 릿지(Ridge) 회귀: 모든 특성에 부드러운 페널티
4-2. 라쏘(Lasso) 회귀: 불필요한 특성은 과감하게 제거
마치며: 올바른 회귀 모델 선택의 중요성
들어가며: 예측 모델의 첫걸음, 회귀 알고리즘 파헤치기
안녕하세요!
'농어의 길이가 50cm일 때, 무게는 몇 그램일까?" 와 같이 연속적인 숫자를 예측하는 문제는 데이터 분석의 핵심 과제 중 하나입니다.
이렇게 숫자를 예측하는 것을 회귀(Regression)라고 부릅니다.
오늘은 파이썬 Scikit-Learn 라이브러리를 사용하여 가장 대표적인 두 가지 회귀 알고리즘,
k-최근접 이웃(k-NN) 회귀와 선형 회귀(Linear Regression)에 대해 알아보겠습니다.
모델의 복잡도를 조절하며 마주하는 과대적합, 과소적합 문제를 이해하고,
특성 공학과 규제를 통해 모델의 성능을 극한까지 끌어올리는 여정을 함께 떠나보시죠!
1. k-최근접 이웃(k-NN) 회귀: 이웃의 평균으로 예측하기
k-NN 알고리즘은 가장 직관적인 예측 모델 중 하나입니다.
"가장 가까운 데이터들을 보고 예측하자!" 라는 단순한 아이디어에서 출발합니다.
1-1. k-NN 회귀의 기본 원리
분류 문제에서 k-NN이 주변 데이터들의 투표로 정답을 정했다면, 회귀 문제에서는 더 간단합니다.
예측하려는 데이터와 가장 가까운 이웃 데이터 k개의 수치(타겟)를 단순히 평균 내어 예측값으로 사용합니다.
모델의 성능은 결정계수(R²)로 평가하는데, 1에 가까울수록 예측 정확도가 높다는 의미입니다.
from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsRegressor # 농어 데이터(길이, 무게)를 훈련 세트와 테스트 세트로 분리 train_input, test_input, train_target, test_target = train_test_split( perch_length, perch_weight, random_state=42) # k-NN 회귀 모델 훈련 knr = KNeighborsRegressor() knr.fit(train_input, train_target) # 결정계수(R^2)로 평가 score = knr.score(test_input, test_target) print(score) # 출력: 0.9928...1-2. 과대적합 vs 과소적합: 최적의 이웃(k) 찾기
k-NN 모델의 복잡도는 이웃의 개수 k에 따라 결정됩니다.
- k값이 작으면 (e.g., k=1):
모델이 훈련 데이터의 아주 작은 부분만 보고 예측하므로,
예측선이 매우 복잡하고 훈련 데이터에만 딱 들어맞게 됩니다. 이를 과대적합(Overfitting)이라고 합니다. - k값이 크면 (e.g., k=10):
너무 많은 이웃의 평균을 내다보니,
예측선이 지나치게 단순화되어 데이터의 특성을 제대로 반영하지 못합니다. 이를 과소적합(Underfitting)이라고 합니다.
따라서 적절한 k값을 찾는 것이 모델 성능의 핵심입니다.
import matplotlib.pyplot as plt # k-최근접 이웃 회귀 객체를 만듭니다 knr = KNeighborsRegressor() # n = 1, 5, 10일 때 예측 결과를 그래프로 그립니다. for n in [1, 5, 10]: # 모델 훈련 knr.n_neighbors = n knr.fit(train_input, train_target) # ... (그래프 그리는 코드 생략) ... plt.title(f'n_neighbors = {n}') plt.show()
2. 선형 회귀: 데이터에 딱 맞는 선을 긋다
2-1. k-NN 회귀의 한계와 선형 회귀의 등장
k-NN 회귀는 훈련 세트 데이터의 범위 밖,
예를 들어 훈련 세트에서 가장 큰 농어보다 더 큰 농어의 무게를 예측할 수 없는 명확한 한계가 있습니다.
이를 해결하기 위해 데이터의 패턴을 학습하여 가장 잘 맞는 직선을 찾는 선형 회귀 알고리즘을 사용합니다.
2-2. 단순 선형 회귀
데이터에 가장 잘 맞는 하나의 직선을 학습하는 알고리즘입니다.
기울기(coefficient)와 절편(intercept)이라는 두 개의 값만 학습하면, 어떤 길이의 농어라도 무게를 예측할 수 있습니다.
from sklearn.linear_model import LinearRegression # 선형 회귀 모델 훈련 lr = LinearRegression() lr.fit(train_input, train_target) # 50cm 농어의 무게 예측 prediction = lr.predict([[50]]) print(prediction) # 출력: [1241.83...] # 학습된 직선의 기울기와 절편 확인 print(lr.coef_, lr.intercept_) # 출력: [39.01...] -709.01...2-3. 다항 회귀: 직선을 곡선으로 업그레이드하기
하지만 농어의 길이와 무게 관계처럼, 데이터가 직선보다는 곡선 형태를 띨 때가 많습니다.
이때는 기존 특성(길이)을 제곱하여 2차 방정식 형태의 곡선을 학습하는 다항 회귀를 사용하면 예측 성능을 크게 높일 수 있습니다.
import numpy as np # 훈련 데이터를 제곱하여 2차항 추가 (길이 -> 길이, 길이^2) train_poly = np.column_stack((train_input**2, train_input)) test_poly = np.column_stack((test_input**2, test_input)) # 다항 회귀 모델 훈련 lr = LinearRegression() lr.fit(train_poly, train_target) # 50cm 농어의 무게 예측 prediction = lr.predict([[50**2, 50]]) print(prediction) # 출력: [1573.98...]
3. 특성 공학과 다중 회귀: 더 많은 정보로 똑똑하게 예측하기
3-1. 특성 공학(Feature Engineering)이란?
특성 공학은 기존의 특성(길이, 높이, 두께 등)을 사용해 새로운 특성을 만들어내는 과정입니다.
각 특성을 제곱하거나 서로 곱해서 더 복잡하고 예측에 도움이 되는 정보를 모델에 제공할 수 있습니다.
import pandas as pd from sklearn.preprocessing import PolynomialFeatures, StandardScaler # pandas로 농어 데이터 준비 (길이, 높이, 두께 특성 사용) df = pd.read_csv('https://bit.ly/perch_csv_data') perch_full = df.to_numpy()3-2. 다항 특성으로 모델 성능 높이기
PolynomialFeatures를 사용하면 길이, 높이, 두께 특성들을 조합하여 제곱항(길이², 높이²)이나 교차항(길이 × 높이)같은 새로운 특성들을 자동으로 생성할 수 있습니다. 이렇게 생성된 여러 특성을 동시에 활용하여 예측하는 것을 다중 회귀라고 합니다.
from sklearn.preprocessing import PolynomialFeatures import numpy as np # 예시 훈련 데이터 (농어의 길이, 높이, 두께) # 2마리의 농어 데이터가 있다고 가정 train_full = np.array([[25.4, 8.9, 4.1], [30.0, 9.8, 5.1]]) # 2차항 특성을 만들어주는 변환기 생성 # degree=2: 2차항까지 생성 (제곱항, 교차항) # include_bias=False: y절편을 위한 특성(값이 1인 열)은 생성하지 않음 (선형 모델이 자동으로 처리하므로) poly = PolynomialFeatures(degree=2, include_bias=False) # 훈련 데이터를 사용하여 새로운 특성 생성 train_poly = poly.fit_transform(train_full) print("원본 특성:", poly.feature_names_in_) print("원본 데이터 모양:", train_full.shape) # 출력: 원본 데이터 모양: (2, 3) print("\\n변환된 특성 이름:", poly.get_feature_names_out()) print("변환된 데이터 모양:", train_poly.shape) # 출력: 변환된 데이터 모양: (2, 9) print("\\n변환된 데이터 (첫 번째 샘플):\n", train_poly[0])
4. 규제 회귀: 모델이 과열되지 않도록 제어하기
특성이 많아지면 모델이 매우 복잡해져 훈련 데이터에만 과하게 학습하는 과대적합 문제가 다시 발생할 수 있습니다.
규제(Regulation)는 모델의 계수(기울기) 값이 너무 커지지 않도록 페널티를 부과하여 과대적합을 방지하는 기법입니다.
4-1. 릿지(Ridge) 회귀
릿지 회귀는 모델의 계수를 제곱한 값을 기준으로 규제를 적용합니다. 계수의 크기를 전체적으로 줄여주지만 0으로 만들지는 않습니다.
alpha 매개변수로 규제의 강도를 조절하며, 최적의 alpha 값을 찾는 것이 중요합니다.
from sklearn.linear_model import Ridge # 최적의 alpha 값을 찾기 위해 훈련/테스트 점수를 기록 train_score = [] test_score = [] alpha_list = [0.001, 0.01, 0.1, 1, 10, 100] for alpha in alpha_list: ridge = Ridge(alpha=alpha) ridge.fit(train_scaled, train_target) train_score.append(ridge.score(train_scaled, train_target)) test_score.append(ridge.score(test_scaled, test_target))4-2. 라쏘(Lasso) 회귀
라쏘 회귀는 모델 계수의 절댓값을 기준으로 규제를 적용합니다.
릿지와 달리, 중요하지 않은 특성의 계수를 0으로 만들어 버리는 강력한 특징이 있습니다. 이는 모델의 복잡도를 낮추면서 동시에 효과적인 특성 선택(Feature Selection)까지 가능하게 합니다.
from sklearn.linear_model import Lasso # alpha=10으로 라쏘 모델 훈련 lasso = Lasso(alpha=10) lasso.fit(train_scaled, train_target) # 계수가 0이 된 특성의 개수 확인 zero_coeffs = np.sum(lasso.coef_ == 0) print(f"계수가 0이 된 특성의 개수: {zero_coeffs}") # 출력: 계수가 0이 된 특성의 개수: 4라쏘 회귀를 통해 9개의 특성 중 4개의 불필요한 특성을 자동으로 제거하고, 모델을 더 단순하고 해석하기 쉽게 만들었습니다.
마치며: 올바른 회귀 모델 선택의 중요성
오늘은 가장 직관적인 k-NN 회귀부터 시작하여,
데이터의 패턴을 학습하는 선형/다항 회귀, 그리고 모델을 안정화시키는 릿지/라쏘 규제까지 폭넓게 살펴보았습니다.
단순한 모델은 과소적합의 위험이, 너무 복잡한 모델은 과대적합의 위험이 항상 존재합니다.
데이터의 특성을 잘 파악하고, 특성 공학과 규제를 적절히 활용하여 최적의 균형점을 찾는 것이 성공적인 예측 모델을 만드는 핵심입니다.
오늘 배운 내용을 바탕으로 여러분의 데이터에 가장 적합한 회귀 모델을 찾아보세요!
코드 출처:
https://github.com/rickiepark/hg-mldl2/blob/main/03-1.ipynb
hg-mldl2/03-1.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
https://github.com/rickiepark/hg-mldl2/blob/main/03-2.ipynb
hg-mldl2/03-2.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
https://github.com/rickiepark/hg-mldl2/blob/main/03-3.ipynb
hg-mldl2/03-3.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
강의 출처:
https://www.youtube.com/watch?v=FaEcLpSZNtg&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=7
'Study > 머신러닝 딥러닝' 카테고리의 다른 글
혼공머신 CH 06 비지도 학습 (0) 2025.09.26 혼공머신 CH 05 트리 알고리즘 (0) 2025.09.25 혼공머신 Ch 04 다양한 분류 알고리즘 (0) 2025.09.24 혼공머신 Ch 02 데이터 다루기 (1) 2025.09.22 혼공머신 Ch 01 나의 첫 머신러닝 (0) 2025.09.21 - k값이 작으면 (e.g., k=1):