標籤:工具 網路 部分 唯一值 行資料 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熱門 | 用一個架構解決所有機器學習難題