gscv_xgb = GridSearchCV (estimator = xgb, param_grid = param_xgb, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_xgb.fit(X_train_sc, y_train_sc)
print("="*30)
print('XGB 파라미터: ', gscv_xgb.best_params_)
print('XGB 예측 정확도: {:.4f}'.format(gscv_xgb.best_score_))
print("="*30)
==============================
XGB 파라미터: {'max_depth': 10, 'min_child_weight': 1, 'n_estimators': 200}
XGB 예측 정확도: nan
==============================
상황
- Scikit-learn 라이브러리에서 제공하는 GridSearchCV 클래스를 사용하여 여러 하이퍼파라미터 시도 중에서 best score를 확인하고자 했음. (위 코드에서 gscv_xgb.bset_score_ 이 부분 !)
- 근데, bset_score_ 결과가 nan으로 나옴
분석
- 검색을 해보니, model fit이 제대로 안 됐을 때 이런 문제가 발생한다고 함
- 참고 링크 : https://datascience.stackexchange.com/questions/91225/why-gridsearchcv-returns-nan
- 위 링크에서 error_score="raise"로 error_score 파라미터를 raise로 수정하면 에러를 raise 할 수 있다고 함. (에러 메세지 확인이 가능해진다는 말)
- error_scor="raise"를 추가하고 에러 메세지를 확인해봤음
- # 에러 메세지 : ValueError: continuous is not supported => 연속은 지원되지 않습니다
- 위와 같은 에러 메세지가 떴는데, 여기서 continuous 라는 게 연속형 변수를 뜻하는 것임
- 코드를 다시 확인해보니 scoring = 'accuracy'라고 한 부분이 문제가 됐던 것.
- 내가 푸는 문제는 회귀(target이 연속형 변수)문제인데, accuracy는 분류(target이 범주형 변수)에만 사용할 수 있는 성능 평가 지표이기 때문! == 회귀문제에는 accuracy 지표가 지원되지 않음
- 연속형 변수 : 연속적인 값을 가질 수 있는 데이터
- 범주형 변수 : 수치로 측정이 불가능한 자료 (Q. 이산형 데이터와 헷갈림. 지금은 개념이 명확하지가 않다. -> 나중에 개념 정리하자!)
해결
- scoring = 'r2' 으로 수정하여 해결
r2 score란?
- https://igija.tistory.com/256 참고
- r2 score : R sqaured score(r 제곱 score), 회귀모델 성능 평가 지표
- 회귀 제곱합(SSR) / 총제곱합(SST) : 설명 가능한 분산(또는 편차)
- 총제곱합 : 관측값과 평균의 차이에서 기반
- 회귀제곱합 : 회귀예측값과 평균의 차이에서 기반 => 일반적으로 '실제 값의 분산 대비 예측값의 분산 비율' 로 정의
- 회귀 모델이 얼마나 '설명력' 이 있느냐를 의미
- 예측 모델과 실제 모델이 얼마나 강한 상관관계(Correlated)를 가지는가로 설명력을 요약할 수도 있음