최적화 후 더 나쁜 모델을 얻을 수 있습니까?
최근에 모델 최적화를 시도하고 있지만 어떤 이유로 최적화를 실행하려고 할 때마다 결국 모델 점수가 이전보다 나빠져서 뭔가 잘못했다고 생각합니다.
내 모델을 최적화하기 위해 매개 변수 그리드를 정의하고 열차 데이터에 적합하게 한 다음 결과에 따라 nre 매개 변수로 다시 실행합니다.
#ROUND 1
param_grid={
'max_depth': [3,4,5],
'learning_rate':[0.1,0.01,0.05],
'gamma': [0,0.25,1.0],
'reg_lambda':[0,1.0,10.0],
'scale_pos_weight':[1,3,5]
}
grid_search = GridSearchCV(estimator = clf_xgb, param_grid = param_grid,
cv = 3, n_jobs = -1, verbose = 2)
grid_search.fit(X_train,y_train)
grid_search.best_params_
>>>.....
(그리고 이제 매개 변수를 변경하는 결과에 따라 ...)
이 단계 후에는 최상의 하이퍼 파라미터를 선택하고 모델을 실행합니다.
clf_xgb=xgb.XGBClassifier(seed=42,
objective='binary:logistic',
gamma=0,
learn_rate=0.7,
max_depth=6,
reg_lambda=0.8,
scale_pos_weight=1,
subsample=0.9,
cilsample_bytree=0.5)
clf_xgb.fit(X_train,
y_train,
verbose=True,
early_stopping_rounds=10,
eval_metric='aucpr',
eval_set=[(X_test,y_test)])
문제는 모델 점수를 확인할 때
clf_xgb.score(X_test,y_test)
나는 항상 최적화 이전에 얻은 점수보다 낮은 점수를 얻습니다.이 과정에서 수행하는 방식 / 기본 원칙에서 무언가를 놓치고 있다고 의심하게 만듭니다.
최적화를 실행 한 후에도 점수가 더 나아지지 않을 수 있습니까 (더 나빠질까요?)? 내 실수는 어디에 있습니까? 내 모델에 영향을 미치거나 개선 할 수있는 다른 매개 변수가 있습니까?
답변
최적화를 실행 한 후에도 점수가 더 나아지지 않을 수 있습니까 (더 나빠질까요?)?
예, 이론적으로 운이 좋으면 하이퍼 매개 변수를 최적화하기 전에 초기 추측이 매개 변수 그리드에서 찾은 최상의 매개 변수 조합보다 더 나은 결과를 제공 할 수 있습니다. 그러나 충분한 데이터가 있고 매개 변수 그리드가 충분히 넓다고 가정하면 하이퍼 매개 변수를 조정해도 더 나은 결과를 찾지 못할 가능성이 거의 없습니다. 그러한 행동은 오히려 접근 방식이나 데이터에 문제가 있음을 나타냅니다.
올바르게 이해 한 경우 최상의 매개 변수 선택은 훈련 데이터에 대한 cv 결과를 기반으로하는 반면, 최종 실행에서는 테스트 데이터 세트를 기반으로 성능을 평가합니다. 훈련 데이터와 테스트 데이터의 분포가 크게 다른 경우 훈련 데이터에 대해 최상의 결과를 제공하는 매개 변수가 테스트 데이터에서 성능이 떨어지는 상황이 발생할 수 있습니다.
내 실수는 어디에 있습니까?
다른 사람들이 이미 언급했듯이 튜닝 후 테스트중인 매개 변수는 매개 변수 그리드에 포함되지 않았습니다. 이 경우 "최적화 실행 후"모델 성능에 대해 말하는 것은 잘못된 것입니다.
문제를 조사하고 수정하기 위해 다음을 제안합니다.
XGBClassifier호출 에서 하드 코딩 된 매개 변수를 사용하는 대신 튜닝 프로세스에서 찾은 최적의 매개 변수를 사용하십시오grid_search.best_params_. 또한subsample및cilsample_bytree(오타?)가 관련 매개 변수 라고 생각하는 경우 매개 변수 그리드에 포함합니다.cv매개 변수를 예를 들어 5-10으로 늘리면 결과cv = 3가 매우 불안정 할 수 있습니다. 다른 무작위 시드를 사용하고 전체 운동을 반복하여 현재 결과의 안정성을 평가할 수 있습니다.- 튜닝 프로세스 및 최종 평가에서 일관된 매개 변수를 사용하는지 확인하거나 가능하면 매개 변수 그리드에 이러한 매개 변수를 포함하십시오. 특히, 확인
early_stopping_rounds및eval_metric.
내 모델에 영향을 미치거나 개선 할 수있는 다른 매개 변수가 있습니까?
- 귀하의 코드에서 얼마나 많은 라운드를 사용하는지 명확하지 않습니다.
n_estimators매개 변수 그리드에 값을 늘리 거나 포함하십시오. - AUCPR을 사용하는 경우 매개 변수를 명시 적으로 설정해야 할 수 있습니다
maximize=True. 그렇지 않으면 최종 실행에서 AUCPR을 최소화하여 결과가 좋지 않을 수 있습니다.
이 질문은 약간 잘못된 단어입니다. 최적화 후에는 더 나빠질 수 없습니다. 그렇지 않으면 최적화가 아닙니다! (최악의 경우 이전과 동일한 성능으로 이미 보유한 것과 똑같은 매개 변수를 얻습니다)
Grzegorz가 주석에서 지적했듯이, 우선 매개 변수 목록이 완전하지 않으며 나중에 사용하는 값이 포함되어 있지 않습니다. 예를 들어 학습률은 물론 max_depth. 둘째, 어디를 찾아야할지 잘 모르는 그리드 검색은 매개 변수에 대해 훨씬 더 큰 분산을 포함해야합니다. 당신은 확인 [0.1, 0.01, 0.05]학습 속도에 대한,하지만 당신은 확인 않았다 [0.0001, 0.001, 1.]? 학습률은 여기에서 나쁜 예일 수 있지만 요점을 파악하기를 바랍니다. 작은 변화를 확인하기 전에 먼저 크기 / 척도 (예 : 10의 거듭 제곱)를 확인하는 것이 좋습니다.
데이터 세트에 따라 동일한 값을 가진 실행 간의 차이가 다른 시드에서 나올 수도 있습니다! 항상 동일한 시드를 설정했는지 확인하거나 다른 시드로 충분히 시도하여 비슷한 답을 얻으십시오 (예 :) KFold.
모델이 모든 훈련을 위해 수렴하고 있습니까? 충분히 오래 훈련하는지 어디에서 확인합니까? 학습 및 테스트 샘플에 대한 손실을 플로팅하고 수렴하는지 여부를 확인할 수 있습니다. 이것은 n_estimators내가 믿는 xgboost에서 제어 할 수 있습니다 .
코드 나 프로세스에 잘못된 것이 없습니다. 종종 테스트 데이터 세트의 기계 학습 성능이 훈련 데이터 세트의 성능보다 낮습니다. 모델이 이전에 보지 못한 데이터 (예 : 테스트 데이터 세트)로 완벽하게 일반화되지 않습니다.