24.05.14 08:05 작성
·
125
0
안녕하세요 선생님
주피터 노트북 201_REGRESSION_BIKE_SHARING_MODELS 중 Model Evaluation Test: LinearRegression 에 관하여 질문드립니다.
predict_bikecount함수에서 , y_train 값을 casual_log 와 registered_log로 둔게 아닌 그냥 count 값으로 바로 사용했을때 predict값의 배열중에 음수 값으로 리턴 되는 것들이 있습니다.
[코드 예시]
X_train = df_train[ml_columns].copy()
y_train = df_train['count'].copy()
X_test = df_test[ml_columns].copy()
LiRe = LinearRegression()
LiRe_model = LiRe.fit(X_train, y_train)
LiRe_model.predict(X_test)
리턴값 : array([-64.76111758, -55.17545696, -50.25089772, ..., 259.71536368, 271.23511233, 266.73978586])
LinearRegression 뿐만아닌 Random Forest Regressor 같은 다른 모델을 사용 할 때도 count값을 log변환 하지 않고 바로 예측하게 되면 음수값이 예측되는데요..
"kaggle 에서 rmsle로 scroing값을 제출 해야한다고 규칙이 정해져있어" log로 예측값을 변환한 후 처리하는 줄 알았는데, 그것보다 앞서 이런 회귀모델은 전부 내부적으로 처리될때 그냥 계산을 (로그변환을 하지 않고)하게되면 음수로 나오기 때문에 log처리를 해야하는건지... 정확하게 이해가 되지 않네요
어떤 이유에서 바로 count (log처리를 하지 않고) 를 예측하게 되면 음수가 리턴 되는건가요??
- 본 강의 영상 학습 관련 문의에 대해 답변을 드립니다. (어떤 챕터 몇분 몇초를 꼭 기재부탁드립니다)
- 이외의 문의등은 평생강의이므로 양해를 부탁드립니다
- 현업과 병행하는 관계로 주말/휴가 제외 최대한 3일내로 답변을 드리려 노력하고 있습니다
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
답변 1
0
2024. 05. 14. 10:38
안녕하세요. 답변 도우미입니다.
회귀 모델에서 음수 예측값이 나오는 이유와 로그 변환의 필요성에 대해 설명드리겠습니다.
LinearRegression과 같은 선형 회귀 모델은 종속 변수(y 값)에 대해 선형 관계를 가정합니다. 즉, 모델은 (y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n) 형태의 예측을 수행합니다. 이 때, 독립 변수(x 값)들의 조합에 따라 예측값(y 값)이 음수가 될 수 있습니다.
자전거 대여 수(count) 데이터는 보통 0 이상의 값을 가집니다. 그러나 모델이 이를 고려하지 않고 회귀 직선을 적합시키면, 일부 경우에서 음수 값이 예측될 수 있습니다. 이는 특히 데이터의 분포가 비대칭적이거나 정규 분포가 아닐 때 더 두드러집니다.
로그 변환은 종속 변수의 분포를 정규화하는 데 도움이 됩니다. 로그 변환을 통해 데이터의 분포를 보다 정규 분포에 가깝게 만들 수 있습니다. 이렇게 하면 모델이 예측하는 값이 음수가 될 확률이 줄어듭니다. 로그 변환을 적용하면 다음과 같은 효과를 기대할 수 있습니다:
정규화: 로그 변환은 오른쪽으로 치우친 분포를 보다 대칭적인 분포로 만들어줍니다.
변동성 감소: 큰 값들의 변동성을 줄여주어 모델이 더 안정적으로 예측할 수 있게 합니다.
모델의 성능 향상: 회귀 모델의 가정(예: 선형성)을 더 잘 만족시켜 모델의 성능을 향상시킬 수 있습니다.
다음은 로그 변환을 적용하여 LinearRegression 모델을 사용하는 예제입니다:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
# 예시 데이터 로드
# df_train, df_test는 자전거 대여 데이터를 포함하는 데이터프레임입니다.
df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')
ml_columns = ['feature1', 'feature2', 'feature3'] # 적절한 피처로 변경하세요.
# 입력 변수와 타겟 변수 설정
X_train = df_train[ml_columns].copy()
y_train = np.log1p(df_train['count']).copy() # 로그 변환 적용
X_test = df_test[ml_columns].copy()
# 모델 학습 및 예측
LiRe = LinearRegression()
LiRe_model = LiRe.fit(X_train, y_train)
y_pred_log = LiRe_model.predict(X_test)
# 로그 변환된 값을 원래 스케일로 복원
y_pred = np.expm1(y_pred_log)
print(y_pred)
이와 같이 로그 변환을 통해 예측값을 처리하면 음수 값이 나오는 것을 방지할 수 있으며, 모델의 예측 성능도 향상시킬 수 있습니다.
감사합니다.