Rastgele orman aşırı uyuyor mu?


19

Scikit-learn ile rastgele ormanları deniyorum ve eğitim setimin harika sonuçlarını alıyorum, ancak test setimde nispeten zayıf sonuçlar elde ediyorum ...

İşte çözmeye çalıştığım problem (pokerden esinlenerek): Oyuncu A'nın delik kartları, oyuncu B'nin delik kartları ve bir flop (3 kart) verildi, hangi oyuncu en iyi ele sahip? Matematiksel olarak, bu 14 giriş (7 kart - her biri için bir rütbe ve bir takım) ve bir çıkış (0 veya 1).

Şimdiye kadar elde ettiğim sonuçlardan bazıları:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

Kullanılan ilgili kod:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

Kullanılan ağaç sayısına bakılmaksızın, nispeten büyük bir eğitim setine ve oldukça az sayıda özelliğe rağmen , eğitim setindeki performansın test setinden çok daha iyi olduğu görülmektedir ...


2
Burada rastgele ormanlar için bir düzine 'kadran' görmüyorum. Çapraz doğrulama? Bayes Öncelikleri? Örneklemenin doğası? Her ağaç için eğitim seti? Her ağacın alt kümesinin yüzde kaçı? ... numaralandırılabilecek çok daha fazlası var, ama benim düşüncem, dikkate almanız gereken başka girdileriniz olması.
EngrStudent - Monica

1
Poker bilmeyenler için problemi açıklayabilir misiniz .. Poker skoru için kolay bir hesaplama var mı? RF'yi kullanırken temelde yanlış bir şey olup olmadığını anlamak daha kolay ... Poker bilmiyorum, ancak RF'nin muhtemelen yanlış bir yaklaşım olduğundan şüpheleniyorum - RF'deki ilk adım girişlerin yalnızca bir kısmını kullanmak, bana göre sadece girdilerin bir alt kümesini kullanarak iyi bir sınıflandırıcı oluşturmanın bir yolu yoktur - tüm girdiler gereklidir.
seanv507

Yanıtlar:


45

Bu, RF modellerini kullanırken yaygın bir çaylak hatasıdır (elimi önceki bir fail olarak koyacağım). Eğitim setini kullanarak oluşturduğunuz orman, birçok durumda eğitim verilerinin bütünüyle ele alındığında neredeyse mükemmel bir şekilde (bulduğunuz gibi) sığacaktır. Ancak, algoritma ormanı oluştururken, genelleme hatası için en iyi tahmin olan torba dışı tahmin hatasını hatırlar.

Egzersiz verilerini (yaptığınız gibi) tahmin yöntemine geri gönderirseniz, doğru OOB hatası yerine neredeyse mükemmel bir tahmin (çılgınca iyimser) elde edersiniz. Bunu yapma. Bunun yerine, eğitimli Forest nesnesi içinde OOB hatasını hatırlamalıydı. Ben scikit-öğrenme uygulaması ancak belgelerine bakarak yabancıyım burada belirttiğiniz gerekir benziyor oob_score=Truefit yöntemi çağrılırken ve sonra genelleme hatası olarak saklanıroob_score_döndürülen nesnede. "RandomForest" R paketinde, döndürülen nesne üzerinde hiçbir argüman olmadan tahmin yöntemini çağırmak, eğitim setindeki OOB tahminini döndürür. Bu, hatayı başka bir hesaplama kullanarak tanımlamanızı sağlar. Eğitimin tahmin yöntemine geri gönderilmesi size tüm ağaçları kullanacağı için farklı bir sonuç verecektir. Uygulamanın bunu yapıp yapmayacağını bilmiyorum scikit-learn.

Doğruluğunu test etmek için egzersiz verilerini tahmin yöntemine geri göndermek bir hatadır. Bu çok yaygın bir hatadır, bu yüzden endişelenmeyin.


1
Teşekkürler! Bununla birlikte, hala bir endişem var: 400k eğitim örnekleri ve 50 ağaç ile% 89.6 doğru aldım, oysa çok fazla veri ve iki kat daha fazla ağaç ile% 89.7 doğru aldım ... Bu RF'nin iyi olmadığını gösteriyor mu? Bunun için yöntem? Geçmişte bir MLP sinir ağı kullandım ve test setinde ~%
98.5'lik bir

5
Bu, neredeyse yeterince ağaç kullanmamanıza rağmen mümkün. Genellikle binlerce gerekir. Ağaç sayısının RF algoritmasında ayarlanacak bir parametre olmadığını, daha fazlasının her zaman daha iyi olduğunu, ancak 'yeterli' olduğunda (ampirik olarak belirlenecekse) OOB hatası daha fazla ağaçla iyileşmez. Küçük basit veri setleri için bile, 500 ağaçtan daha az bir şey neredeyse yeterli değildir.
Bogdanovist

1
Ağaç sayısı için 'daha fazlası her zaman daha iyidir' için bazı küçük uyarılar vardır, ancak performans isabetine başlamadan önce ağaçların cephesine ihtiyaç duyduğumu anlıyorum. Deneyimlerime göre, OBB (ntrees) eğrisi yaylaları bir kez azalan geri dönüşler olsa da, daha iyi üretmek için CPU kaynaklarına ve sabrına sahip olduğunuz kadar ağaç.
Bogdanovist

12

Cevap max_features parametre olduğunu düşünüyorum: int, dize veya Yok, isteğe bağlı (default = ”auto”) parametre. Temel olarak bu sorun için Yok olarak ayarlamanız gerekir, böylece her ağaç tüm girişlerle oluşturulur, çünkü kartların sadece bir kısmını kullanarak uygun bir sınıflandırıcı oluşturamazsınız (varsayılan "otomatik" sqrt (nfeatures) seçiyor her ağaç için giriş)


1
Hepsi bu kadar! 50 ağaç ve 600 bin eğitim örneğiyle% 95 doğruluk.
Uwat

2
Bu noktada nadiren rastgele bir orman kullandığınızı, ancak diğer cevapların belirttiği gibi, bu tam sorun için ideal sınıflandırıcı olmadığını unutmayın.
Richard Rast
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.