강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của ycc38198195
ycc38198195

câu hỏi đã được viết

[Bản sửa đổi] Hướng dẫn hoàn hảo về máy học Python

Bài tập hồi quy 1: Dự báo nhu cầu thuê xe đạp (Chia sẻ) - 02

복습을 하면서 궁금증이 생겨서 올립니다. RMSLE 적용시, -1보다 작은 음수값을 수학적으로 대입할 수 없는데.,..

Đã giải quyết

Viết

·

1.1K

1

evaluate_regr(y_test, pred)

에 test데이터 세트와 예측 값을 넣는데,

y_test의 경우

y_test[y_test < -1] 에 해당하는 값이 없기 때문에, np.log1p에 대입할 수 있지만,

pred[pred < -1]에 해당하는 값은 존재하기 때문에, 예측값이 -1이보다 작은 경우에는 np.log1p에 대입할 수 없다고 생각합니다.

 

그래서, mean_squared_log_error를 호출하여 squared = False로 계산을 하였더니,

ValueError: Mean Squared Logarithmic Error cannot be used when targets contain negative values.

라고 오류가 뜨더라구요.

결국 -1보다 작은 음수값을 대입할 수 없다는 수학적 오류 때문이겠지요...

 

 

 

하지만, 선생님께서 하신 RMSLE

def rmsle(y, pred): log_y = np.log1p(y) log_pred = np.log1p(pred) ## log1p 랑 expm1은 하나의 쌍임. squared_error = (log_y - log_pred) ** 2 rmsle = np.sqrt(np.mean(squared_error)) return rmsle

를 활용한다면 오류가 뜨지 않는데,

제가 생각하는 방식에는 어떤 문제점이 있을까요?

python머신러닝통계

Câu trả lời 4

0

ycc3819님의 프로필 이미지
ycc3819
Người đặt câu hỏi

감사합니다. RMSLE를 사용할 때에는 series로 입력을 해야되는군요.

저는 선생님께서 사용하지 않으신다던 mean_squared_log_error를 사용해보려고 하다가 이러한 오류를 발견하게 되었네요.

복습 열심히 해서 캐글강의까지 듣도록 하겠습니다 ^^

0

ycc3819님의 프로필 이미지
ycc3819
Người đặt câu hỏi

선생님께서 이후 내용에서 설명하셨던 부분중 predict_count가 -1보다 작은 값들로 데이터를 정렬해도

다음과 같이 존재합니다.

 

0

ycc3819님의 프로필 이미지
ycc3819
Người đặt câu hỏi

예측 값에 대해서

pred[pred < -1]로 확인을 해보니,

-1보다 작은 값들이 존재하고, rmsle를 정의하실 때, 이 부분에서 먼저 오류가 나와야 하는 것이 아닌가 생각이 됩니다.

예측값이 횟수이기 때문에 오류가 나오지 않는 다라는 것은 이해가 갑니다.

하지만, pred[pred < -1] 결과가 -1보다 작은 값들이 나오는데,

pred = lr_reg.predict(X_test)

와 같이 선형회귀 방식으로 예측한 결과값(pred)에 대해서 오류가 있는 걸까요?

dooleyz3525님의 프로필 이미지
dooleyz3525
Người chia sẻ kiến thức

np.log1p(pred[pred < -1]) 이 어떤 값이 나오는지 확인 부탁드립니다.

dooleyz3525님의 프로필 이미지
dooleyz3525
Người chia sẻ kiến thức

확인해 본 결과 y_test 값이 Series로 입력이 되는 군요. Series의 경우 np.mean 처리시에 nan 값이 제외되고 연산이 되는 군요.

log1p(pred)에서 pred가 -1 보다 작은 음수값은 모두 nan이 됩니다.

그런데 rmsle(y, pred)에서 log_y는 y값이 Series라 Series가 되고, squared_error도 Series가 됩니다. 그런데 여기에 np.mean(squared_error)를 수행하면 nan 값들은 제외가 되고 평균값을 구하게 됩니다.

아래와 같이 y_test를 Series가 아닌 array로 입력하게 되면 RSMLE는 nan 값이 됩니다.

evaluate_regr(np.array(y_test) ,pred)

y_test값을 Series가 아니라 array로 입력하는 게 원칙적으로는 더 정확할 것 같습니다. 다만 pred 가 -1보다 작아지는 경우에 RMSLE를 계산하려면 기존대로 Series값을 넣으면 좋을 것 같습니다.

저도 한수 배웠습니다. 좋은 질문 감사합니다.

0

dooleyz3525님의 프로필 이미지
dooleyz3525
Người chia sẻ kiến thức

안녕하십니까,

말씀하신 내용이 맞습니다.

자전거 대여 예측은 대여 횟수를 예측하기 때문에 학습 데이터도 0보다 크고, 예측데이터도 모두 0보다 큰 값이 나와서 문제가 발생하지 않았습니다.

Log 계열 평가지표를 사용할 때는 실제값과 예측값이 모두 0보다 큰값이 나오는지 먼저 확인해 줘야 합니다.

감사합니다.

Hình ảnh hồ sơ của ycc38198195
ycc38198195

câu hỏi đã được viết

Đặt câu hỏi