sklearn 增量学习
对于大数据集,在训练时会出现MemoryError 。sklearn提供了几种办法,一是从根本上节省空间,二是流式读取,三是节省每次运行时的数据量。
1. 流式数据
要给算法流式数据或小batch的数据。读入数据的一部分?
2. 特征提取 或者降维
sklearn提供了很多方法。
3. 增量学习算法
sklearn 中任何提供了 partial_fit的函数的学习器都可以进行增量学习。运行数据的一部分。每次训练只有一个mini-batch 的数据在main memory里。需要调整mini-batch 中的样本数来平衡占用空间和相关性。
4. 如果矩阵稀疏的话,要用稀疏矩阵
scipy中稀疏矩阵定义在scipy.sparse下,有coo、lil、csr等多种格式。从用途出发比较容易理解它们的特点,文档中的描述是:
To construct a matrix efficiently, use either dok_matrix or lil_matrix.
要高效地创建矩阵,使用dok或者lil格式。
To perform manipulations such as multiplication or inversion, first convert the matrix to either csc or csr format.
要执行乘法或者求逆操作,先转换为csc或者csr格式。
5. 用交叉验证时,
n_jobs:处理器个数。
fold : 数据分割的份数,也是交叉验证的次数。
设置是cv=12, n_jobs=3,也就是用三个处理器(记为CPU_A, CPU_B, CPU_C),进行12次cross validation(记为CV_1, CV_2, CV_3, ..., CV_12)。pre_dispatch是预派遣的意思,就是提前先把任务派遣给各个处理器。
如果我们没有设置cross_val_score中的参数pre_dispatch,当我们开始执行cross_val_score,程序会一次性把全部12个CV都派遣出去,每个处理器领到4个CV。要特别注意了,这里的派遣并不是口头的安排任务,而是把任务和任务对应的数据也发送给处理器。比如说,CPU_A领到了CV_1, CV_4, CV_7, CV_10,那么CPU_A就领到了四份训练数据集、四份测试集存放在内存里(又是重点),然后CPU_A开始依次完成CV_1, CV_4, CV_7, CV_10。
如果我们设置pre_dispatch=‘2*n_jobs’,当我们开始执行cross_val_score,程序会派遣6个CV出去,每个处理器领到2个CV。所以一开始每个处理器只需要存两份训练集、测试集(划重点)。比如说CPU_A领到了CV_1和CV_4,CPU_B领到了CV_2和CV_5,CPU_C领到了CV_3和CV_6,如果CPU_B率先完成了CV_2,那么系统会自动把CV_7派遣给CPU_B,节奏CPU_A完成了CV_1,系统再把任务CV_8放在CPU_A的任务队列里。pre_dispatch=‘2*n_jobs’的意思就是保持每个CPU都有两个任务在身(一个在做,一个在排队),除非所有任务都被派遣出去了。
如果我们设置pre_dispatch=‘1*n_jobs’,这样占用的内存最低,因为只有当当前的任务完成之后,才会有新任务(数据)派遣到闲置处理器,而非将数据放在队列中等待。