GridSearch çıktısı nasıl kullanılır?


23

Şu anda Python ve Scikit ile sınıflandırma amacıyla öğrenmek için çalışıyorum ve GridSearch etrafında biraz okuma yapıyorum, bu en iyi sonuçları elde etmek için benim tahmin parametreleri optimize etmek için harika bir yol olduğunu düşündüm.

Benim metodolojim şudur:

  1. Verilerimi eğitim / teste böl.
  2. Tahmincilerimi (Rastgele Orman, Gradient Boost, diğerleri arasında SVC) eğitmek ve test etmek için 5Fold Cross doğrulaması ile GridSearch'ü kullanın.
  3. Daha sonra sınıflandırmaları tahmin etmek ve bunları gerçek sınıf etiketleriyle karşılaştırmak için test setimi kullanarak Hassasiyet, Geri Çağırma, FMeasure ve Matthews Korelasyon Katsayısı gibi her bir tahmin edicimdeki metrikleri hesaplarım.

Bu aşamada garip davranışlar görüyorum ve nasıl ilerleyeceğimden emin değilim. .Best_estimator_'ı GridSearch'ten alıp bunu grid aramasından 'optimal' çıktı olarak mı kullanırım ve bu tahmin ediciyi kullanarak tahmin gerçekleştirir miyim? Bunu yaparsam, 3. aşama metriklerinin genellikle tüm eğitim verileri üzerinde eğitim alıp test setinde test ettiğimden çok daha düşük olduğunu görürüm. Yoksa çıkış GridSearchCV nesnesini yeni tahminci olarak mı alabilirim? Bunu yaparsam, aşama 3 metriklerim için daha iyi puanlar alırım, ancak amaçlanan sınıflandırıcı (örneğin rastgele bir orman) yerine bir GridSearchCV nesnesi kullanarak garip görünüyor ...

EDIT: Benim sorum döndürülen GridSearchCV nesne ve .best_estimator_ özniteliği arasındaki fark nedir? Daha fazla metrik hesaplamak için bunlardan hangisini kullanmalıyım? Bu çıktıyı normal bir sınıflandırıcı gibi kullanabilir miyim (örneğin tahmin kullanarak), yoksa bunu nasıl kullanmalıyım?

Yanıtlar:


27

Gitmeye ve sorumu tatmin edecek cevapları bulmaya ve merak edenler için buraya yazmaya karar verdim.

.Best_estimator_ özniteliği, param_grid öğesinden verilen parametrelerin 'en iyi' birleşimine sahip belirtilen model türünün bir örneğidir. Bu örneğin yararlı olup olmadığı, refit parametresinin True olarak ayarlanıp ayarlanmadığına bağlıdır (varsayılan olarak). Örneğin:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

RandomForestClassifier döndürür. Bunların hepsi belgelerden oldukça açık . Belgelerden net olmayan şey, örneklerin çoğunun neden özellikle .best_estimator_ kullanmaması ve bunu yapmasıdır:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Bu ikinci yaklaşım GridSearchCV örneğini döndürür.

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Tahmin yaparken aynı en iyi tahmin örneğini kullanır. Bu yüzden pratikte, yalnızca tahmin edicinin kendisini istemediğiniz sürece bu ikisi arasında fark yoktur. Bir yan not olarak, metriklerdeki farklarım ilgisizdi ve bir buggy sınıfı ağırlıklandırma işlevine indi.


Mesajınız için teşekkürler @ Dan, çok yararlı. Senden bir açıklama istemiştim. İkinci durumda, eğer varsa refit=Falseo clf.fitzaman en iyi sınıflandırıcı ile yapılmayacak mı?
Poete Maudit

@PoeteMaudit refit parametresi, GridSearchCV işlevine bulunan en iyi parametreleri almasını ve tüm veri kümesindeki bu parametreleri kullanarak modeli yeniden eğitmesini söyler. Refit = False ise, belgelere göre best_estimator kullanılamaz: scikit-learn.org/stable/modules/generated/…
Dan Carter

0

