스터디
스터디 범위
Chapter 03 회귀 알고리즘과 모델 규제
- 03-1 k-최근접 이웃 회귀 ▶️회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어 보기
- 03-2 선형 회귀 ▶️ 사이킷런으로 선형 회귀 모델 만들어 보기
- 03-3 특성 공학과 규제 ▶️특성 공학과 규제 알아보기
스터디 내용
03-1 k-최근접 이웃 회귀 ▶️회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어 보기
- numpy 라이브러리의 reshape() 메서드로 크기가 다른 배열을 생성할 수 있음
- sklearn.neighbers 모듈에서 KNeighborsRegressor 메소드로 K-Nearest Neighbors 회귀 알고리즘 사용 가능
- 분류 모델의 경우 score값이 테스트 세트의 샘플을 정확하게 분류한 개수의 비율이며, 회귀 모델의 경우 '결정계수'로 평가함
- 결정계수(R^2)란?
- R^2 = 1 - (Σ(target - predict)^2 / Σ(target - average)^2)
- 만약 타깃의 평균 정도를 예측하는 수준이라면 R^2은 0에 가까워지고, 예측이 타깃에 가까워지면 1에 가까워짐
- 여기서, sklearn.metrics 모듈에서 mean_absolute_error 메소드로 평균 절댓값 오차를 계산 가능
- 일반적으로 훈련 세트의 점수보다 테스트 세트의 점수(score)가 조금 낮음
- 테스트 세트의 점수가 너무 낮다면? 오버피팅이며, 모델을 덜 복잡하게 만들어야 함(knn의 경우, k 값 감소)
- 반대로 테스트 점수가 너무 높거나 두 점수 모두 낮다면? 언터피팅이며, 모델을 덜 복잡하게 만들어야 함(knn의 경우, k 값 증가)
03-2 선형 회귀 ▶️ 사이킷런으로 선형 회귀 모델 만들어 보기
선형 회귀: 특정과 타깃 사이의 관계를 가장 잘 나타내는 선형 방정식
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
# 선형 회귀 모델 훈련
lr.fit(train_input, train_target)
# 50cm 농어에 대한 예측: [1241.83860323]
print(lr.predict([[50]]))
// 방정식의 변수: [39.01714496] -709.0186449535477
print(lr.coef_, lr.intercept_)
# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)
# 15에서 50까지 1차 방정식 그래프를 그립니다
plt.plot([15, 50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])
- lr.fit을 통해 객체를 훈련하며, 계수(가중치)는 coef_, bias 은 intercept_ 에서 '모델 파라미터' 확인가능
다항 회귀: 특정과 타깃 사이의 관계를 가장 잘 나타내는 다항 방정식
train_poly = np.column_stack((train_input ** 2, train_input))
test_poly = np.column_stack((test_input ** 2, test_input))
print(train_poly.shape, test_poly.shape)
lr = LinearRegression()
lr.fit(train_poly, train_target)
# [1573.98423528]
print(lr.predict([[50**2, 50]]))
# [1.01433211 -21.55792498] 116.0502107827827
print(lr.coef_, lr.intercept_)
# 구간별 직선을 그리기 위해 15에서 49까지 정수 배열을 만듭니다
point = np.arange(15, 50)
# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)
# 15에서 49까지 2차 방정식 그래프를 그립니다
plt.plot(point, 1.01*point**2 - 21.6*point + 116.05)
- numpy의 column_stck 메소드를 이용해서 특정 컬럼을 추가한 행렬을 생성할 수 있음
03-3 특성 공학과 규제 ▶️특성 공학(Feature Engineering)과 규제(Regularization) 알아보기
특정 공학(Feature Engineering): 주어진 특정을 조합하여 새로운 특성을 만드는 일련의 작업으로, numpy의 PolynomialFeatures 메서드로 주어진 특성을 곱셈 또는 제곱하여 새로운 특성 생성.
추가로, 이처럼 여러 개의 특성을 사용하는 회귀 모델을 '다중 회귀 모델'이라 함
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
poly.fit([[2, 3]])
train_poly = poly.transform([[2, 3]])
test_poly = poly.transform([[2, 3]])
# [[1. 2. 3. 4. 6. 9.]]
print(poly.transform([[2, 3]]))
# array(['1', 'x0', 'x1', 'x0^2', 'x0 x1', 'x1^2'], dtype=object)
poly.get_feature_names_out()
- 하이퍼 파라미터: degree(최고 차수 지정), interaction_only(거듭제곱항 포함 여부), include_bias(절편특성 추가 여부)
규제(Regularization): 훈련 세트를 너무 과도하게 학습하지 못하도록 하는 방법으로, 선형 회귀의 경우 계수(기울기)의 크기를 작게 만듦
1) 정규화 전처리 과정: 특성의 스케일이 정규화되지 않으면 곱해지는 계수 값도 차이 나게 되기에 정규화 과정 필요.
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_poly)
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)
중요! 여기에서 훈련세트의 통계 값으로 테스트 세트를 변환해야합니다!!
2) 규제 모델 사용: 선형회귀 모델에 규제를 추가한 모델을 릿지(ridge)와 라쏘(lasso)라고 부름.
2-1) 릿지(Ridge): 규제가 있는 회귀 알고리즘으로 선형 모델의 계수를 작게 만들어 과대 적합을 완화시킴. 일반적으로 많이 사용.
from sklearn.linear_model import Ridge
ridge = Ridge()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))
2-2) 라쏘(Lasso): 규제가 있는 회귀 알고리즘으로 계수를 0으로도 만들 수 있어 필요한 feature를 뽑는데 사용하기도 함.
from sklearn.linear_model import Lasso
lasso = Lasso()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))
# 0이 된 계수의 개수 추출
print(np.sum(lasso.coef_ == 0)
2-3) 최적의 하이퍼 파라미터 alpha 값 찾기 - alpha: 규제의 강도 조절. 클수록 규제 강함.
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))
plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()
추가 하이퍼 파라미터
- alpha: 규제의 강도 조절. 클수록 규제 강함.
- solver: 최적의 모델을 찾기 위한 방법을 지정. 기본값 'auto'이며, 데이터에 따라 자동으로 선택됨. sag, saga 등 다양
- sag: sklearn v0.17 이후 추가됨. 확률적 평균 경사 하강법 알고리즘. 특성과 샘플수가 많을 때 성능 좋음.
- saga: sklearn v0.19 이후 추가됨. sag의 개선 버전.
- random_state: 넘파이 난수 시드값 지정 가능
미션
기본 미션
Ch.03(03-1) 2번 문제 풀력 그래프 인증하기
# k-최근접 이웃 회귀 객체를 만듭니다
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.savefig('n_neighbors_{}'.format(n))
plt.show()
선택 미션
모델 파라미터에 대해 설명하기
>> 머신러닝 모델이 학습할 수 있는 파라미터. 반면에 사람이 지정하는 파라미터는 '하이퍼 파라미터'라 합니다. 추가로, 이 책에서는 함수와 클래스의 파라미터는 매개변수라 하고 모델과 관련된 파라미터(모델 파라미터, 하이퍼파라미터)는 그래도 파라미터라고 표현하였습니다.
참고
- [Github] 예제 소스: https://github.com/rickiepark/hg-mldl
- [Google Colab] 예제 소스: https://colab.research.google.com/github/rickiepark/hg-mldl
- Q&A: 박해선 저자님의 github: https://groups.google.com/g/ml-dl-book-qna?pli=
- 유튜브 강의: 👉전체 강의 목록: https://www.youtube.com/playlist?list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX
혼공학습단, 혼공, 혼공머신, 혼자 공부하는, 박해선, 혼자 공부하는 머신러닝+딥러닝
'Project Process > Study Report' 카테고리의 다른 글
[영어] 리얼클래스 학습 일기: 일상 회화 표현 정리(7월 3주차) (0) | 2023.07.25 |
---|---|
[Study] 혼공학습단 10기: 혼자 공부하는 머신러닝+딥러닝(박해선) - Chapter 04 다양한 분류 알고리즘(3주차) (0) | 2023.07.20 |
[영어] 리얼클래스 학습 일기: 일상 회화 표현 정리(7월 2주차) (0) | 2023.07.16 |
[영어] 리얼클래스 학습 일기: 일상 회화 표현 정리(7월 1주차) (0) | 2023.07.10 |
[Study] 혼공학습단 10기: 혼자 공부하는 머신러닝+딥러닝(박해선) - Chapter 01-02 데이터 다루기(1주차) (1) | 2023.07.07 |