2016-06-03 15 views
6

Sklearn/python'da özel maliyet işlevi belirtmenin bir yolu var mı acaba? Benim gerçek problemim 7 farklı sınıfa sahiptir, fakat bunu daha açık hale getirmek için 3 farklı sınıfta bir problem için yanlış sınıflandırma için farklı maliyet belirtmek istediğimi varsayalım ve temel olarak benim modelimin sınıf 1 ve sınıf 3 arasında doğru bir şekilde ayrım yapmasıyla ilgileniyorum. gözlem sınıfı 1 vardır ve model sınıf 1 tahmin ise.Python/sklearn'de eşit olmayan sınıflandırma maliyetleri

, ceza
  • 0 (doğru sınıflandırma)
  • gözlem sınıfı 1 vardır ve model sınıf 2, ceza 1
  • noktası sınıf 1 varsa olduğunu tahmin ise ve model, sınıf 3'ü tahmin eder, ceza, 2
nokta sınıf 2'ye sahiptir ve model sınıf 2 tahmin ise
  • ceza 0 (doğru sınıflandırma)
  • noktası sınıf 2 vardır ve model sınıf 3, ceza 1
  • noktası sınıf 2 sahipse olduğunu tahmin ise ve model sınıf 1 ceza 1
noktası sınıfı 3 vardır ve model sınıf 3, ceza 0 (doğru clas olduğu tahmin ise
  • olduğu tahmin dırılmasına)
  • noktası sınıfı 3 sahiptir ve model sınıf 2, ceza 1
  • olduğu tahmin ise nokta sınıfı 3 vardır ve model sınıf 1 ceza 2

Böylece ceza matrisi olur olduğu tahmin ise aşağıdaki gibi bak:

 Class 1 Class 2 Class 3 
Class 1 0  1  2 
Class 2 1  0  1 
Class 3 2  1  0 

ben sklearn içinde 'class_weight' parametresi benzer bir şey yapar ama bir matris yerine bir sözlük kabul ettiğini varsayalım. Class_weight = {1: 2,1: 1,1: 2} sınıfının geçmesi, sınıf 1 ve sınıf 3'ü yanlış sınıflandırma için ağırlığı artıracak, ancak, 1. sınıfımı seçtiğimde ve gerçek sınıfın, özellikle modelimin daha büyük bir ceza almasını istiyorum. sınıf 3 ve tersi.

Sklearn'de böyle bir şey yapmak mümkün mü? Diğer bazı kütüphaneler/öğrenme algoritmaları, eşit olmayan yanlış sınıflandırma maliyetine izin verebilir mi?

cevap

0

İlk önce, sklearn'de, özel kayıp kullanarak bir modeli eğitmenin yolu yoktur. Ancak, bu metriği optimize etmek için implement your own evaluation function modelini kullanabilir ve modelinizin hipermetrometrelerini ayarlayabilirsiniz.

İkinci olarak, for example, using Keras numaralı sinir ağları ile herhangi bir özel kaybı en iyi duruma getirebilirsiniz. Fakat bu amaç için fonksiyonunuz düzgün olmalıdır. Akla gelen ilk şey, ağırlıklı çapraz entropidir. this discussion'da, insanlar bu işlevin uygulamaları ile oynuyorlar.

Üçüncü olarak, kendi sorunlarınızın yapısı, sınıf etiketlerinin siparişi gerçekten önemli olan şey olduğunu düşündürmektedir. Bu durumda, sipariş edilen lojistik regresyonu (uygulamanın bir example) deneyebilirsiniz. Ayrıca, sorununuzda maliyetler sum(abs(predicted-fact)).Yani olasılıksal öngörüye ihtiyacınız yoksa, MAE'yi optimize eden bir regressörü kullanabilirsiniz (örn. 'Epsilon_insensitive' kaybı olan SGDRegressor veya mae kriteriyle DecisionTreeRegressor). Regresyonu çözdükten sonra, maliyet fonksiyonunuzu optimize eden eşikleri bulmanız yeterlidir.