Optimizasyondan sonra daha kötü model elde etmek mümkün mü?

Sep 21 2020

Son zamanlarda modelleri optimize etmeye çalışıyorum, ancak bazı nedenlerden dolayı, optimizasyonu çalıştırmaya çalıştığımda sonunda model puanı eskisinden daha kötü, bu yüzden yanlış bir şey yaptığıma inanıyorum.

Modelimi optimize etmek için param grid tanımlıyorum ve daha sonra tren verilerine uyuyorum ve daha sonra sonuçlara göre nre parametreler ile tekrar çalıştırıyorum, örn.

#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_

>>>.....

(ve şimdi parametrelerin değiştirildiği sonuca göre ...)

bu adımdan sonra en iyi hiperparametreleri seçer ve modeli çalıştırırım;

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)])

Sorun şu ki, model puanını kontrol ettiğimde

clf_xgb.score(X_test,y_test)

Optimizasyondan önce aldığımdan her zaman daha düşük puan alıyorum, bu da beni bu süreçte onu yapma / temel ilke gibi bir şeyi kaçırdığımdan şüphelenmeme neden oluyor.

Optimizasyonu çalıştırdıktan sonra puanımın daha iyi (hatta daha da kötü) olması mümkün mü? Benim hatam nerede Modelimi etkileyebilecek veya geliştirebilecek başka parametreler var mı?

Yanıtlar

4 aivanov Sep 29 2020 at 04:34

Optimizasyonu çalıştırdıktan sonra puanımın daha iyi (hatta daha da kötü) olması mümkün mü?

Evet, teorik olarak, tamamen şans eseri, hiper parametrelerin optimizasyonundan önceki ilk tahmininizin, parametreler tablosunda bulunan en iyi parametre kombinasyonundan daha iyi sonuçlar vermesi mümkündür. Bununla birlikte, yeterli veriye sahip olduğunuzu ve parametre ızgaranızın yeterince geniş olduğunu varsayarsak, hiper parametrelerin ayarlanmasının daha iyi sonuçlar bulması pek olası değildir. Bu tür davranışlar, yaklaşımınızda veya verilerinizde bir sorun olduğunu gösterir.

Doğru anlaşılırsa, en iyi parametrelerin seçimi eğitim verilerindeki cv sonuçlarına dayanırken, son çalıştırmanızda performans test veri setine göre değerlendirilir. Eğitim ve test verilerinin dağılımı önemli ölçüde farklıysa, eğitim verilerinde en iyi sonuçları sağlayan parametrelerin test verilerinde kötü performans göstermesi duruma yol açabilir.

Benim hatam nerede

Başkaları tarafından daha önce de belirtildiği gibi, ayarlamadan sonra test ettiğiniz parametreler parametre tablosuna dahil edilmemiştir. Bu durumda "optimizasyonu çalıştırdıktan sonra" model performansından bahsetmek yanlıştır.

Sorunu araştırmak ve düzeltmek için aşağıdakileri öneririm

  • XGBClassifier Çağrıda sabit kodlanmış parametreleri kullanmak yerine, ayarlama işlemi tarafından bulunan optimum parametreleri kullanın, örn grid_search.best_params_. Ayrıca, bunu düşünüyorsanız subsampleve cilsample_bytree(bir yazım hatası?) İlgili parametreler, bunları parametreler kılavuzuna dahil edin.
  • Artış cvör 5-10 parametreyi ile sonuçlar cv = 3çok kararsız olabilir. Mevcut sonuçlarınızın kararlılığını, farklı rastgele tohumlar kullanarak ve tüm alıştırmayı tekrarlayarak değerlendirebilirsiniz.
  • Ayarlama sürecinde ve son değerlendirmede tutarlı parametreleri kullandığınızdan emin olun veya mümkünse bu parametreleri parametreler tablosuna dahil edin. Özellikle kontrol edin early_stopping_roundsve eval_metric.

Modelimi etkileyebilecek veya geliştirebilecek başka parametreler var mı?

  • Kodunuzdan kaç tur kullandığınız belli değil. Ya artırın n_estimatorsya da parametreler tablosuna ekleyin.
  • AUCPR kullandığınız göz önüne alındığında, parametreyi açıkça ayarlamanız gerekebilir maximize=True, aksi takdirde son çalışmanızda AUCPR'yi en aza indirebilirsiniz, bu da kötü sonuçları açıklayabilir.
N.Kiefer Sep 24 2020 at 17:24

Bu soru biraz yanlış. Optimizasyondan sonra daha kötü olamazsınız, aksi takdirde optimizasyon olmaz! (En kötüsü, eskisi gibi aynı performanstasınız, zaten sahip olduğunuz aynı parametreleri alıyorsunuz)

Grzegorz'un bir yorumda işaret ettiği gibi, öncelikle parametre listeniz tam değildir ve daha sonra kullanacağınız değerleri içermemektedir. Örneğin öğrenme hızı, aynı zamanda max_depth. İkinci olarak, nereye bakacağınızı gerçekten bilmediğiniz bir ızgara araması, parametreler için çok daha büyük bir varyans içermelidir. Sen çek [0.1, 0.01, 0.05]öğrenme oranı, ancak kontrol ettin [0.0001, 0.001, 1.]? Öğrenme oranı burada kötü bir örnek olabilir ama umarım o noktayı anlar, küçük varyasyonları kontrol etmeden önce büyüklüğü / ölçeği, örneğin on'un üslerini kontrol etmek isteyebilirsiniz.

Veri kümenize bağlı olarak, aynı değerlere sahip çalışmalar arasındaki fark farklı tohumlardan da gelebilir! Ya her zaman aynı tohumu ayarladığınızdan emin olun ya da karşılaştırılabilir bir cevap elde etmek için farklı tohumlarla yeterli sayıda deneyin (örneğin ile KFold).

Modeliniz her eğitim için birleşiyor mu? Yeterince uzun antrenman yaptığınızdan nerede emin oluyorsunuz? Eğitim ve test numunesi için kaybı planlayabilir ve yakınsak olup olmadığını kontrol edebilirsiniz. Bu n_estimatorsxgboost ile kontrol edilebileceğine inanıyorum.

BrianSpiering Sep 24 2020 at 22:08

Kodunuzda veya işleminizde yanlış bir şey yok. Test veri kümesindeki makine öğrenimi performansındaki çoğu zaman, eğitim veri kümesindeki performanstan daha düşüktür. Modeliniz daha önce görmediği verilere (yani, test veri kümesine) mükemmel bir şekilde genellemiyor.