인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박태준님의 프로필 이미지
박태준

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

작업형2 모의문제2

회귀모형 질문

해결된 질문

작성

·

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까지 입력했는데 아무 값도 출력이 안되네요ㅠ

그리고 데이터 저장 후에는

Screenshot_20240314_145950_Samsung Internet.jpg
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)
박태준님의 프로필 이미지
박태준
질문자

mean_squared_error(y_val, pred)**0.5라고 외웠었는데, 그새 까먹고 **2라고 적었네요ㅠ 오류 짚어주셔서 감사합니다!

질문2에 대한 답변도 참고하겠습니다! 감사합니다!

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를 참고하시거나, 추가적으로 문의해주시기 바랍니다.

박태준님의 프로필 이미지
박태준

작성한 질문수

질문하기