해결된 질문
작성
·
218
0
문제2. 에버비엔비 가격은?
평가: R_Squared, MAE, MSE, RMSE, RMSLE, MAPE
문제에서
#데이터 전처리
train = train.drop('id', axis=1)
test_id = test.pop('id')
target = train.pop('price')
a = [ 'name', 'host_id', 'host_name', 'last_review' ]
train = train.drop(a, aixs=1)
test = test.drop(a, axis=1)
train[reviews_per_month] = train[reviews_per_month].fillna(0)
test[reviews_per_month] = test[reviews_per_month].fillna(0)
#라벨인코딩
cols = train.select_dtypes(include='object').columns
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for col in cols:
train[col] = le.fit_transform(train[col])
test[col] = le.transform(test[col])
#train_test_split
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state=2022)
#랜덤포레스트
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
#rmse
from sklearn.metrics import mean_sqaured_error
def rmse(y_val, pred):
return mean_squared_error(y_val, pred)**2
(질문1)
이렇게 했는데 rmse에서 **2까지 입력하면 예측값이 0.xx라고 출력되어야 하지 않나요?
**2까지 입력했는데 아무 값도 출력이 안되네요ㅠ
그리고 데이터 저장 후에는
price가 406, 160..이렇게 출력됩니다!
강사님 풀이에는 295, 155..이던데
값이 달라도 괜찮은건가요?
(질문2)
이후 강의에서 rmse를
from sklearn.metrics import mean_squared_error
def rmse(y_val, pred):
return mean_squared_error(y_val, pred)**2로 하시던데 rmsle나 mape도 numpy를 사용하지 않고 간단하게 표현하는 방법이 있을까요?
답변 2
1
질문 1:
rmse 함수에서 mean_squared_error(y_val, pred)**2로 작성하면 잘못된 계산이에요~. mean_squared_error 함수는 이미 MSE 값을 반환하므로, RMSE를 구하려면 MSE에 제곱근을 씌워야 합니다. 따라서 아래와 같이 수정해야 합니다.
from sklearn.metrics import mean_squared_error
def rmse(y_val, pred):
return mean_squared_error(y_val, pred)**0.5
를 사용하거나 넘파이를 사용한다면 아래와 같이 사용할 수 있어요
import numpy as np
from sklearn.metrics import mean_squared_error
def rmse(y_val, pred):
return np.sqrt(mean_squared_error(y_val, pred))
데이터 전처리 과정에서 발생하는 차이로 인해 예측 결과의 값이 다를 수 있습니다. 데이터 전처리 단계에서 어떤 작업을 수행했는지, 특성 선택이나 인코딩 방식 등에 따라 예측 결과가 달라질 수 있습니다. 따라서 값이 다르다고 해서 꼭 문제가 있는 것은 아닙니다. 중요한 것은 모델의 성능을 평가하는 지표(RMSE, MAE 등)를 확인하고, 그 값을 기준으로 모델의 성능을 판단하는 것입니다.
질문2
rmsle를 넘파이 없이 계산하려면 사이킷런에서 제공하지 않기 때문에 상당히 코드가 복잡해져요!
mape는 아래과 같이 사용할 수 있어요!
from sklearn.metrics import mean_absolute_percentage_error
def mape(y_val, pred):
return mean_absolute_percentage_error(y_val, pred)
0
안녕하세요, 인프런 AI 인턴입니다.
훈련님의 질문에 답변드리겠습니다.
(질문1)
RMSE(Root Mean Squared Error) 계산 시 제곱근을 취해야 정확한 값이 나옵니다.
아래 함수를 수정하여 사용해보세요.
from sklearn.metrics import mean_squared_error
def rmse(y_val, pred):
return mean_squared_error(y_val, pred)**0.5
제곱을 하지 않고 제곱근을 취해야 하므로 **2
가 아닌 **0.5
를 함수에 사용하면 됩니다.
예측값이 0.xx라고 나와야 하는 것이 아니라, 실제 y_val과 pred 사이의 RMSE 값을 계산한 결과가 나와야 합니다. 만약 값이 출력되지 않았다면, 함수 호출 시 print 문을 활용하여 결과를 출력해보세요.
(질문2)
RMSLE나 MAPE 같은 평가지표도 NumPy를 사용하지 않고 구현할 수 있습니다.
아래는 RMSLE와 MAPE를 계산하는 간단한 함수 예시입니다.
import numpy as np
# RMSLE
def rmsle(y_val, pred):
return np.sqrt(np.mean(np.log1p(pred) - np.log1p(y_val))**2)
# MAPE
def mape(y_val, pred):
return np.mean(np.abs((y_val - pred) / y_val)) * 100
다만, 위 함수들에서 np.log1p와 np.abs 같은 NumPy의 기능들을 사용하고 있습니다.
기본 Python 기능만을 사용해서 함수를 구현하려면 조금 더 복잡해질 수 있으나, 대부분의 데이터 과학 작업에서 NumPy는 표준 라이브러리처럼 널리 사용되므로 사용에 부담이 없습니다.
각각의 경우에 대해 적절한 값을 얻었다면, 이를 실제로 각 평가 지표에 따라 값을 계산해 성능을 평가할 수 있습니다.
기타 더 궁금한 점이 있다면 인프런 FAQ를 참고하시거나, 추가적으로 문의해주시기 바랍니다.
mean_squared_error(y_val, pred)**0.5라고 외웠었는데, 그새 까먹고 **2라고 적었네요ㅠ 오류 짚어주셔서 감사합니다!
질문2에 대한 답변도 참고하겠습니다! 감사합니다!