這個可以框架解決幾乎所有機器學習問題
AI研習社按:本文作者楊熹,原文載於作者個人博客,AI研習社已獲授權。
我最近也在準備參加 Kaggle,之前看過幾個例子,自己也總結了一個分析的流程,今天看了這篇文章,裡面提到了一些高效的方法,最乾貨的是,他做了一個表格,列出了各個演算法通常需要訓練的參數。
這個問題很重要,因為大部分時間都是通過調節參數,訓練模型來提高精度。作為一個初學者,第一階段,最想知道的問題,就是如何調節參數。因為分析的套路很簡單,就那麼幾步,常用的演算法也就那麼幾個,以為把演算法調用一下就可以了么,那是肯定不行的。實際過程中,調用完演算法後,結果一般都不怎麼好,這個時候還需要進一步分析,哪些參數可以調優,哪些數據需要進一步處理,還有什麼更合適的演算法等等問題。
接下來一起來看一下他的框架。
據說數據科學家 60-70% 的時間都花在數據清洗和應用模型演算法上面,這個框架主要針對演算法的應用部分。
什麼是 Kaggle?
Kaggle是一個數據科學競賽的平台,很多公司會發布一些接近真實業務的問題,吸引愛好數據科學的人來一起解決,可以通過這些數據積累經驗,提高機器學習的水平。
應用演算法解決 Kaggle 問題,一般有以下幾個步驟:
第一步:識別問題
第二步:分離數據
第三步:構造提取特徵
第四步:組合數據
第五步:分解
第六步:選擇特徵
第七步:選擇演算法進行訓練
當然,工欲善其事,必先利其器,要先把工具和包都安好。
最方便的就是安裝 Anaconda,這裡面包含大部分數據科學所需要的包,直接引入就可以了,常用的包有:
- pandas:常用來將數據轉化成 dataframe 形式進行操作
- scikit-learn:裡面有要用到的機器學習演算法模型
- matplotlib:用來畫圖
- 以及 xgboost,keras,tqdm 等。
第一步:識別問題
在這一步先明確這個問題是分類還是回歸。通過問題和數據就可以判斷出來,數據由 X 和 label 列構成,label 可以一列也可以多列,可以是二進位也可以是實數,當它為二進位時,問題屬於分類,當它為實數時,問題屬於回歸。
第二步:分離數據
為什麼需要將數據分成兩部分?
用 Training Data 來訓練模型,用 Validation Data 來檢驗這個模型的表現,不然的話,通過各種調節參數,模型可以在訓練數據集上面表現的非常出色,但是這可能會是過擬合,過擬合就是太依賴現有的數據了,擬合的效果特別好,但是只適用於訓練集,以致於來一個新的數據,就不知道該預測成什麼了。所以需要有 Validation 來驗證一下,看這個模型是在那裡自娛自樂呢,還是真的表現出色。
在 scikit learn 包里就有工具可以幫你做到這些:
分類問題用 StrtifiedKFold
from sklearn.cross_validation import StratifiedKFold
回歸問題用 KFold
from sklearn.cross_validation import KFold
第三步:構造特徵
這個時候,需要將數據轉化成模型需要的形式。數據有三種類型:數字,類別,文字。當數據是類別的形式時,需要將它的每一類提取出來作為單獨一列,然後用二進位表示每條記錄相應的值。例如:
record 1: 性別 女
record 2:性別 女
record 3:性別 男
轉化之後就是:
??????女 男
record 1: 1 0
record 2:1 0
record 3:0 1
這個過程 sklearn 也可以幫你做到:
from sklearn.preprocessing import LabelEncoder
或者
from sklearn.preprocessing import OneHotEncoder
第四步:組合數據
處理完 Feature 之後,就將它們組合到一起。
如果數據是稠密的,就可以用 numpy 的 hstack:
import numpy as np
X = np.hstack((x1, x2, ...))
如果是稀疏的,就用 sparse 的 hstack:
from scipy import sparse
X = sparse.hstack((x1, x2, ...))
組合之後,就可以應用以下演算法模型:
- RandomForestClassifier
- RandomForestRegressor
- ExtraTreesClassifier
- ExtraTreesRegressor
- XGBClassifier
- XGBRegressor
但是不能應用線性模型,線性模型之前需要對數據進行正則化而不是上述預處理。
第五步:分解
這一步是為了進一步優化模型,可以用以下方法:
PCA:Principal components analysis,主成分分析,是一種分析、簡化數據集的技術。用於減少數據集的維數,同時保持數據集中的對方差貢獻最大的特徵。
from sklearn.decomposition import PCA
對於文字數據,在轉化成稀疏矩陣之後,可以用 SVD
from sklearn.decomposition import TruncatedSVD
SVD:Singular Value Decomposition,奇異值分解,是線性代數中一種重要的矩陣分解,它總能找到標準化正交基後方差最大的維度,因此用它進行降維去噪。
第六步:選擇特徵
當特徵個數越多時,分析特徵、訓練模型所需的時間就越長,容易引起「維度災難」,模型也會越複雜,推廣能力也會下降,所以需要剔除不相關或亢余的特徵。
常用的演算法有完全搜索,啟發式搜索,和隨機演算法。
例如,Random Forest:
from sklearn.ensemble import RandomForestClassifier
或者 xgboost:
import xgboost as xgb
對於稀疏的數據,一個比較有名的方法是 chi-2:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
第七步:選擇演算法進行訓練
選擇完最相關的參數之後,接下來就可以應用演算法,常用的演算法有:
Classification:
Random Forest
GBM
Logistic Regression
Naive Bayes
Support Vector Machines
k-Nearest Neighbors
Regression
Random Forest
GBM
Linear Regression
Ridge
Lasso
SVR
在scikit-learn里可以看到分類和回歸的可用的演算法一覽,包括它們的原理和例子代碼。
在應用各演算法之前先要明確這個方法到底是否合適。
為什麼那麼多演算法里,只提出這幾個演算法呢,這就需要對比不同演算法的性能了。
我們可以學習一下裡面的調研思路,看看是怎麼樣得到比較結果的,在我們的實踐中也有一定的指導作用。
但是直接應用演算法後,一般精度都不是很理想,這個時候需要調節參數,最乾貨的問題來了,什麼模型需要調節什麼參數呢?
雖然在sklearn的文檔里,會列出所有演算法所帶有的參數,但是裡面並不會說調節哪個會有效。在一些mooc課程里,有一些項目的代碼,裡面可以看到一些演算法應用時,他們重點調節的參數,但是有的也不會說清楚為什麼不調節別的。這裡作者根據他100多次比賽的經驗,列出了這個表,我覺得可以借鑒一下,當然,如果有時間的話,去對照文檔里的參數列表,再查一下演算法的原理,通過理論也是可以判斷出來哪個參數影響比較大的。
調參之後,也並不就是大功告成,這個時候還是需要去思考,是什麼原因造成精度低的,是哪些數據的深意還沒有被挖掘到,這個時候需要用統計和可視化去再一次探索數據,之後就再走一遍上面的過程。
我覺得這裡還提到了很有用的一條經驗是,把所有的 transformer 都保存起來,方便在 validation 數據集上面應用:
文章里介紹了分析問題的思路,還提到了幾條很實用的經驗,不過經驗終究是別人的經驗,只能借鑒,要想提高自己的水平,還是要看到作者背後的事情,就是參加了100多次實戰,接下來就去行動吧,享受用演算法和代碼與數據玩耍的興奮吧。
點擊展開全文
※10個基於JavaScript的機器學習案例
※細胞瀏覽器:機器學習預測出的3D幹細胞圖像庫
※如何開始使用 Java 機器學習
※ARM推出新一代內核Cortex A75和A55,專註手機端人工智慧與機器學習
※機器學習演算法究竟需要試驗多少次,才能有效反映模型性能?
TAG:機器學習 |
※讓機器可以像人一樣學習
※上線一個機器學習項目你需要哪些準備?
※撿還是不撿?這對機器人是個問題
※學好機器學習,這裡有你想要的一切
※恐怕只有這些星座可以跟機器人一起生活
※看了這麼久的機器貓,你沒發現這幾個地方有點不科學嗎?
※獨居青年你別怕,這個「話癆」機器人也許可以解決孤獨問題
※還糾結選機器學習還是深度學習?看完你就有數了
※這個話題有點刁 機器該不該和人類「搶飯碗」
※機器學習演算法現在可以在沒有人類幫助的情況下解開魔方
※這個是反恐機器人:你們猜可以幹嘛
※人類的未來究竟在哪裡?到底是人控制了機器還是機器控制了人?這是個問題
※像搭積木一樣玩兒相機?還真有幾款機器能夠滿足你
※希望我在開始第一個機器學習項目之前就了解的那些事兒
※用一個詞來證明自己不是機器人,你會說哪個詞?
※化妝也可以有機器人幫忙?懶人科技我只想要最後那樣
※入門機型有什麼好選擇?這幾款機器或許可以瞧一瞧
※人類將擁有「自我意識」的機器人,了解你的一切,像你一樣思考
※做爆米花不需要使用機器,一個鍋就搞定,嬸嬸這手藝,真是絕了
※獨居再不怕孤獨,這個「話癆」機器人可以幫助我們解決與朋友聊天時找不到話題的尷尬!