對(duì)于大數(shù)據(jù)集苞笨,在訓(xùn)練時(shí)會(huì)出現(xiàn)MemoryError 稠腊。sklearn提供了幾種辦法,一是從根本上節(jié)省空間畸陡,二是流式讀取鹰溜,三是節(jié)省每次運(yùn)行時(shí)的數(shù)據(jù)量。
1. 流式數(shù)據(jù)
要給算法流式數(shù)據(jù)或小batch的數(shù)據(jù)丁恭。讀入數(shù)據(jù)的一部分曹动?
2. 特征提取 或者降維
sklearn提供了很多方法。
3.?增量學(xué)習(xí)算法
sklearn 中任何提供了?partial_fit的函數(shù)的學(xué)習(xí)器都可以進(jìn)行增量學(xué)習(xí)牲览。運(yùn)行數(shù)據(jù)的一部分墓陈。每次訓(xùn)練只有一個(gè)mini-batch 的數(shù)據(jù)在main memory里。需要調(diào)整mini-batch 中的樣本數(shù)來(lái)平衡占用空間和相關(guān)性竭恬。
4. 如果矩陣稀疏的話跛蛋,要用稀疏矩陣
scipy中稀疏矩陣定義在scipy.sparse下,有coo痊硕、lil赊级、csr等多種格式。從用途出發(fā)比較容易理解它們的特點(diǎn)岔绸,文檔中的描述是:
To construct a matrix efficiently, use either dok_matrix or lil_matrix.
要高效地創(chuàng)建矩陣理逊,使用dok或者lil格式。
To perform manipulations such as multiplication or inversion, first convert the matrix to either csc or csr format.
要執(zhí)行乘法或者求逆操作盒揉,先轉(zhuǎn)換為csc或者csr格式晋被。
5. 用交叉驗(yàn)證時(shí),
n_jobs:處理器個(gè)數(shù)刚盈。
fold : 數(shù)據(jù)分割的份數(shù)羡洛,也是交叉驗(yàn)證的次數(shù)。
設(shè)置是cv=12, n_jobs=3藕漱,也就是用三個(gè)處理器(記為CPU_A, CPU_B, CPU_C)欲侮,進(jìn)行12次cross validation(記為CV_1, CV_2, CV_3, ..., CV_12)崭闲。pre_dispatch是預(yù)派遣的意思,就是提前先把任務(wù)派遣給各個(gè)處理器威蕉。
如果我們沒有設(shè)置cross_val_score中的參數(shù)pre_dispatch刁俭,當(dāng)我們開始執(zhí)行cross_val_score,程序會(huì)一次性把全部12個(gè)CV都派遣出去韧涨,每個(gè)處理器領(lǐng)到4個(gè)CV牍戚。要特別注意了,這里的派遣并不是口頭的安排任務(wù)虑粥,而是把任務(wù)和任務(wù)對(duì)應(yīng)的數(shù)據(jù)也發(fā)送給處理器如孝。比如說(shuō),CPU_A領(lǐng)到了CV_1, CV_4, CV_7, CV_10舀奶,那么CPU_A就領(lǐng)到了四份訓(xùn)練數(shù)據(jù)集暑竟、四份測(cè)試集存放在內(nèi)存里(又是重點(diǎn)),然后CPU_A開始依次完成CV_1, CV_4, CV_7, CV_10育勺。
如果我們?cè)O(shè)置pre_dispatch=‘2*n_jobs’,當(dāng)我們開始執(zhí)行cross_val_score罗岖,程序會(huì)派遣6個(gè)CV出去涧至,每個(gè)處理器領(lǐng)到2個(gè)CV。所以一開始每個(gè)處理器只需要存兩份訓(xùn)練集桑包、測(cè)試集(劃重點(diǎn))南蓬。比如說(shuō)CPU_A領(lǐng)到了CV_1和CV_4,CPU_B領(lǐng)到了CV_2和CV_5哑了,CPU_C領(lǐng)到了CV_3和CV_6赘方,如果CPU_B率先完成了CV_2,那么系統(tǒng)會(huì)自動(dòng)把CV_7派遣給CPU_B弱左,節(jié)奏CPU_A完成了CV_1窄陡,系統(tǒng)再把任務(wù)CV_8放在CPU_A的任務(wù)隊(duì)列里。pre_dispatch=‘2*n_jobs’的意思就是保持每個(gè)CPU都有兩個(gè)任務(wù)在身(一個(gè)在做拆火,一個(gè)在排隊(duì))跳夭,除非所有任務(wù)都被派遣出去了。
如果我們?cè)O(shè)置pre_dispatch=‘1*n_jobs’们镜,這樣占用的內(nèi)存最低币叹,因?yàn)橹挥挟?dāng)當(dāng)前的任務(wù)完成之后,才會(huì)有新任務(wù)(數(shù)據(jù))派遣到閑置處理器模狭,而非將數(shù)據(jù)放在隊(duì)列中等待颈抚。