2015-07-09 29 views
7

i Python'a yeni bağlanıyorum ve bir veri kümesinde küçük bir sorun var. Veri seti 400.000 satır ve 300 değişken içeriyor. 3000+ farklı öğe ile kategorik bir değişken için kukla değişkenler almak zorunda. Sonunda, 3300 değişken veya veri içeren bir veri seti ile sonuçlanmak istiyorum, böylece RandomForest modelini eğitebilirim. İşte get_dummies python bellek hatası

yapmaya çalıştığım budur:
df = pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1) 

i hep bir bellek hatası alırsınız bunu

. Sahip olabileceğim değişkenlerin sayısı için bir sınır var mı?

Bunu yalnızca ilk 1000 satırla (374 farklı kategoriye sahip) yapıyorsam, yalnızca fin çalışıyor.

Sorunun çözümü için herhangi bir çözüm var mı?

Kullandığım Makine, 8 GB Ram içeren Intel I7.

Eğer

+0

32 bit veya 64 bit Python? Sınır, Python uygulamasının RAM boyutu değil sanal bellek alanı olan yığın boyutudır. Farklı işletim sistemleri üzerindeki farklı sürümler ve farklı uygulamaların hepsi farklı sınırlamalara sahiptir.Açıkçası bir tane vurdun. Tüm bu verileri sanal bellekte aynı anda mı saklamak zorundasınız? – cdarke

+0

64 bit Python kullanıyorum. Bunun çözümü ne olurdu? Veri setini birden fazla parçaya böldüğümü ve bu farklı bölümlerde çalışmamı yaptım mı? – Duesentrieb

+0

Tamam, ben 32-bit olsaydı ben önereceğim. Bu durumda tasarımınızı tekrar gözden geçirmeniz gerekir. – cdarke

cevap

18

güncelleme ederiz: sürümü 0.19.0 ile başlayarak, get_dummies birçok durumda bu sorunu çözecektir 8bit tamsayı yerine 64bit float, döndürür. Bkz. get_dummies -- pandas 0.19.0

İşte denemek için birkaç olasılık var. Her ikisi de, veri çerçevesinin bellek ayak izini önemli ölçüde azaltacaktır, ancak daha sonra bellek sorunlarıyla karşılaşabilirsiniz. Tahmin etmek zor, sadece denemek zorundasın.

df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) }) 

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null float64 
itemID__2 100 non-null float64 
itemID__3 100 non-null float64 

memory usage: 3.5 KB 

(aşağıda info() çıktısını basitleştirilmesi ediyorum unutmayın) İşte ana çizgisi. Her bir kukla sütun 800 bayt alır çünkü örnek verisi 100 satır ve get_dummies float64 (8 bayt) varsayılan olarak görünür. Bu, mankenleri saklamak için gereksiz yere kullanamayacak kadar gereksiz bir yol gibi gözüküyor, ama bunu yapabilmem için bir sebep olabilir.

Yani, ilk girişim, sadece bu yüzden astype(np.int8) ile dönüşüm olarak yapılmalıdır get_dummies için bir seçenek olarak görünmemektedir (tek bayt tamsayıya değiştirin.

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)], 
           axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null int8 
itemID__2 100 non-null int8 
itemID__3 100 non-null int8 

memory usage: 1.5 KB 

Her kukla sütun Şimdi daha önce olduğu gibi bellek 1/8 sürer.

Alternatif olarak, get_dummies ait sparse seçeneğini kullanabilirsiniz.

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)], 
           axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null float64 
itemID__2 100 non-null float64 
itemID__3 100 non-null float64 

memory usage: 2.0 KB 

Oldukça karşılaştırılabilir tasarruf. info() çıktısı bir şekilde tasarrufların meydana gelme şeklini gizler, ancak toplam tasarrufları görmek için bellek kullanımının değerine bakabilirsiniz.

Bunlardan hangisinin pratikte daha iyi çalışacağını söylemek zor (eğer pratik bir çözümse), bu yüzden her birini denemeniz gerekir. Teoride, iki yaklaşımı bile birleştirebilirsiniz, ancak her bir yaklaşımın kendi başına işlediği sürece bunu denemem.

+0

Çok teşekkür ederim. Veri tipini tamsayı olarak değiştirdim ve işe yarıyor! – Duesentrieb