Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

數據科學家Abhishek Thakur 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem,文中介紹了一種自動的機器學習框架,號稱可以解決幾乎所有機器學習問題。

先上鍊接:

http://blog.kaggle.com/2016/07/21/approaching-almost-any-machine-learning-problem-abhishek-thakur/

數據科學家每天處理大量數據。 有人說超過60-70%的時間花在數據清理,數據調整上,以便機器學習模型可以應用於該數據。 本文重點介紹第二部分,即應用機器學習模型,包括預處理步驟。 本文中討論的流水線是我參加的一百多個機器學習競賽的結果。必須注意的是,這裡的討論非常普遍但非常有用,也可能存在非常複雜的方法。 由專業人士進行實踐。

我們將使用Python。

數據

在應用機器學習模型之前,必須將數據轉換為表格形式。 整個過程是最耗時且最困難的過程,如下圖所示。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

然後將機器學習模型應用於表格數據。 表格數據是在機器學習或數據挖掘中表示數據的最常用方式。 我們有一個數據表,包含不同數據樣本的行或X和標籤y。 標籤可以是單列或多列,具體取決於問題的類型。 我們將用X表示數據,用y表示標籤。

標籤的類型

標籤定義問題,可以是不同類型,例如:

  • 單列,二進制值(分類問題,一個樣本只屬於一個類,只有兩個類)
  • 單列,實數值(迴歸問題,僅預測一個值)
  • 多列,二進制值(分類問題,一個樣本屬於一個類,但有兩個以上的類)
  • 多列,實數值(迴歸問題,多值預測)
  • 多標籤(分類問題,一個樣本可以屬於幾個類)

評價指標

對於任何類型的機器學習問題,我們必須知道我們將如何評估我們的結果,或評估指標或目標是什麼。 例如,在偏斜二元分類問題的情況下,我們通常選擇受試者工作特徵曲線(ROC AUC或簡稱AUC)下的面積。 在多標籤或多類別分類問題的情況下,我們通常選擇分類交叉熵或多類對數損失和迴歸問題的均方誤差。

我不會詳細介紹不同的評估指標,根據問題有許多不同的類型。

