[乾貨]Kaggle熱門 | 用一個架構解決所有機器學習難題

來源:互聯網
上載者:User

標籤:工具   網路   部分   唯一值   行資料   coder   otl   隨機森林   資料庫   

 新智元推薦

  來源:LinkedIn

  Abhishek Thakur

  譯者:弗格森

  【新智元導讀】本文是資料科學家Abhishek Thakur發表的Kaggle熱門文章。作者總結了自己參加100多場機器學習競賽的經驗,主要從模型架構方面闡述了機器學習過程中可能會遇到的難題,並給出了自己的解決方案,他還列出了自己平時研究所使用的資料庫、演算法、機器學習架構等等,具有一定的參考價值。作者稱:“文章幾乎涵蓋了機器學習所面臨的所有問題。”他說得怎麼樣?歡迎留言評論,發表你的看法。

  

  本文在Linkedin上貼出後,被迅速轉到Kaggle和Hacker News,並引起火熱討論。在Hacker News上,有人認為,作者只是從一名資料科學家的角度對機器學習展開研究,其方法有一定局限性。另外,如果如果真的要使用作者提出的機器學習架構,需要有超大量的資料才可以。

  以下是新智元編譯的全文:

  Abhishek Thakur:資料科學家每天都要處理資料載入問題。有一些研究者稱,自己有60%--70%的時間都花在了資料清洗、處理(篩選)和轉換上,從而讓機器學習模型能使用這些資料。本文關注的是第二部分,也就是資料在機器學習模型的應用上,其中包括預先處理的步驟。

  本文討論的幾個pipelines是我所參加的上百個電腦比賽後的總結。需要強調的是,文章的相關討論雖然是概括性的,卻也是十分有用的,同時,文中所討論的也涉及一些既有的、被專業人士採用的複雜方法。

  聲明:我們使用Python。

  資料

  在採用機器學習模型前, 資料必須要轉化成一個列表(Tabular)的形式。這是最消耗時間,也是最困難的,其過程如下:

  

  隨後,機器學習模型被用於訓練列表資料。列表資料是機器學習和資料採礦中表徵資料最常見的呈現方式。我們先是有了一個資料表,然後對不同的樣本資料進行排列, 或者用X和Y打上標籤。這些標籤可以是單行的,或者多行的,取決於要解決的問題的類型。在這,我們將用X來對資料進行表示,用Y來作標籤。

  標籤的類型

  這些標籤定義了所要解決的問題,可以有不同的形式:

  單行,二進位值(分類問題,一個樣本只屬於一個種類,且種類總數只有2個)

  單行,真值(迴歸問題,預測唯一值)

  多行,二進位值(分類問題,一個樣本屬於一個分類,但是有2個或者多個種類)

  多行,真值(迴歸問題,預測多值)

  多個標籤(分類問題,一個樣本可以屬於不同的種類)

  評估價值

  對於任何機器學習難題,我們必須知道要怎樣評估自己的研究結果,或者說,評估的價值和對象是什麼。為了防止二進位分類中的負偏(skewed)的問題,我們通常會選擇在運行特徵曲線(ROC AUC 或者簡單的 AUC)的接收器(receiver)下方地區進行評估。

  在多標籤和多類型分類難題中,我們通常選擇分類互動熵,或者多類型的 log loss ,以及在迴歸問題中降低平方誤差。

  資料庫

  觀看和進行資料處理:Pandas

  各種機器學習模型:Scikit-learn

  最好的梯度漸進資料庫看:xgboots

  神經網路:keras

  繪圖資料:matplotlib

  監控進度:tqdm

  我不用Anaconda,它雖然簡便好用,但是我想要更多的自由。

  機器學習架構

  2015年,我構思了一個自動機器學習的架構,現在仍然在開發中,但會很快發布。以下是基本架構:

  

  在所展示的架構中,粉線代表最常採用的路線。在我們將資料提取或精簡到列表式之後,我們就可以繼續下一步,建立機器學習模型。

  最初始的一步是,定義問題。這可以通過標籤確定。研究者首先要明確,你的問題是二進位的、多種類的、多標籤分類的還是迴歸問題。在定義了問題之後,我們可以把資料分為兩個不同的部分,如下文描述,一部分是訓練資料,另一部分是檢驗資料。

  

  把資料進行“訓練”和“檢驗”的區分,必須要根據資料標籤進行。在所有的分類問題中,都要試用分層分割。在Python中,你可以使用Scikit-learn來輕易地做到。

  

  在迴歸任務中,一個簡單的K-Fold分割應該就足夠了。但是,有一些複雜的方法,傾向於保持訓練資料和檢驗資料中標籤的一致性。

  

  在上面的例子中,我選擇 eval_size 或者 size of the validation set作為全部資料的10%,但是,你可以根據自己擁有的資料選擇賦值。

  在資料分層完成後,先把它們擱在一旁不要碰。在訓練資料集上的任何操作都要儲存,最後會運用到檢驗資料集中。而檢驗資料集,在任何情況下都不應該跟訓練資料集混淆。如果能做到這樣,就會得到非常好的分數。否則,你可能建立的是一個沒多大用,且過度學習的模型。

  下一步就是在資料中確定不同的變數。一般,我們處理的變數有3種:一個是資料變數、種類變數和內含文本的變數。

  以下是以流行的Titanic 資料庫舉的例子:

  

  在這兒,標籤就是Survival。此前,我們已經從訓練資料中對標籤進行了區隔。然後,我們有 pclass, sex, embarked。這些變數有著不同的層次,所以它們是種類變數。其他變數,比如,age、sibsp、parch等則屬於數字變數。姓名現在也是變數,但根據之前的研究,我並不認為這是一個可用於預測survival的變數。

  首先把資料變數排除。這些變數並不需要任何的處理,我們可以使用標準的機器學習模型來處理。

  在種類變數的處理上,我們有兩個方式:

  把種類資料變成標籤

  

  把標籤轉化成二進位變數(one-hot 編碼)

  

  在應用 one-hot 編碼前,記得先用LabelEncoder把種類轉化為資料。

  由於Titanic資料並沒有一個很好的文本變數樣本,讓我們構建一個通用的規則,來處理文本變數。我們可以把所有的文本變數變為一個,然後用一些演算法,來把這些文本轉換成數字。

  文本變數的融合如下:

  

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

  

  或者:

  

  TfidfVectorizer的表現一直都比其他工具要好,據我觀察,以下的參數幾乎每次都有效:

  

  如果你只是在訓練資料集上使用這些向量,請確保你已經把它們存到硬碟中,這樣以後你在檢驗資料集中也可以使用。

  

  下一步,我們就來到了疊式儲存器(stacker) 模組。Stacker並不是一個模型stacker,而是一個特徵stacker。在上文提到的處理步驟完成後,不同的特徵可以被結合起來,用到Stacker模組中。

  

  在進行下一步的處理之前,你可以使用numpyhstack或者sparse hstack把所有的特徵水平堆疊起來,這取決你擁有的是稀疏或者緊密特徵。

  

  這也可以通過FeatureUnion模組來實現,防止要求其他的處理步驟,比如 pca 或者特徵選取。

  

  一旦我們把所有的特徵都堆疊到一起,我們就能開始把它們應用到機器學習模型上。在這一階段,你唯一可用的模型應該是基於ensemble tree 的。這些模型包括:

  RandomForestClassifier

  RandomForestRegressor

  ExtraTreesClassifier

  ExtraTreesRegressor

  XGBClassifier

  XGBRegressor

  由於還沒有被標準化,我們在上面的特徵中不能使用線性模型。要使用線性模型,你可以從scikit-learn上使用Normalizer或StandardScaler。這些正常化的方法只有在緊密特徵中才起作用,在稀疏特徵中不會有好的效果。

  如果以上的步驟得出了一個“好”的模型,我們就能對超參數進行最佳化。為了防止模型不好,我們可以通過以下幾步進行最佳化:

  

  出於簡化的目的,我將忽略LDA和QDA的轉化。對於高維資料,通常PCA會被用於分解。對於其他類型的資料,我們選擇了50-60個組件。

  對於文本資料,在把文本轉換為疏鬆陣列後,使用 Singular Value Decomposition (SVD)。在scikit-learn中可以找到一個 TruncatedSVD。

  

  

  一般情況下,對TF-IDF 有用的SVD組件為120-200個。超過這一數字可能會提高效能,但是並不能持續,並且計算能力的成本會增加。

  在評估了模型的效能後,我們再去擴充資料庫,這樣我們就能評估線性模型。標準化和可擴充的特徵能被輸入機器學習模型或者特徵選取模組。

  

  特徵的選擇,有多種方式可以實現。最常見的是貪婪特徵的選擇(正向或反向)。在貪婪特徵的選擇上,我們選擇一個特徵,訓練一個模型並用一個修正的評估值來評估模型的效能。我們不斷增加或者移除一個又一個特徵,並逐步記錄模型的表現。隨後,我們選出得分最高的特徵。必須說明的是,這種方法並不是完美的,需要根據要求改變或修正。

  其他更快的特徵選取方法包括:從一個模型中選擇最佳的特徵。我們可以觀察一個邏輯模型的稀疏,或者訓練一個隨機森林,來選擇最佳的特徵,然後在其他的機器學習模型上使用。

  

  記得保持較少數量的Estimator,並對超參數進行最小最佳化,這樣你就不會過度學習。

  特徵的選擇也可以通過Gradient Boosting Machines來實現。如果我們使用xgboost而不是在 scikit-learn中使用GBM時,效果會很好。因為xgboost速度更快、可擴充性更高。

  我們也可以使用RandomForestClassifier 、RandomForestRegressor 和xgboost,在稀疏資料集中進行特徵選取。

  另一個較為流行的方法是基於chi-2的特徵選取。

  

  在這兒,我們使用Chi2和 SelectKBes從資料中選擇20個特徵。這也變成了我們希望最佳化,來提升機器學習模型結果的超參數。

  在這一過程中,千萬不要忘記儲存你任何一步的轉換,在檢驗資料集中,你會用得到。

  下一個主要的步驟是模型的選擇,和超參數最佳化。

  

  主要使用以下演算法:

  分類:

  · Random Forest

  · GBM

  · Logistic Regression

  · Naive Bayes

  · Support Vector Machines

  · k-Nearest Neighbors

  迴歸:

  · Random Forest

  · GBM

  · Linear Regression

  · Ridge

  · Lasso

  · SVR

  我該最佳化哪些參數?我怎樣才能選到最匹配的參數?這是人們考慮得最多的兩個問題。沒有在大量的資料庫上體驗過不同的模型和參數,是無法回答這一問題的。還有一點,許多人並不願意分享這方面的經驗。所幸我還有一點經驗,也願意分享:

  

  RS*指不能確定合適的值

  在我看來,以上的模型在效能上已經是最優,我們不需要再評估其他模型。再次提醒,記得儲存。

  

  在檢驗資料集中進行驗證。

  

  

[乾貨]Kaggle熱門 | 用一個架構解決所有機器學習難題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.