實戰:把一個機器學習項目的準確率從0.65提升到0.98

在一幢建築裡要看到三樣東西:它是否被正確的選址,它是否被牢固的奠基,它是否被成功的建造——約翰·沃爾夫岡·馮·歌德

大家好,我是今天的值班編輯,今天是中華民族最隆重、最熱鬧的傳統節日,小編在此祝您全家新年快樂。財源滾滾隨春到,喜氣洋洋伴福來。騏驥一躍奔錦繡,大地流金萬象新。高居寶地財興旺,福照家門富生輝。歡聚一堂迎新春,歡天喜地度佳節。

小編之前在這個公眾號裡面挖過一個坑,寫過一篇文章《25行python代碼實現一個機器學習項目》,在文章中,小編用25行python代碼訓練的機器學習分類模型(決策樹模型)的準確率得分為0.65,距離1.0還比較遙遠。今天就來講一講如何提高模型的準確率。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

提高模型準確率的多種方法

以小編幾年來搞機器學習分類模型的經驗來看,面對一個快速搭建起來的模型,有如下幾種方法都可以(在一定程度上)提升模型的準確率:

1)使用更多數據去訓練模型。

對於一個剛剛搭建起來的模型,使用更多數據去訓練的方法非常的行之有效;此方法的不足之處在於,數據越多則模型的訓練速度越慢,小編曾經見過一個模型訓練一輪要一週左右的時間,等結果等的人望眼欲穿。

而且,還有可能存在更悲劇的情況:無法取得更多的訓練數據。通常對於一個工程師來說,資源總是有限的,即使公司的其它部門手中有更多的數據,也很難協調得到。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

2)特徵工程

特徵工程(Feature Engineering)指的是從現有的訓練數據中提取更多有效特徵出來的神操作

比如數據類型轉化、標準化、歸一化、分箱、one-hot編碼、缺失值填充、特徵選擇、降維、組合等等。

特徵工程可以說是機器學習項目中最苦最累最沒有技術含量的活(IT民工的說法不是白來的),但通常也是見效最快的方法。

既然說到了“工程“二字,小編就再羅索幾句。通常一個機器學習工程師都把自己的技術方向稱為”策略方向”,以區別於”工程方向“; 並且,”策略方向“的工程師通常會鄙視”工程方向“的工程師,好像自己天生就高人一等的樣子。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

3)嘗試不同的模型

在特定數據上,有些模型的表現會優於其它的模型(尤其是有bagging/boosting機制的模型,如xgboost 、gbdt、隨機森林),朋友們可以靠經驗、靠直覺來嘗試不同的模型。

可能有的朋友們這裡就要問了:為什麼要靠經驗或者直覺呢,我把全部或者大部分流行的模型都嘗試一遍不就可以了嗎。

主要原因在於時間,嘗試一個模型(開發、調參、訓練)需要花不少的時間,通常一個項目不會有太多太多的時間用來嘗試全部模型。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

4)模型調參

通常,一個模型都有幾個參數可以調整,這些參數被稱為“超參數”。我們可以想辦法尋找到這些參數的最優值,當然,有時候超參數的默認值就已經足夠好了。調參也是要花不少時間的,畢竟每一次參數的調整都意味著重新訓練一次模型。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

代碼解析

下面來看小編是如何綜合使用上面幾種方法來提高模型的準確率的。

首先導入pandas這個數據處理神器。

然後憑經驗,選擇使用sklearn 中的隨機森林分類器, 之後加載訓練數據集和測試數據集、去掉四個無用的字段(特徵)。為什麼去掉這4個特徵呢?也是憑經驗和對項目背景的理解 ,再加上幾次嘗試。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

對pclass特徵進行one-hot編碼並填充回df(編碼並填充之後就可以刪除原始特徵了)、對age特徵用中位數填充缺失值並且轉化為int:


實戰:把一個機器學習項目的準確率從0.65提升到0.98

把sex特徵與age特徵組合在一起,成為一個新的特徵:Person,並做one-hot編碼:


實戰:把一個機器學習項目的準確率從0.65提升到0.98

組合Parch 和 SibSp兩個特徵,生成新的特徵family,並且把它二值化為0或1(有沒有家屬);

對Fare特徵也使用中位數來補全缺失數據:


實戰:把一個機器學習項目的準確率從0.65提升到0.98

Embarked特徵使用眾數S來補全缺失值,one-hot編碼,然後去掉值為S的特徵(去不去都可以)。

至於如何找到眾數,可以print一下train_df['Embarked'].describe()。


實戰:把一個機器學習項目的準確率從0.65提升到0.98

生成x與y,初始化隨機森林模型,開始訓練、預測、評估:


實戰:把一個機器學習項目的準確率從0.65提升到0.98

最終模型的準確率為:0.9798,已經非常接近於上限1.0了,達到了一個新的高度。

總結

通過上面對代碼的分析,朋友們可以清楚地認識到特徵工程的重要性了吧,一個機器學習項目中絕大部分的python代碼都是特徵工程代碼。

最後用歌德同志的一句話與各位機器學習工程師共勉:

在一幢建築裡要看到三樣東西:它是否被正確的選址,它是否被牢固的奠基,它是否被成功的建造——約翰·沃爾夫岡·馮·歌德


分享到:


相關文章: