機器學習中典型工作流程

讀取和清洗數據

將現實世界中得到的數據(如文本和圖像)格式化爲算法可以處理的格式(數字特徵)。

見另一篇Blog:

機器學習中樣本數據預處理

一句話,數據決定了你的任務是成功和失敗。

探索和理解輸入數據

通常需要統計學和基礎數學知識,引入一個概念:探索性數據分析(Exploratory Data Analysis, EDA )。

見Blog:

機器學習探索性數據分析

分析如何最好的將數據呈現給學習算法

特徵工程(feature engineering)

一個簡單算法在精心選擇的特徵上的效果要比一個漂亮算法在較差的特徵上的效果還要好

通常好特徵的目標是在重要的地方取不同值,而在不重要的地方不變。有時需要藉助背景知識通過直覺來判斷哪些是好特徵。能否自動地把好特徵選出來 -> 特徵選擇(feature selection)

刪除低方差的特徵

from sklearn.feature_selection import VarianceThreshold

單變量特徵選擇

from sklearn.feature_selection import SelectKBest
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

scikit-learn:
- 迴歸: f_regression, mutual_info_regression
- 分類: chi2, f_classif, mutual_info_classif

遞歸特徵消減

給定一個外部估計器,它爲特徵賦值(例如,線性模型的係數),遞歸特性消除(RFE)是通過遞歸地考慮越來越小的特性集來選擇特性。首先,評估人員在初始的特性集上進行訓練,並且通過一個coef_屬性或通過一個feature_importances_屬性獲得每個特性的重要性。然後,最不重要的特性從當前的特性集中刪除。這個過程在修剪器上遞歸地重複,直到最終達到所需的特特徵數量。

通過模型進行特徵選擇

  • L1-based feature selection

  • Tree-based feature selection

將特徵選擇嵌入pipeline

from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

使用sklearn.svm.LinearSVC與sklearn.feature_selection.SelectFromModel結合來評估要素重要性並選擇最相關的特徵。

選擇正確的模型和學習算法

基礎概念:

  • 泛化能力(generalization ability)是指學習方法對未知數據的預測能力。
  • 過擬合(over-fitting)是指學習時選擇的模型所包含的參數過多,以致於出現這一模型對已知數據預測的很好,但對於未知數據預測的很差的現象。可以說模型選擇旨在避免過擬合併提高模型的預測能力。
  • 正則化(regularization)是模型選擇的典型方法。是結構風險最小化策略的實現,在經驗風險上加上一個正則化項或罰項。
  • 奧卡姆剃刀(Occam’s razor)應用於模型選擇:在所有可能選擇的模型中,能夠很好地解釋一直數據並且簡單的纔是最好的模型。
  • No Free Lunch:一種算法只是針對某一問題來說是最好的。

深思熟慮,權衡性能和功能。統計學習方法三要素:

  • 模型(model):所要學習的條件概率分佈P(Y|X)或決策函數Y=f(X)
  • 策略(strategy):損失函數和風險函數
  • 算法(algorithm):最優化

Pipeline

這可以用來將多個估計量鏈化合一。因爲在處理數據時,通常有着一系列固定的步驟,比如特徵選擇、歸一化和分類,此時這個方法將非常有用。

>>> from sklearn.pipeline import Pipeline
>>> text_clf = Pipeline([('vect', CountVectorizer()),
...                      ('tfidf', TfidfTransformer()),
...                      ('clf', MultinomialNB()),
... ])

>>> text_clf.fit(twenty_train.data, twenty_train.target)

GridSearch

超參數在參數估計中是不直接學習的,在scikit-learn庫中,超參數會作爲參數傳遞給估計類的構造函數,然後在超參數空間中搜索最佳的交叉驗證分數在構建參數估計量時提供的任何參數都是可以用這種方式進行優化的。

>>> from sklearn.model_selection import GridSearchCV
>>> parameters = {'vect__ngram_range': [(1, 1), (1, 2)],
...               'tfidf__use_idf': (True, False),
...               'clf__alpha': (1e-2, 1e-3),
... }

>>> gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1)
>>> gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)

正確的評估性能

基礎概念:

  • 訓練集(training set)用於運行你的學習算法。
  • 開發集(development set)用於調整參數,選擇特徵,以及對學習算法作出其它決定。有時也稱爲留出交叉驗證集(hold-out cross validation set)。
  • 測試集(test set)用於評估算法的性能,但不會據此決定使用什麼學習算法或參數。