要開始使用機器學習庫,首先安裝基本的和最重要的,比如numpy和scipy。

  • 查看和執行數據操作:pandas(http://pandas.pydata.org/)
  • 對於各種機器學習模型:scikit-learn(http://scikit-learn.org/stable/)
  • 最好的梯度提升庫:xgboost(https://github.com/dmlc/xgboost)
  • 對於神經網絡:keras(http://keras.io/)
  • 繪製數據:matplotlib(http://matplotlib.org/)
  • 監視進度:tqdm(https://pypi.python.org/pypi/tqdm)

我不使用Anaconda(https://www.continuum.io/downloads)。這很容易,為你做一切,但我想要更多的自由。這是你的選擇。

機器學習框架

2015年,我提出了一個自動機器學習的框架,這個框架還在開發之中,很快就會發布。對於本文,同樣的框架將是基礎。框架如下圖所示:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

在上面顯示的框架中,粉紅色的線代表最常用的路徑。在我們提取並將數據縮減為表格格式之後,我們可以繼續構建機器學習模型。

第一步是確定問題。這可以通過查看標籤來完成。必須知道問題是二元分類,多類還是多標籤分類還是迴歸問題。在我們發現問題後,我們將數據分成兩個不同的部分,一個訓練集和一個驗證集,如下圖所示。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

將數據分解為訓練和驗證集“必須”根據標籤進行。在任何分類問題的情況下,使用抽樣分割。在python中,你可以使用scikit-learn很容易地做到這一點。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

在迴歸任務的情況下,簡單的K折分割(K-Ford)就足夠了。然而,有些複雜的方法往往會保持標籤的分佈對於訓練和驗證都是一樣的,這留給讀者練習。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

在上面的例子中,我選擇了eval_size或驗證集的大小作為完整數據的10%,但是可以根據數據的大小選擇這個值。

數據拆分完成後,將這些數據保留,不要觸摸它。必須保存在訓練集上應用的任何操作,然後應用於驗證集。在任何情況下,驗證集都不應該與訓練集一起使用。這樣做雖然會得到非常好的評估分數,讓用戶高興,但將會建立一個嚴重過擬合的無用模型。

下一步是識別數據中的不同變量。通常有三種類型的變量需要我們處理。也就是說,數值變量,分類變量和其中包含文本的變量。讓我們以流行的泰坦尼克號數據集(https://www.kaggle.com/c/titanic/data)為例。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

在這裡,survival就是標籤。我們已經在上一步中將訓練數據中的標籤分開了。然後,我們有pclass,sex,embarked。這些變量具有不同的類別,因此它們是分類變量。像age,sibsp,parch等變量是數值變量。name是一個包含文本數據的變量,但我不認為這是預測survival的有用變量。

首先分開數值變量。這些變量不需要任何類型的處理,因此我們可以開始對這些變量應用規範化和機器學習模型。

有兩種方法可以處理分類數據:

•將分類數據轉換為標籤

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

•將標籤轉換為二進制變量(獨熱編碼one-hot-encoding)

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

請記住先使用LabelEncoder將類別轉換為數字,然後再應用OneHotEncoder。

因為泰坦尼克號的數據沒有文本變量的好例子,所以我們來制定處理文本變量的一般規則。我們可以將所有的文本變量合併為一個,然後使用一些對文本數據起作用的算法並將其轉換為數字。

文本變量可以如下連接:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

然後我們可以使用CountVectorizer或TfidfVectorizer:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

或者,

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

TfidfVectorizer的性能比大多數時候都要好,我已經看到TfidfVectorizer的下列參數幾乎都是在工作。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

如果您僅在訓練集上應用這些向量化器,請確保將其轉儲到硬盤驅動器,以便稍後在驗證集上使用它。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

接下來,我們來到堆垛機模塊(Stacker)。堆垛機模塊不是模型堆垛機,而是特徵堆垛機。上述處理步驟之後的不同特徵可以使用堆疊器模塊進行組合。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

你可以水平堆疊所有的功能之前,通過使用numpy的堆疊或sparse的堆疊進行進一步處理,這取決於你是否有密集或稀疏的功能。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

如果還有其他處理步驟,例如pca或特徵選擇,我們也可以通過FeatureUnion模塊來實現(我們將在本文稍後的部分中介紹分解和特徵選擇)。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

一旦我們把這些特徵疊加在一起,我們可以開始應用機器學習模型。在這個階段只有你應該去的模型應該是基於集成樹的模型。這些模型包括:

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGBClassifier
  • XGBRegressor

我們不能將線性模型應用於上述特徵,因為它們沒有被標準化。要使用線性模型,可以使用scikit-learn中的Normalizer或StandardScaler。

這些規範化方法只適用於密集的特徵,如果應用於稀疏特徵則不會給出非常好的結果。是的,可以在不使用均值(參數:with_mean = False)的情況下將StandardScaler應用於稀疏矩陣。

如果上面的步驟給出了一個“好”的模型,我們可以去優化超參數,如果沒有,我們可以去下面的步驟和改進我們的模型。

接下來的步驟包括分解方法:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

為了簡單起見,我們將忽略LDA和QDA轉換。對於高維數據,通常使用PCA來分解數據。對於圖像以10-15個組件開始,只要結果的質量大大提高,就增加這個數量。對於其他類型的數據,我們最初選擇50-60個組件(只要我們可以處理數字數據,我們傾向於避免PCA)。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

對於文本數據,在將文本轉換為稀疏矩陣之後,進行奇異值分解(SVD)。可以在scikit-learn中找到稱為TruncatedSVD的SVD變體。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

通常用於TF-IDF或計數的SVD組件的數量在120-200之間。以上任何數字都可能會提高性能,但不會大幅度降低計算能力。

在評估模型的進一步性能之後,我們轉向數據集的縮放,以便我們也可以評估線性模型。然後可以將歸一化或縮放的特徵發送到機器學習模型或特徵選擇模塊。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

有多種方法可以實現特徵選擇。最常見的方式之一是貪婪的功能選擇(向前或向後)。在貪心特徵選擇中,我們選擇一個特徵,訓練一個模型,並在固定的評估指標上評估模型的性能。我們不斷地添加和刪除功能,並在每一步記錄模型的性能。然後我們選擇具有最佳評估分數的特徵。以AUC作為評估指標的貪婪特徵選擇的一個實現可以在這裡找到:https://github.com/abhishekkrthakur/greedyFeatureSelection。必須指出的是,這個實現並不完美,必須根據需要進行修改/修改。

其他更快速的特徵選擇方法包括從模型中選擇最佳特徵。我們既可以查看logit模型的係數,也可以訓練一個隨機森林來選擇最佳特徵,然後在其他機器學習模型中使用它們。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

請記住保持較少的估計量和最小的超參數優化,以免過度使用。

使用漸變增強機器也可以實現特徵選擇。如果我們在scikit-learn中使用xgboost而不是GBM的實現,這是很好的,因為xgboost更快更靈活。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

我們也可以使用RandomForestClassifier / RandomForestRegressor和xgboost來進行稀疏數據集的特徵選擇。

從正向稀疏數據集中選擇特徵的另一個流行方法是基於chi-2的特徵選擇,我們也在scikit-learn中實現了這一點。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

在這裡,我們使用chi2和SelectKBest從數據中選擇20個特徵。這也成為我們想要優化的超參數來改進我們的機器學習模型的結果。

不要忘記保存在任何步驟中使用任何種類的轉換狀態數據。您將需要他們評估驗證集上的性能。

下一步(或中級)的主要步驟是模型選擇+超參數優化。

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

我們通常在選擇機器學習模型的過程中使用以下算法:

  • Classification:
  • Random Forest
  • GBM
  • Logistic Regression
  • Naive Bayes
  • Support Vector Machines
  • k-Nearest Neighbors
  • Regression
  • Random Forest
  • GBM
  • Linear Regression
  • Ridge
  • Lasso
  • SVR

我應該優化哪些參數?我如何選擇最接近最好的參數?這些是大多數人想到的幾個問題。如果沒有大量數據集的不同模型+參數的經驗,就無法得到這些問題的答案。也有經驗的人不願意分享他們的祕密。幸運的是,我也有相當多的經驗,我願意放棄一些東西。

讓我們分解超參數,使模型智能:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

RS * =不能說出適當的值,要對這些超參數進行隨機搜索。

在我看來,嚴格地說我的意見是,上述模式將超越任何其他模式,我們不需要評估任何其他模型。

再次強調記住保存轉換狀態數據:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

並將它們分別應用於驗證集:

Kaggle大師Abhishek Thakur的框架-解決幾乎所有機器學習問題

上述規則和框架在我處理的大多數數據集中表現都非常好。當然,這個任務也很複雜。沒有什麼是完美的,我們繼續改進我們學到的東西。就像機器學習所做的一樣。

有任何疑問與我聯繫:abhishek4 [at] gmail [dot] com

個人簡歷

Abhishek Thakur是Searchmetrics公司數據科學團隊的高級數據科學家。在Searchmetrics,Abhishek致力於一些最有趣的數據驅動研究,應用機器學習算法,並從海量數據中獲取需要大量數據的整理,清理,特徵工程以及機器學習模型的構建和優化。

他在空閒時間喜歡參加機器學習比賽,參加過100多場比賽。他的研究興趣包括自動機器學習,深度學習,超參數優化,計算機視覺,圖像分析和檢索以及模式識別。

相關推薦

推薦中...