# 6. 大规模计算的策略: 更大量的数据
校验者:
[@文谊](https://github.com/apachecn/scikit-learn-doc-zh)
翻译者:
[@ゞFingヤ](https://github.com/apachecn/scikit-learn-doc-zh)
对于一些应用程序,需要被处理的样本数量,特征数量(或两者)和/或速度这些对传统的方法而言非常具有挑战性。在这些情况下,scikit-learn 有许多你值得考虑的选项可以使你的系统规模化。
## 6.1. 使用外核学习实例进行拓展
外核(或者称作 “外部存储器”)学习是一种用于学习那些无法装进计算机主存储(RAM)的数据的技术。
这里描述了一种为了实现这一目的而设计的系统:
> 1. 一种用流来传输实例的方式
> 2. 一种从实例中提取特征的方法
> 3. 增量式算法
### 6.1.1. 流式实例
基本上, 1. 可能是从硬盘、数据库、网络流等文件中产生实例的读取器。然而,关于如何实现的相关细节已经超出了本文档的讨论范围。
### 6.1.2. 提取特征
2\. 可以是 scikit-learn 支持的的不同 :ref: 特征提取 <feature\_extraction> 方法中的任何相关的方法。然而,当处理那些需要矢量化并且特征或值的集合你预先不知道的时候,就得明确注意了。一个好的例子是文本分类,其中在训练的期间你很可能会发现未知的项。从应用的角度上来看,如果在数据上进行多次通过是合理的,则可以使用有状态的向量化器。否则,可以通过使用无状态特征提取器来提高难度。目前,这样做的首选方法是使用所谓的 [哈希技巧](feature_extraction.html#feature-hashing),在 [`sklearn.feature_extraction.FeatureHasher`](generated/sklearn.feature_extraction.FeatureHasher.html#sklearn.feature_extraction.FeatureHasher "sklearn.feature_extraction.FeatureHasher") 中,其中有分类变量的表示为 Python 列表或 [`sklearn.feature_extraction.text.HashingVectorizer`](generated/sklearn.feature_extraction.text.HashingVectorizer.html#sklearn.feature_extraction.text.HashingVectorizer "sklearn.feature_extraction.text.HashingVectorizer") 文本文档。
### 6.1.3. 增量学习
最后,对于3. 我们在 scikit-learn 之中有许多选择。虽软不是所有的算法都能够增量学习(即不能一次性看到所有的实例),所有实 `partial_fit` 的 API 估计器都作为了候选。实际上,从小批量的实例(有时称为“在线学习”)逐渐学习的能力是外核学习的关键,因为它保证在任何给定的时间内只有少量的实例在主存储中,选择适合小批量的尺寸来平衡相关性和内存占用可能涉及一些调整 [\[1\]](#id9)。
以下是针对不同任务的增量估算器列表:
> - Classification(分类)
> - [`sklearn.naive_bayes.MultinomialNB`](generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB "sklearn.naive_bayes.MultinomialNB")
> - [`sklearn.naive_bayes.BernoulliNB`](generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB "sklearn.naive_bayes.BernoulliNB")
> - [`sklearn.linear_model.Perceptron`](generated/sklearn.linear_model.Perceptron.html#sklearn.linear_model.Perceptron "sklearn.linear_model.Perceptron")
> - [`sklearn.linear_model.SGDClassifier`](generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier "sklearn.linear_model.SGDClassifier")
> - [`sklearn.linear_model.PassiveAggressiveClassifier`](generated/sklearn.linear_model.PassiveAggressiveClassifier.html#sklearn.linear_model.PassiveAggressiveClassifier "sklearn.linear_model.PassiveAggressiveClassifier")
> - [`sklearn.neural_network.MLPClassifier`](generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier "sklearn.neural_network.MLPClassifier")
> - Regression(回归)
> - [`sklearn.linear_model.SGDRegressor`](generated/sklearn.linear_model.SGDRegressor.html#sklearn.linear_model.SGDRegressor "sklearn.linear_model.SGDRegressor")
> - [`sklearn.linear_model.PassiveAggressiveRegressor`](generated/sklearn.linear_model.PassiveAggressiveRegressor.html#sklearn.linear_model.PassiveAggressiveRegressor "sklearn.linear_model.PassiveAggressiveRegressor")
> - [`sklearn.neural_network.MLPRegressor`](generated/sklearn.neural_network.MLPRegressor.html#sklearn.neural_network.MLPRegressor "sklearn.neural_network.MLPRegressor")
> - Clustering(聚类)
> - [`sklearn.cluster.MiniBatchKMeans`](generated/sklearn.cluster.MiniBatchKMeans.html#sklearn.cluster.MiniBatchKMeans "sklearn.cluster.MiniBatchKMeans")
> - [`sklearn.cluster.Birch`](generated/sklearn.cluster.Birch.html#sklearn.cluster.Birch "sklearn.cluster.Birch")
> - Decomposition / feature Extraction(分解/特征提取)
> - [`sklearn.decomposition.MiniBatchDictionaryLearning`](generated/sklearn.decomposition.MiniBatchDictionaryLearning.html#sklearn.decomposition.MiniBatchDictionaryLearning "sklearn.decomposition.MiniBatchDictionaryLearning")
> - [`sklearn.decomposition.IncrementalPCA`](generated/sklearn.decomposition.IncrementalPCA.html#sklearn.decomposition.IncrementalPCA "sklearn.decomposition.IncrementalPCA")
> - [`sklearn.decomposition.LatentDirichletAllocation`](generated/sklearn.decomposition.LatentDirichletAllocation.html#sklearn.decomposition.LatentDirichletAllocation "sklearn.decomposition.LatentDirichletAllocation")
> - Preprocessing(预处理)
> - [`sklearn.preprocessing.StandardScaler`](generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler "sklearn.preprocessing.StandardScaler")
> - [`sklearn.preprocessing.MinMaxScaler`](generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler "sklearn.preprocessing.MinMaxScaler")
> - [`sklearn.preprocessing.MaxAbsScaler`](generated/sklearn.preprocessing.MaxAbsScaler.html#sklearn.preprocessing.MaxAbsScaler "sklearn.preprocessing.MaxAbsScaler")
对于分类,有一点要注意的是,虽然无状态特征提取程序可能能够应对新的/未知的属性,但增量学习者本身可能无法应对新的/未知的目标类。在这种情况下,你必须使用 `classes=` 参数将所有可能的类传递给第一个 `partial_fit` 调用。
选择合适的算法时要考虑的另一个方面是,所有这些算法随着时间的推移不会给每个样例相同的重要性。比如说, `Perceptron` 仍然对错误标签的例子是敏感的,即使经过多次的样例训练,而 `SGD*` 和 `PassiveAggressive*` 族对这些鲁棒性更好。相反,对于后面传入的数据流,算法的学习速率随着时间不断降低,后面两个算法对于那些显著差异的样本和标注正确的样本倾向于给予很少的重视。
### 6.1.4. 示例
最后,我们有一个完整的 [Out-of-core classification of text documents](../auto_examples/applications/plot_out_of_core_classification.html#sphx-glr-auto-examples-applications-plot-out-of-core-classification-py) 文本文档的核心分类的示例。旨在为想要构建核心学习系统的人们提供一个起点,并展示上述大多数概念。
此外,它还展现了不同算法性能随着处理例子的数量的演变。
**[](../auto_examples/applications/plot_out_of_core_classification.html)**
现在我们来看不同部分的计算时间,我们看到矢量化的过程比学习本身耗时还多。对于不同的算法,MultinomialNB 是耗时最多的,但通过增加其 mini-batches 的大小可以减轻开销。(练习:minibatch\_size 在程序中更改为100和10000,并进行比较)。
**[](../auto_examples/applications/plot_out_of_core_classification.html)**
### 6.1.5. 注释
[\[1\]](#id6)根据算法,mini-batch 大小可以影响结果。SGD\*,PassiveAggressive\* 和离散的 NaiveBayes 是真正在线的,不受 batch 大小的影响。相反,MiniBatchKMeans 收敛速度受 batch 大小影响。此外,其内存占用可能会随 batch 大小而显着变化。
- scikit-learn 0.19 中文文档
- 用户指南
- 1. 监督学习
- 1.1. 广义线性模型
- 1.2. 线性和二次判别分析
- 1.3. 内核岭回归
- 1.4. 支持向量机
- 1.5. 随机梯度下降
- 1.6. 最近邻
- 1.7. 高斯过程
- 1.8. 交叉分解
- 1.9. 朴素贝叶斯
- 1.10. 决策树
- 1.11. 集成方法
- 1.12. 多类和多标签算法
- 1.13. 特征选择
- 1.14. 半监督学习
- 1.15. 等式回归
- 1.16. 概率校准
- 1.17. 神经网络模型(有监督)
- 2. 无监督学习
- 2.1. 高斯混合模型
- 2.2. 流形学习
- 2.3. 聚类
- 2.4. 双聚类
- 2.5. 分解成分中的信号(矩阵分解问题)
- 2.6. 协方差估计
- 2.7. 经验协方差
- 2.8. 收敛协方差
- 2.9. 稀疏逆协方差
- 2.10. Robust 协方差估计
- 2.11. 新奇和异常值检测
- 2.12. 密度估计
- 2.13. 神经网络模型(无监督)
- 3. 模型选择和评估
- 3.1. 交叉验证:评估估算器的表现
- 3.2. 调整估计器的超参数
- 3.3. 模型评估: 量化预测的质量
- 3.4. 模型持久化
- 3.5. 验证曲线: 绘制分数以评估模型
- 4. 数据集转换
- 4.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- 4.2. 特征提取
- 4.3. 预处理数据
- 4.4. 无监督降维
- 4.5. 随机投影
- 4.6. 内核近似
- 4.7. 成对的矩阵, 类别和核函数
- 4.8. 预测目标 (y) 的转换
- 5. 数据集加载工具
- 6. 大规模计算的策略: 更大量的数据
- 7. 计算性能
- 教程
- 使用 scikit-learn 介绍机器学习
- 关于科学数据处理的统计学习教程
- 机器学习: scikit-learn 中的设置以及预估对象
- 监督学习:从高维观察预测输出变量
- 模型选择:选择估计量及其参数
- 无监督学习: 寻求数据表示
- 把它们放在一起
- 寻求帮助
- 处理文本数据
- 选择正确的评估器(estimator)
- 外部资源,视频和谈话