7강 - 사이킷런으로 선형 회귀 모델 만들어 보기

2021. 6. 17. 21:10ICT 멘토링/혼자 공부하는 머신러닝+딥러닝

7강 - 사이킷런으로 선형 회귀 모델 만들어 보기

학습 로드맵

지난 시간에...

6강 복습

아주 큰 농어

실제론 1.5kg 예측은 1kg

왜 예측과 달랐을까?

 

50cm 농어의 이웃

# 50cm 농어의 이웃을 구합니다
distances, indexes = knr.kneighbors([[50]])

# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)

# 훈련 세트 중에서 이웃 샘플만 다시 그립니다
plt.scatter(train_input[indexes], train_target[indexes], marker='D')

# 50cm 농어 데이터
plt.scatter(50, 1033, marker='^')
plt.show()

길이가 늘어나면 무게도 늘어나야 하는데 최근접이웃은 가장 가까이에 있는 샘플만 이웃 샘플이 되기 때문에 극단적으로 큰 값이 있어도 이웃 샘플은 이 점을 고려하지 않음

범위 바깥의 것은 추정이 어려움

길이가 늘어났을 때 무게도 늘어나는 추세를 따라갈 수 있는 알고리즘 사용 필요

 

선형 회귀(linear regression)

선형 회귀

linear regression - 강력하고 많은 것들의 기반이 되는 알고리즘

직선의 방정식

추세를 잘 따라가는 것을 찾는 것이 중요!

 

LinearRegrssion

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
# 선형 회귀 모델 훈련
lr.fit(train_input, train_target)

# 50cm 농어에 대한 예측
print(lr.predict([[50]])
# //[1241.83860323]
print(lr.coef_, lr.intercept_)
# //[39.01714496] -709.0186449535477

 

 

학습한 직선 그리기

# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)

# 15에서 50까지 1차 방정식 그래프를 그립니다
plt.plot([15, 50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])

# 50cm 농어 데이터
plt.scatter(50, 1241.8, marker='^')
plt.show()

print(lr.score(train_input, train_target))
# //0.9398463339976039
print(lr.score(test_input, test_target))
# //0.8247503123313558

실제 샘플들은 2차 함수 형태를 띠고 있어 이걸 따라가면 더 잘 fit 할 수 있지 않을까?

 

다항 회귀

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)

print(lr.predict([[50**2,50]]))		# 제곱항과 일차항 순서 데이터 준비했을 때랑 똑같이 해야함!
# // [1573.98423528]
print(lr.coef_, lr.intercept_)
# // [	1.01433211	-21.55792498] 116.0502107827827 

학습한 직선 그리기

# 구간별 직선을 그리기 위해 15에서 49까지 정수 배열을 만듭니다.
point = np.arange(15,50)		#// x 포인트

# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)

# 15에서 49까지 2차 방정식 그래프를 그립니다
plt.plot(point, 1.01*point**2 - 21.6*point + 116.05)

# 50cm 농어 데이터
plt.scatter([50], [1574], marker='^')
plt.show()

print(lr.score(train_poly, train_target))
# //0.9706807451768623
print(lr.score(test_poly, test_target))
# //0.9775935108325122

그래프를 잘게 잘라서 그리면 됨. 1차 잘게 잘라서 2차로!

다항 회귀

이전 선형 회귀보다 모델의 성능이 더 좋아짐.

하지만 아직 test의 점수가 더 높으니까 훈련 세트를 조금 더 과적합 시킬 필요가 존재!

이건 다음 강에서! 

 

참고자료

https://www.youtube.com/watch?v=xkknXJeEaVA&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=7