# 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)
- 外部資源,視頻和談話