AI/Machine Learning
[ML] Sklearn cross_val_score Custom Scoring 사용하기
운호(Noah)
2021. 1. 4. 14:58
- Sklearn cross_val_score() 사용 시, 이미 존재하는 많은 scoring 방법들을 사용할 수 있지만
- 경우에 따라 직접 scoring을 만들어 사용하고 싶을 때가 있다.
- 이 때, 다음과 같이 Custom Scoring을 만들어 사용할 수 있다.
Custom Scoring 함수 생성
from sklearn.metrics import r2_score, mean_squared_error
def mean_absolute_percentage_error(y_test, y_pred):
y_test, y_pred = np.array(y_test), np.array(y_pred)
return np.mean(np.abs((y_test - y_pred) / y_test)) * 100
def custom_scoring(y_test, y_pred):
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
return mape
cross_val_score() 시 Custom Scoring 함수 사용
import xgboost as xgb
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.metrics import make_scorer
# 모델 객체 생성
model = xgb.XGBRegressor(learning_rate=0.1,
max_depth=5,
n_estimators=100)
# 상세 조정한 kfold 객체 생성
kfold = KFold(n_splits=10, shuffle = True, random_state=0)
# cross_val_score 진행
scores = cross_val_score(model ,
train_feature ,
train_target ,
cv=kfold,
n_jobs=-1,
scoring=make_scorer(custom_scoring,greater_is_better=False)
)
# 최종적으로 평균을 내어 정확도를 간단히 한다.
print('교차 검증별 정확도:',np.round(scores, 4))
print('평균 검증 정확도:', np.round(np.mean(scores), 4))
KFold 파라미터
- n_splits : 몇 개의 fold를 사용할지
- shuffle : fold 분할 전, 데이터를 무작위로 섞을지
- random_state : fold 분할 후, fold를 그대로 유지할지
cross_val_score 파라미터
- model : 모델객체
- train_feature : Train data의 feature
- train_target : Train data의 target
- cv : 상세 조정한 kfold 객체
- n_jobs : 병렬로 실행할 작업 수 (-1은 전부)
- scoring : make_scorer 객체
- make_scorer의 custom_scoring : custom scoring 함수
- make_scorer의 greater_is_better : False는 score 값이 낮은게 좋음을 의미