2014-06-26 22 views
5

Bir lojistik regresyon modeli uyguluyor ve rasgele durumu sabit bir değere ayarlıyorum.sklearn.linear_model.LogisticRegression, random_state ayarlanmış olsa da her seferinde farklı katsayıları döndürür

Ben farklı katsayılar olsun "uyum" do her zaman, örnek:

classifier_instance.fit(train_examples_features, train_examples_labels) 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, penalty='l2', random_state=1, tol=0.0001) 

>>> classifier_instance.raw_coef_ 
array([[ 0.071101940040772596 , 0.05143724979709707323, 0.071101940040772596 , -0.04089477198935181912, -0.0407380696457252528 , 0.03622160087086594843, 0.01055345545606742319, 
     0.01071861708285645406, -0.36248634699444892693, -0.06159019047096317423, 0.02370064668025737009, 0.02370064668025737009, -0.03159781822495803805, 0.11221150783553821006, 
     0.02728295348681779309, 0.071101940040772596 , 0.071101940040772596 , 0.     , 0.10882033432637286396, 0.64630314505709030026, 0.09617956519989406816, 
     0.0604133873444507169 , 0.     , 0.04111685986987245051, 0.     , 0.     , 0.18312324521915510078, 0.071101940040772596 , 
     0.071101940040772596 , 0.     , -0.59561802045324663268, -0.61490898457874587635, 1.07812569991461248975, 0.071101940040772596 ]]) 

classifier_instance.fit(train_examples_features, train_examples_labels) 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, penalty='l2', random_state=1, tol=0.0001) 

>>> classifier_instance.raw_coef_ 
array([[ 0.07110193825129411394, 0.05143724970282205489, 0.07110193825129411394, -0.04089477178162870957, -0.04073806899140903354, 0.03622160048165772028, 0.010553455400928528 , 
     0.01071860364222424096, -0.36248635488413910588, -0.06159021545062405567, 0.02370064608376460866, 0.02370064608376460866, -0.03159783710841745225, 0.11221149816037970237, 
     0.02728295411479400578, 0.07110193825129411394, 0.07110193825129411394, 0.     , 0.10882033461822394893, 0.64630314701686075729, 0.09617956493834901865, 
     0.06041338563697066372, 0.     , 0.04111676713793514099, 0.     , 0.     , 0.18312324401049043243, 0.07110193825129411394, 
     0.07110193825129411394, 0.     , -0.59561803345113684127, -0.61490899867901249731, 1.07812569539027203191, 0.07110193825129411394]]) 

ben versiyon 0.14 kullanıyorum, dokümanlar altında yatan C uygulaması ne zaman özellikleri seçmek için bir rasgele sayı üreteci kullanır" belirtmek Bu nedenle, aynı girdi verileri için biraz farklı sonuçlar elde etmek nadir değildir. Bu durumda, daha küçük bir tol parametresiyle deneyin. "

Rastgele durumun ayarlanmasının rastgele olmadığından emin olacağına inanıyorum ama görünüşe göre bu durum böyle değil. Bu bir hata mı yoksa istenen davranış mı?

+0

Ayrıca bazen bu davranışın "çalışır" arasında değiştiğini fark ettim, bir keresinde python'u başlattığımda farklı katsayılar oluşturmak için çağrıları tekrarladı ve diğer zamanlarda python'u yeniden başlatıyorum. Çok ilginç. – jonathans

cevap

3

Bu gerçekten arzu edilmiyor, ancak düzeltilmesi çok zor bilinen bilinen bir sorun. Buradaki şey, LogisticRegression modellerinin, Liblinear ile eğitildiğinden, rastgele tohumunu tamamen sağlam bir şekilde ayarlamaya izin vermez. Açık bir şekilde random_state'u ayarladığınızda, Liblinear'ın rastgele tohumunu ayarlamak için en iyi çaba gösterilir, ancak bu başarısız olabilir.

+1

Tam olarak aynı katsayılara sahip olmak gerekirse, modele uyan ve katsayıları döndüren bir get_logistic_regression_coef işlevi yazabilir ve daha sonra 'sklearn.externals.joblib.Memory' kullanarak önbelleğe alabilirsiniz. Bu şekilde, sonuçları belirli bir girdi için diske kaydedecek ve giriş değişmediyse ikinci çağrıdakileri yeniden yükleyecektir. – eickenberg

+0

Eğer her çalışmada 6 basamaklı basamaktan sonraki tüm rakamlar değişirse o zaman tüm niyet ve amaçlar için değişirler, anlamsız olurlar, değil mi? 6 ondalık nokta dedikten sonra katsayıları yuvarlamaya ne dersiniz? bu şekilde sonuçlar deterministik olacak. – jonathans

+0

@jonathans Daha büyük farklılıklara neden olan rastgele kesimler olabilir. Önerilerinizin problemi çözmekten ziyade, problemi gizlemeyi tercih ettiklerini hissediyorum (örneğin, Liblinear'da farklı bir RNG kurarak, zor ama mümkün olan). –

1

Sorunla da şaşırdım, ancak sonunda random_state'u geçmenin yanı sıra numpy'nin dahili RNG durumunu ayarlamak için de numpy.random.seed() numaralı telefonu çağırmanın gerekli olduğunu gördü.

Bu sklearn 0.13.1 ile test edilmiştir.

+0

Bu benim için çalıştı! Neden çalıştığını biliyor muyuz? Belki lojistik regresyon içindeki srand fonksiyonu global numpy rastgele tohum kullanıyor? –

İlgili konular