開發集和測試集的使命就是引導你的團隊對機器學習系統做出最重要的改變。合理地設置開發集和測試集,使之近似模擬可能的實際數據情況,並處理得到一個好的結果。

建立開發集和測試集

  • 選擇作爲開發集和測試集的數據,應當與你預期在將來獲取並良好處理的數據有着相同的分佈,但不需要和訓練集數據的分佈一致。
  • 開發集和測試集的分佈應當儘可能一致。
  • 爲你的團隊選擇一個單值評估指標進行優化。需要考慮多項目標時,不妨將它們整合到一個表達式裏(比如對多個誤差指標取平均),或者定義滿意度指標和優化指標。
  • 機器學習是一個高速迭代的過程:在最終令人滿意的方案出現前,你可能要嘗試很多想法。
  • 擁有開發集、測試集和單值評估指標可以幫你快速評估一個算法,從而加速迭代過程。
  • 當你探索一個全新的應用時,儘可能在一週內建立你的開發集、測試集和指標,而在成熟的應用上則可以花費更長的時間。
  • 傳統的 70% / 30% 訓練集/測試集劃分對大規模數據並不適用,實際上開發集和測試集的比例會遠低於 30%。
  • 開發集的規模應當大到能夠檢測出算法精度的細微改變,但也不用太大;測試集的規模應該大到能夠使你對系統的最終性能作出一個充分的估計。
  • 當開發集和評估指標不再能給團隊一個正確的導向時,就儘快修改它們:(i) 如果你在開發集上過擬合,則獲取更多的開發集數據。(ii) 如果開發集和測試集的數據分佈和實際關注的數據分佈不同,則獲取新的開發集和測試集。 (iii) 如果評估指標不能夠對最重要的任務目標進行度量,則需要修改評估指標。

留存數據和交叉檢驗

我們真正想做的事情是衡量模型對新樣本的泛化能力。所以,應該使用訓練中未出現的數據來評估模型的性能。

  • 留存數據:將數據分成兩部分,一部分用於訓練模型,一部分用於測試模型效果
  • 交叉驗證(cross-validation): 如K折交叉驗證,把數據分成K份,每次訓練分別把其中一份數據拿出去,在留存數據上測試這些模型的效果,最後取平均值。生成數據折的時候,需要謹慎地保持數據分佈的平衡
    • 去一法(leave-one-out):交叉驗證的一個極端。從訓練集中拿出一個樣本,並在缺少這個樣本的數據上訓練一個模型,然後看模型是否能對這個樣本正確分類。主要問題是針對每個樣本都需要學習一個全新的模型,工作量隨數據量變大而增加。

實踐指導:

  • 開發集和測試集應該服從同一分佈
  • 使用單值評估指標進行優化。當你在多個分類器之間進行抉擇時,使用單值評估指標將幫助你更快速地作出決定。它能給出一個清楚的分類器性能排名,從而幫助明確團隊後續的處理方向。
  • 優化指標和滿意度指標。如:在限定的運行時間(滿意度指標)範圍內最大化分類器的準確率(優化指標)。或許會考慮設置N-1個“滿意度”指標,即要求它們滿足一定的值,然後定義一個“優化”指標。
  • 誤差分析:根據開發集樣本評估想法。誤差分析(Error Analysis) 指的是檢查算法誤分類的開發集樣本的過程,以便你找到造成這些誤差的原因。這將幫助你確定項目優先級並且獲得關於新方向的靈感。

機器學習初學者常犯錯誤的地方,如:
- 使用了與訓練相同的數據來測試你的方法(簡單的錯誤)
- 使用了不平衡的訓練數據(Hard)


任何複雜系統都是由基礎工程構成的,尤其是算法出現問題時,增量地搭建系統可以確保我們及時找出問題出現的位置和原因。

機器學習實踐:
- 把精力從算法轉移到數據上(也不盡然,這是從數據挖掘的角度上來談的)
- 正確設置實驗的重要性

《Building Machine Learning Systems with Python》

《Machine Learning in Action》

《Machine Learning Yearning》

http://blog.kaggle.com

http://scikit-learn.org/stable/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章