GridSearchCV hiper parametrelerini ayarlamak için bir tahmin ediciyi bir ızgara araması giriş eki ile birleştirmenizi sağlar. Yöntem, ızgara aramasından optimal parametreyi alır ve kullanıcı tarafından seçilen tahmin ediciyle kullanır. GridSearchCV yöntemleri sınıflandırıcıdan devralır, bu nedenle evet .score, .predict vb. Yöntemlerini doğrudan GridSearchCV arabirimi üzerinden kullanabilirsiniz. Izgara araması tarafından tanımlanan en iyi hiper parametrelerini çıkarmak istiyorsanız .best_params_ kullanabilirsiniz ve bu en iyi hiper parametresini döndürür. Daha sonra bu hiper parametreyi tahmin edicinize ayrı olarak iletebilirsiniz.

Doğrudan .predict kullanmak, .best_param_ aracılığıyla en iyi hiper parametresini elde etmekle aynı sonucu verir ve ardından modelinizde kullanmaktır. Şebeke aramasının altını çizen çalışmaları anlayarak bunun neden böyle olduğunu görebiliriz.


Izgara Arama

Bu teknik, bir algoritma ile kullanılacak en uygun parametreleri bulmak için kullanılır. Bu, ağırlıklar veya model DEĞİLDİR, veriler kullanılarak öğrenilir. Bu açıkça oldukça kafa karıştırıcı, bu yüzden bir hiper parametre çağırarak bu parametreleri ayırt edeceğim.

Hiper parametreler k-En Yakın Komşularındaki (k-NN) k gibidir. k-NN kullanıcının mesafeyi hesaplarken hangi komşunun dikkate alacağını seçmesini gerektirir. Algoritma daha sonra yeni bir örneğin öğrenilen dağılım içine girip girmediğini görmek için bir parametre, bir eşik ayarı yapar, bu verilerle yapılır.

K'yi nasıl seçeriz?

Bazı insanlar sadece veri türünün geçmişteki çalışmalarına dayanan önerilerle giderler. Diğerleri ızgara aramasını kullanır. Bu yöntem, verileriniz için hangi k'nin en uygun olduğunu en iyi şekilde belirleyebilecektir.

O nasıl çalışır?

[1,2,3,...,10]

Bu test verilerini kullanmama ilkelerine aykırıdır !!

nnn1n

Seçilen hiper-parametre değeri n-katlarında en yüksek ortalama performansı elde eden değerdir. Algoritmanızdan memnun olduğunuzda, test setinde test edebilirsiniz. Doğrudan test setine giderseniz aşırı takılma riskiyle karşı karşıya kalırsınız.


Merhaba Jah, bu iyi bir cevap ama hala sorumun cevabı konusunda daha akıllı değilim. İşleri daha net hale getirmek için soru başlığını ve sorunun kendisini güncelledim.
Dan Carter

Kendi ızgara aramanızı yazın. Kelimenin tam anlamıyla bir dizi yapın, ardından modelinizin etrafına bir for döngüsü ekleyin. Sonra for döngüsü sonunda elde edilen performansı bir diziye kaydedin. Izgaradaki tüm olası değerleri inceledikten sonra, performans dizilerine bakın ve en iyisini seçin. Hiper parametreniz için en uygun değer budur. Temel bilgiler için yerleşik işlevlere güvenmek veri bilimi için önerilmez. Veriler çok çılgınca değişir ve kontrolünüz için en iyisi!
JahKnows

Optimize etmek için sadece bir hiperparametre varsa, ancak 4 tane varsa iyi bir öneri olurdu? 5? Döngü için iç içe 4/5 kez çirkin ve burada tekerleği yeniden keşfetmeye gerek yok, bu zaman kaybı olur ve bunun gibi paketlerin var olmasının nedeni budur.
Dan Carter

GridSearchCV, bir tahminciyi GridSearchCV ayarıyla birleştirmenizi sağlar. Yani tam olarak tartıştığımız şeyi yapıyor. Daha sonra en uygun parametreyi seçer ve seçtiğiniz tahmin ediciyle kullanır. GridSearchCV yöntemleri sınıflandırıcıdan devralır, bu nedenle evet .score, .predict, etc yöntemlerini doğrudan GridSearchCV arabirimi üzerinden kullanabilirsiniz. Ancak bunu yapmanızı önermiyorum, daha kolay araçlar daha az kontrol anlamına geliyor. Bir ızgara arama kadar basit bir şey için sadece kendiniz kodlayın.
JahKnows

1
Bu yanıt, GridSearchCV kullanımı ile ilgili soruyu ele almamaktadır.
Hobbes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.