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

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

작성자 없음

작성자 정보가 삭제된 글입니다.

[개정판] 파이썬 머신러닝 완벽 가이드

회귀 실습 1: 자전거 대여(공유) 수요 예측 - 02

생성한 예측모델로부터 최적 조건을 구하는 방법이 있을까요?

작성

·

272

0

안녕하세요 선생님, 강의를 보던 중 질문이 있어 이렇게 글 남깁니다.

 

1. 회귀 실습에서 여러 가지 모델로 성능을 측정해 보았습니다. 각각의 방법에서, MAE, MSE 등의 지표로 모델의 정확도를 측정합니다.

그런데 혹시, 이렇게 만든 모델들을 이용해서, 최고의 결과를 도출하는 지표들을 역으로 얻어내는 방법이 있을까요?

가령, XGBoost로 자전거 대여에 관한 모델 A을 만들었다고 가정해보겠습니다. 이 모델 A가 "B대 만큼의 자전거 대여량" 이 존재할 수 있다고 예측하였다고 한다면, 이 B를 도출해 내는 조건 C (여기엔 train input으로 주어졌던 holiday, workingday, weather, temp 등의 값이 들어있을 것으로 생각합니다.) 를 구해낼 수 있을까요?

만약 가능하다면, scikit-learn 이나 XGboost 등의 framework에서 내장함수가 존재하는지 알고 싶습니다.(구글링을 열심히 해 보았는데 관련 내용을 찾지 못하였습니다. 심지어 이렇게 조건들을 역으로 도출해내는 과정을 어떻게 부르는지 조차 모르겠습니다ㅠ)

2. 로컬에서, bike sharing demand 예제의 마지막 쉘에서 XGboost의 문제인지 쉘이 작동하지 않습니다. 버전에 따라 ndarray로 바꾸라는 말씀을 해주셔서 다음과 같이 코드를 고쳐보았지만, 실행되지 않습니다.

실습환경은 m1 mac, miniforge3 (m1에 anaconda가 호환되지 않을 때 설정한 환경이라 miniforge3를 이용중입니다.), python=3.9, numpy=1.22.3, pandas=1.4.2, xgboost=1.6.0 (1.5.x, 1.6.1 모두 작동하지 않았습니다.) 입니다.

혹시 제가 ndarray로 변환하라는 말씀을 제가 잘못 이해한것인지, 아니면 xgboost의 문제인건지 궁금합니다.

</>

from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor

# 랜덤 포레스트, GBM, XGBoost, LightGBM model 별로 평가 수행
rf_reg = RandomForestRegressor(n_estimators=500, verbose=10)
gbm_reg = GradientBoostingRegressor(n_estimators=500, verbose=1)
xgb_reg = XGBRegressor(n_estimators=500, verbose=0)
lgbm_reg = LGBMRegressor(n_estimators=500, verbose=1)

for model in [rf_reg, gbm_reg, xgb_reg, lgbm_reg]:
# XGBoost의 경우 DataFrame이 입력 될 경우 버전에 따라 오류 발생 가능. ndarray로 변환.
get_model_predict(model, np.array(X_train.values), np.array(X_test.values), np.array(y_train.values), np.array(y_test.values),is_expm1=True)

 

<에러 메세지>

---------------------------------------------------------------------------

XGBoostError Traceback (most recent call last)

/Users/h/Documents/dev/machine_learning/PerfectGuide-master/5장/5.9 Regression실습-Bike Sharing Demand.ipynb 셀 27 in <cell line: 11>()

9 lgbm_reg = LGBMRegressor(n_estimators=500, verbose=1)

11 for model in [rf_reg, gbm_reg, xgb_reg, lgbm_reg]:

12 # XGBoost의 경우 DataFrame이 입력 될 경우 버전에 따라 오류 발생 가능. ndarray로 변환.

---> 13 get_model_predict(model, np.array(X_train.values), np.array(X_test.values), np.array(y_train.values), np.array(y_test.values),is_expm1=True)

 

/Users/h/Documents/dev/machine_learning/PerfectGuide-master/5장/5.9 Regression실습-Bike Sharing Demand.ipynb 셀 27 in get_model_predict(model, X_train, X_test, y_train, y_test, is_expm1)

6 def get_model_predict(model, X_train, X_test, y_train, y_test, is_expm1=False):

----> 7 model.fit(X_train, y_train)

8 pred = model.predict(X_test)

9 if is_expm1 :

 

File ~/miniforge3/envs/tf/lib/python3.9/site-packages/xgboost/core.py:532, in _deprecate_positional_args.<locals>.inner_f(*args, **kwargs)

530 for k, arg in zip(sig.parameters, args):

531 kwargs[k] = arg

--> 532 return f(**kwargs)

 

File ~/miniforge3/envs/tf/lib/python3.9/site-packages/xgboost/sklearn.py:931, in XGBModel.fit(self, X, y, sample_weight, base_margin, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set, base_margin_eval_set, feature_weights, callbacks)

880 """Fit gradient boosting model.

881

882 Note that calling ``fit()`` multiple times will cause the model object to be (...) 928 Use `callbacks` in :py:meth:`__init__` or :py:meth:`set_params` instead.

...

[bt] (6) 7 _ctypes.cpython-39-darwin.so 0x0000000105202a80 PyCFuncPtr_call + 1176

[bt] (7) 8 python3.9 0x0000000104414acc _PyObject_MakeTpCall + 348

[bt] (8) 9 python3.9 0x000000010452090c call_function + 724

 

 

긴 글 읽어주셔서 감사합니다.

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 

1. 말씀하신 부분은 선형회귀의 회귀 계수와 비슷한 개념인것 같습니다만, 

만일 그렇다면 트리기반의 회귀의 경우는 회귀 계수는 아니고 feature importance가 있습니다.  

하지만 feature importance는 회귀식을 도출하는 것은 아닙니다. 

질문하신 내용이 회귀 계수와 비슷한 개념인지 확인 부탁드리며, 이 경우 트리 기반에서는 회귀 계수를 추출하기는 어렵고, feature importance로 개별 피처간의 중요도 비교로 대체 될 수는 있습니다. 

2. 아쉽게도 제가 맥 환경이 없어서 맥에서 해당 실습코드가 오류 발생하는지 확인이 어렵습니다.

다만 windows 환경에서는 별 문제가 없습니다. 

혹시 xgboost를 분류에서 사용할때는 별 문제가 없으셨는지요?

가능하시면 miniforge가 아니라 anaconda를 셋업해서 수행해보시는것도 좋을 것 같습니다. 

그래도 여전히 안되면 코랩에서 실습 코드가 수행 가능하니, 코랩에서 수행해보시면 어떨지요?

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기