혼공머신 03-3, 릿지 회귀에서 예측값이 마이너스 무게로 나옵니다.

726 views
Skip to first unread message

jae young Cho

unread,
Mar 25, 2021, 3:31:41 AM3/25/21
to 머신러닝/딥러닝 도서 Q&A
안녕하세요. 
좋은 책과 명료한 강의도 해주시고, 더불어 질문 공간도 마련해 주셔서 감사합니다.

릿지 회귀 부분을 책에 내용대로 따라 하였고, alpah=0.1 일 때, 과대적합과 과소적합 사이의 균형값이 나온다는 것을 확인해보았습니다. 
그런데, 하나의 입력값을 주었을 때 예측값이 어떻게 나오는지 보고자 다음 값을 주었는데
예측값이 마이너스 값으로 나왔습니다.

sample1 = np.array([10, 3, 1.5]).reshape(1, -1)
sample1_poly = poly.transform([[10, 3, 1.5]])
sample1_scaled = ss.transform(sample1_poly)
print(ridge.predict(sample1_scaled))
[-4.46486047]

입력값 [10, 3, 1.5] 는 농어 데이터 perch_full 에서 첫번째 두번째 사이의 값으로 하였습니다.

이번에는 농어데이터 전부에 대한 예측값을 출력하였습니다.
perch_full_poly = poly.transform(perch_full)
perch_full_scaled = ss.transform(perch_full_poly)
predict_weight = ridge.predict(perch_full_scaled)
print(predict_weight)
[ -14.8059787 20.76723368 33.76585006 49.7476322 63.32658428 80.48563269 82.99117158 89.5611224 89.34544044 88.69548007 119.43651478 117.3822914 122.07796041 131.96636386 132.69749351 128.09044325 134.98098285 131.49485187 139.40688721 138.79696946 154.59385631 142.54525003 135.44921061 159.00741944 185.66788099 169.07101278 193.03938732 178.55311344 204.06825102 225.90983978 308.19524706 245.534299 242.51331301 256.59569337 266.77379916 284.36544501 309.11090256 519.67073358 589.10585003 814.08584077 703.73370057 666.00390861 671.13534181 657.52567835 830.17391402 730.55570444 931.41992344 887.52374009 876.31931521 959.30814307 783.58108094 1028.29837571 971.77430435 1046.93631866 1128.57917491 1082.38188249]

첫번째 값이 마이너스로 예측했습니다.

원래의 농어 무게와 예측한 무게를 그래프로 그려보았습니다.
x_index = np.arange(predict_weight.size)
plt.plot(x_index, perch_weight, c='b')
plt.plot(x_index, predict_weight, c='r')
plt.ylabel('weight')
plt.show()
비교그래프.png

길이,높이,두께가 작은 농어에서 마이너스 무게가 예측되는 것을 해결하는 어떤 특별한 방법이 있을까요?

Haesun Park

unread,
Mar 25, 2021, 4:40:15 AM3/25/21
to jae young Cho, 머신러닝/딥러닝 도서 Q&A
안녕하세요. 박해선입니다.

책과 강의가 도움이 되신다니 다행입니다. ㅎ
예측 값이 음수가 되어서는 안되는 경우 선형 회귀는 이에 대한 처리를 잘 하지 못합니다.
예측 최댓값과 최솟값에 대한 제한이 없기 때문이죠.

가장 간단한 해결 방법은 음수로 예측되는 값을 주어진 문제에 맞는 최솟값으로 클리핑하는 것입니다.
예를 들어 실제 농어의 무게가 5g 이하는 없다고 가정하면 5 이하로 예측된 값은 모두 5로 바꾸는 식입니다.

또 다른 방법으로는 타깃에 log 함수를 적용하는 것입니다.
np.log(train_target)로 훈련한 모델을 사용해 예측을 만들고 
이를 다시 지수 함수로 복원하면 절대 음수가 나오지 않죠. 
예를 들면 다음과 같습니다.

ridge = Ridge(...)
ridge.fit(train_scaled, np.log(train_target))
log_prediction = ridge.predict(test_scaled)
print(np.exp(log_prediction))

감사합니다!

2021년 3월 25일 (목) 오후 4:31, jae young Cho <robo...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 '머신러닝/딥러닝 도서 Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ml-dl-book-qn...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ml-dl-book-qna/b4b439bc-e9a0-4f64-9ca1-eb84979df144n%40googlegroups.com을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages