2015-06-13 12 views
11

Veri kümelerimde makine öğrenme algoritması uygulamak için Scikit kullanıyorum. Bazen etiketlerin/sınıfların kendilerine ait etiket/sınıf olasılıklarına sahip olmam gerekir. E-postaların etiketleri olarak Spam/Spam Olmama yerine, sadece bir örneğe sahip olmak isterim: 0.78 olasılık, belirli bir e-posta Spam'dir.RandomForestClassifier'ın predict_proba() işlevini güvenli ve doğru şekilde kullanma

clf = RandomForestClassifier(n_estimators=10, max_depth=None, 
    min_samples_split=1, random_state=0) 
scores = cross_val_score(clf, X, y) 
print(scores.mean()) 

classifier = clf.fit(X,y) 
predictions = classifier.predict_proba(Xtest) 
print(predictions) 

Ve bu sonuçları aldık: Bu amaçla

, ben şöyle RandomForestClassifier ile predict_proba() kullanıyorum İkinci sütun sınıfa ait

[ 0.4 0.6] 
[ 0.1 0.9] 
[ 0.2 0.8] 
[ 0.7 0.3] 
[ 0.3 0.7] 
[ 0.3 0.7] 
[ 0.7 0.3] 
[ 0.4 0.6] 

: Spam. Bununla birlikte, kendime güvenmediğim sonuçlarla iki ana sorunum var. İlk konu, sonuçların, verilerimin büyüklüğünden etkilenmeden etiketlerin olasılıklarını temsil ettiğidir. İkinci konu, sonuçların sadece 0.701 olasılığının 0.708'den çok farklı olduğu bazı durumlarda çok spesifik olmayan sadece bir rakam göstermesidir. Örneğin sonraki 5 rakamı almanın bir yolu var mı?

Bu iki sorunu ve sorularını okuma zamanınız için şimdiden çok teşekkürler.

+0

Sebastien ile aynı fikirdeyim, tahmin dizinizdeki belirli bir dizini arayın, muhtemelen daha hassas olacaksınız. Tahminler dizisindeki sonucun alfabetik olarak kategorinin adıyla sıralandığını kesinleştirmek istedim. – RPresle

+0

Sevgili PRresle, yorumunuz için teşekkürler. – Clinical

cevap

1
  1. Sonuçlarımda bir basamaktan daha fazlasına ulaşıyorum, veri kümenizden kaynaklanmadığından emin misiniz? (örneğin çok küçük bir veri kümesinin kullanılması basit karar ağaçlarına ve dolayısıyla “basit” olasılıklara yol açacaktır). Aksi takdirde sadece bir rakam gösteren ekran olabilir, ancak predictions[0,0]'u yazdırmayı deneyin.

  2. "Olasılıklar verilerimin büyüklüğünden etkilenmez" ile ne demek istediğini anlayamadığımdan emin değilim. Endişeniz, örneğin çok fazla spam olduğunu tahmin etmek istemiyorsa, genellikle t eşiğini kullanmak, yani proba(label==1) > t ise 1 değerini tahmin etmektir. Bu şekilde, tahminlerinizi dengelemek için eşiği kullanabilirsiniz. Örneğin, global spam olasılığını sınırlamak için. Ve eğer modelinizi global olarak analiz etmek isterseniz, genellikle Alıcının çalışma karakteristiği (ROC) eğrisinin eğri altındaki alanı (AUC) hesaplıyoruz (bkz. Wikipedia makalesi here). Temel olarak ROC eğrisi, t eşiğine bağlı olarak tahminlerinizin bir açıklamasıdır.

Umut eder!

+0

Bu yanıtı @Andreus'unkiyle ilgili olarak tamamlıyorum. Rastgele bir orman aslında karar ağaçları topluluğudur. Bununla birlikte, bir sınıfa ait olma olasılığını öngörmek için tek bir ağaç da kullanılabilir. "DecisionTreeClassifier" sınıfının "predict_proba" yöntemine ilişkin sklearn'den alıntı yapılması: "Tahmin edilen sınıf olasılığı, bir yapraktaki aynı sınıftaki örneklerin fraksiyonudur." Ve rasgele bir orman için tahmin, tüm ağaçlardaki ortalamadır: " Bir girdi örneğinin tahmin edilen sınıf olasılıkları, ormandaki ağaçların ortalama tahmin edilen sınıf olasılıkları olarak hesaplanır. ' – Sebastien

+0

Sevgili Sebastien, umarım iyisindir. Cevaplarınız için çok teşekkürler. Emin oldular. Ancak, ingilizcemin çok net olmadığını düşünüyorum. Yani üzgünüm. İkinci noktaya başka bir şekilde açıklayayım. Üretilen modelimize (Random Forest sınıflandırıcı) 10 örnek (yeni e-posta) sağlarım. Eğer sınıflandırıcı bana e-posta numarası 1'in spam olacağı olasılığını 0,6 olarak verirse, diğer 9 durumun diğer olasılık değerlerinden 0,6'sı etkilenir veya olasılık bağımsızdır ve örnek 1'in% 60'lık spam ile olasılığını temsil eder. diğer 9 örnek olasılıklar. – Clinical

+0

Ve ilk noktayı ve bir tahminin değerini kontrol etmek için önerinizle ilgili olarak, aslında aynı sayıda rakam aldım. Daha fazla rakam elde etmenin tek yolu, tahmin edicilerin (ağaçların) sayısını artırmak ve bu şekilde kabul edilebilir bir yol değildir. – Clinical

6

A RandomForestClassifierDecisionTreeClassifier 's grubunun bir üyesidir. Eğitim setiniz ne kadar büyük olursa olsun, bir karar ağacı sadece bir karar verir: bir karar. Bir sınıfın olasılığı 1, diğer sınıfların olasılığı 0'dır.

RandomForest sonuçları arasında oy kullanır. predict_proba(), her bir sınıfa ait oy sayısını döndürür (ormandaki her ağaç kendi kararını verir ve tam olarak bir sınıf seçer), ormandaki ağaç sayısına bölünür. Bu nedenle, hassaslığınız tam olarak 1/n_estimators. Daha fazla "hassas" ister misiniz? Daha fazla tahminci ekleyin. 5. basamakta varyasyon görmek istiyorsanız, aşırı olan 10**5 = 100,000 tahmincilerine ihtiyacınız olacaktır. Normalde 100 tahminciden fazlasını istemiyorsunuz ve çoğu zaman bu kadar değil.

+0

Sevgili Andreus, umarım iyisindir. Bu sorudaki yardımınız için çok teşekkürler. Eğer sakıncası yoksa, benim endişem hakkındaki açıklamamı Sebastien'e yazmamı rica edebilir misiniz? Cevabınla ilgili olarak, evet, ağaç sayısını arttırmaya çalıştım ve söylediklerini aldım. Bununla birlikte, hala 50 veya 100 ağaç boyutunda, daha fazla rakam göremiyorum. Cevabınız, yediden sonraki rakamın 0,7 olduğunu anladım ve eğer rakamın ardında yedi rakamı görmeye çalışırsak, şu sonuca ulaşacağımızı söyleyebiliriz: 0.70000? Üzgünüm seni anlamadım eğer. – Clinical