2015-10-02 32 views
1

我有一個以svmlight數據集形式存在的15M +訓練實例的數據集。我使用sklearn.datasets.load_svmlight_file()讀取這些數據。數據本身並不稀疏,所以我不介意將其轉換爲任何其他密集表示(我更喜歡這一點)。將訓練實例插入scikit-learn數據集

在我的程序中的某個時候,我需要爲我的訓練數據(隨機位置)添加數以百萬計的新數據記錄(實例)。我使用vstack,也嘗試轉換爲密集矩陣,但效率不高或未能提供正確的結果(詳情如下)。有沒有辦法有效地完成這項任務?

我正在實施DAgger算法,並且在第一次迭代中它試圖添加大約7M個新的訓練實例。我想在隨機位置添加這些新實例。我試過vstack(因爲我的數據是csr格式的,我期望它至少不會太低效)。然而,24小時後還沒有完成。

我試圖將數據轉換爲numpy.matrix格式,只是以svmlight格式加載它們之後。抽樣顯示它可以幫助我加快速度,但有趣的是,我從轉換數據集和原始數據集的訓練中得到的結果看起來並不匹配。它似乎sklearn不符合我認爲的方式與numpy矩陣。我在sklearn文檔中找不到任何東西。

我認爲的另一種方法是從一開始就定義一個更大的數據集,以便它在內存中「保留」足夠的空間,但是當我使用sklearn訓練或測試功能時,我會將我的數據集編入最後「真實」記錄。這樣,我認爲,vstack不會要求在內存中開闢一個新的大空間,這可能會使整個操作需要更長的時間。對此有何想法?

回答

0

第一:我猜稀疏數據給出了一個不同的答案,而不是相同的數據轉換爲密集的原因是,我的稀疏表示從一個而不是零開始特徵索引(因爲我使用的oll庫以前需要這麼做)。所以我的第一列全部爲零,當轉換爲密集時,它不會被保留下來,這就是使用密集表示時略好的結果的原因。

第二:在該比例中向稀疏矩陣添加新行是無效的。即使您在開始時預留一個大矩陣(帶有填充的零),以後再進行替換。這可能是因爲結構稀疏矩陣存儲在(它使用三個數組,如果行數爲crs一個,行數爲一個非零列索引,值本身爲一個,請檢查文檔)。

解決方案:我發現的最好方法是從頭開始使用密集表示法(當然,如果這是個選項)。收集所有需要添加到訓練集的實例。將一個新的矩陣實例化爲聚集數據的大小,然後開始從最後一個訓練集中「隨機」添加實例,也從您想要添加的新實例開始添加實例。爲了使它隨機,我生成一個隨機位置的排序列表,告訴我什麼時候應該從新實例添加數據,否則從較舊的實例複製。

相關問題