使用sklearn进行增量学习
问题
实际处理和解决机器学习问题过程中,我们会遇到一些“大数据”问题,比如有上百万条数据,上千上万维特征,此时数据存储已经达到10G这种级别。这种情况下,如果还是直接使用传统的方式肯定行不通,比如当你想把数据load到内存中转成numpy数组,你会发现要么创建不了那么大的numpy矩阵,要么直接加载时报MemeryError。
在这种情况下我了解了几种选择办法,1. 对数据进行降维,2. 使用流式或类似流式处理,3. 上大机器,高内存的,或者用spark集群。
文档
Sklearn里面提供一些流式处理方法。具体可以参考官方文档:
讲解了怎么处理 big data 文件:http://scikit-learn.org/stable/modules/scaling_strategies.html
通过一个例子讲解了怎么用:http://scikit-learn.org/stable/auto_examples/applications/plot_out_of_core_classification.html
简单介绍
我看了上面两个文档,并使用介绍的SGDClassifier进行分类,效果挺好的,这里记录下用法。
要实现big data的处理,需要满足三个条件:
1. 有流式数据
2. 能从数据中可以提取出特征
3. 增量学习算法
1. 流式数据
第一个条件,要给算法流式数据或小batch的数据,比如一次提供1000条这样。这一块是需要自己写代码提供的,可以实现一个生成器,每调用一次提供一份小batch数据。
2. 提取特征
第二个条件,可以使用任何一种sklearn中支持的特征提取方法。对于一些特殊情况,比如特征需要标准化或者是事先不知道特征值的情况下需要特殊处理。
3. 增量学习算法
对于第三个条件,sklearn中提供了很多增量学习算法。虽然不是所有的算法都可以增量学习,但是学习器提供了 partial_fit
的函数的都可以进行增量学习。事实上,使用小batch的数据中进行增量学习(有时候也称为online learning)是这种学习方式的核心,因为它能让任何一段时间内内存中只有少量的数据。
sklearn提供很多增量学习算法:
- Classification
- sklearn.naive_bayes.MultinomialNB
- sklearn.naive_bayes.BernoulliNB
- sklearn.linear_model.Perceptron
- sklearn.linear_model.SGDClassifier
- sklearn.linear_model.PassiveAggressiveClassifier
- Regression
- sklearn.linear_model.SGDRegressor
- sklearn.linear_model.PassiveAggressiveRegressor
- Clustering
- sklearn.cluster.MiniBatchKMeans
- Decomposition / feature Extraction
- sklearn.decomposition.MiniBatchDictionaryLearning
- sklearn.decomposition.IncrementalPCA
- sklearn.decomposition.LatentDirichletAllocation
- sklearn.cluster.MiniBatchKMeans
其中对于分类问题,在第一次调用partial_fit
时需要通过classes
参数指定分类的类别。
另外有一点需要考虑,所有的学习器在学习过程中不会对每个样例赋予同样的权重。对于感知机,它对于bad样本会敏感,即使学习器已经学习了很多样本了,而对于SGD和PassiveAggressive,对于这种情况会更鲁棒一点,后者在学习的时候,后来学习样本的权重会随着学习器学习率的下降而降低。
1. 生成一个文件流迭代器
def iter_minibatches(data_stream, minibatch_size=1000):'''迭代器给定文件流(比如一个大文件),每次输出minibatch_size行,默认选择1k行将输出转化成numpy输出,返回X, y'''X = []y = []cur_line_num = 0csvfile = file(data_stream, 'rb')reader = csv.reader(csvfile)for line in reader:y.append(float(line[0]))X.append(line[1:]) # 这里要将数据转化成float类型cur_line_num += 1if cur_line_num >= minibatch_size:X, y = np.array(X), np.array(y) # 将数据转成numpy的array类型并返回yield X, yX, y = [], []cur_line_num = 0csvfile.close()# 生成测试文件
minibatch_test_iterators = iter_minibatches(test_file, minibatch_size=5000)
X_test, y_test = minibatch_test_iterators.next() # 得到一份测试文件
2. 增量训练
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier() # SGDClassifier的参数设置可以参考sklearn官网
minibatch_train_iterators = iter_minibatches(data_part_file, minibatch_size=2000)for i, (X_train, y_train) in enumerate(minibatch_train_iterators):# 使用 partial_fit ,并在第一次调用 partial_fit 的时候指定 classessgd_clf.partial_fit(X_train, y_train, classes=np.array([0, 1]))print("{} time".format(i)) # 当前次数print("{} score".format(sgd_clf.score(X_test, y_test))) # 在测试集上看效果
3. 结果
0 time
0.679 score
1 time
0.6954 score
2 time
0.712 score
3 time
0.7248 score
...
57 time
0.745 score
58 time
0.7394 score
59 time
0.7398 score
4. 一点补充
- 当SGD的损失函数为log时,SGD等价于LR。
- 数据只迭代一次分类器可能还没完全收敛,可以多迭代几次
- mini-batch的量不要设置太小,太小的话,需要多迭代几次才能收敛
转自https://blog.csdn.net/whiterbear/article/details/53120004
使用sklearn进行增量学习相关推荐
- sklearn 增量学习
如果想用sklearn进行在线学习如何操作呢? https://scikit-learn.org/stable/modules/computing.html?highlight=incremental ...
- 机器学习-增量训练方法
机器学习-增量训练方法 1. 为什么要增量训练 做过机器学习的同学都知道,有时候训练数据是很多的,几十万几百万也是常有的事.虽然几十万几百万只看记录数不算多,但是如果有几百个特征呢,那数据集是很恐怖的 ...
- 【Python】积累与发现
文章目录 Pip Conda Python yield 字符集 协程 多线程 argparse PyMysql Numpy Scipy 优化 矩阵操作 Matplotlib 画图 配置 字体 Pand ...
- LESSON 9.5 随机森林在巨量数据上的增量学习
五 随机森林在巨量数据上的增量学习 集成学习是工业领域中应用最广泛的机器学习算法.实际工业环境下的数据量往往十分巨大,一个训练好的集成算法的复杂程度与训练数据量高度相关,因此企业在应用机器学习时通常会 ...
- hands-on Machine Learning with sklearn
一.机器学习概览 三.分类 1.二分类器 2.多分类器 3.误差分析 四.训练模型 1.线性回归和逻辑回归 2.逻辑回归 3.softmax回归 练习题4 五.SVM 练习题5 六.决策树 练习题6 ...
- 机器学习---sklearn
1.Sklearn简介 sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具,Sklea是处理机器学习 (有监督学习和无监督学习) 的包.它建立在 NumPy, ...
- Sklearn机器学习中的主要算法原理以及实现
资源下载地址:https://download.csdn.net/download/sheziqiong/85894781 资源下载地址:https://download.csdn.net/downl ...
- 决策树留一法python代码_机器学习模型2 决策树-基于Python sklearn的实现
1.模型原理 (一)原理 1.原理:引入信息熵(不确定程度)的概念,通过计算各属性下的信息增益程度(信息增益越大,则意味着使用该属性来进行划分所获得的"纯度提升"越大),增益程度最 ...
- sklearn中的学习曲线learning_curve函数
learning_curve学习曲线 运行原理 学习曲线. 确定交叉验证的针对不同训练集大小的训练和测试分数. 交叉验证生成器将整个数据集拆分为训练和测试数据中的k次. 具有不同大小的训练集的子集将用 ...
最新文章
- 聊聊新零售概念与其技术
- 揭开人类语言的神秘面纱:从理解到处理自然语言
- 磁盘阵列RAID的分类有哪些?
- 代码质量与规范,那些年你欠下的技术债
- Snackbar-Android M新控件
- 48幅非常搞笑的平面广告作品欣赏(上篇)
- SAP Spartacus 的 Above-the-Fold Loading 加载机制
- 排错“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”...
- 喜欢初音未来的桌面壁纸看过来
- python中pass的使用_pass语句如何在Python项目中使用
- 树莓派 Learning 001 装机 ---之 1 安装NOOBS系统
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
- 8086cpu学习笔记(1):系统结构
- 计算机黑屏什么原因,教您电脑黑屏的原因是什么
- Node.js meitulu图片批量下载爬虫1.06版
- java.lang.IllegalStateException: No instances available for user
- HTB打靶(Active Directory 101 Forest)
- 酒香不怕巷子深,有心人才找得到的京都茶寮
- 你未必知的拼音打字快打十招
- 拦截器、过滤器、监听器
热门文章
- 达梦数据库安全管理与体系
- 解决办法在idea中搭建spark环境:Unable to fetch table student. Invalid method name: ‘get_table_req‘;
- FRM P1B4笔记:Valuation and Risk Models
- AI一分钟 | 苹果9月13日凌晨召开发布会;林斌晒小米手机新品,“撞脸”荣耀Magic 2...
- CFML----一门在国外很多大公司得到应用的语言
- 解决Word导出PDF显示有批注的问题
- 如何获取酷我音乐播放器中的歌手写真
- 7-3 拍7令三 (100 分)
- 一名优秀的数据分析师,应该具备哪些基本素质?
- 各国语言名称英文简写对照表