7강 - 사이킷런으로 선형 회귀 모델 만들어 보기
2021. 6. 17. 21:10ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
7강 - 사이킷런으로 선형 회귀 모델 만들어 보기

지난 시간에...

아주 큰 농어

왜 예측과 달랐을까?
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
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
9강 - 로지스틱 회귀 알아보기 (0) | 2021.06.24 |
---|---|
8강 - 특성 공학과 규제 알아보기 (0) | 2021.06.17 |
6강 - 회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어 보기 (0) | 2021.06.17 |
5강 - 정교한 결과 도출을 위한 데이터 전처리 알아보기 (0) | 2021.06.17 |
4강 - 훈련 세트와 테스트 세트로 나누어 사용하기 (0) | 2021.05.27 |