kaggle:Titanic: Machine Learning from Disaster,有什麼比較好的feature可以提取,哪位大神hit 80%了?


陽光直曬,並不適宜一切戶外活動的一天,我和Hovey一起把titanic survival推演了一遍。特別喜歡這種題目,有一種帶上墨鏡就是算命瞎子的感覺。Hovey用Python,我用R,有些地方可能會有交叉,但是這不重要,領會精神,代碼自己慢慢擼。怕什麼真理無窮?進一寸有進一寸的歡喜!

Step1, load and glimpse data:

train set 裡面有12個variables,test set裡面有11個,通過名字可以觀察到缺了個"Survived"。這也正常,畢竟人家就是要我們預測那418個人的存活情況。用head()觀察下大概數據:obs不多,一共只有1309條。variable也不多,一共11個。目前看來,passengerID是個數列,看不出什麼用處,放到一遍。"Sibsp" 和"Parch"是指兄弟姐妹夫妻父母子女關係,我把它一併歸到family size裡面(新設一個variable)。於是現在就有9個variables了。

Step2, process data: make it clean and tidy。畢竟Garbage in,Garbage out。

演算法之美在於思維之美,思維之美於我,是可以大開腦洞。我們花了整整兩杯咖啡的時間瞎猜。

H:這1309個都得是船上的人。 我:是,不在船上的你也沒法猜。

H:他們當時沒有四處活動跳舞吃飯什麼的吧? 我:我查了下,撞到冰山發生在23:40pm~2:20am,假設人們都在自己房間睡覺。像Rose和Jack這種不知道在哪兒睡覺的,也可以當他們在睡覺,沒亂跑。

H:是撞的船頭還是船尾? 我:船頭。

H:哪頭是船頭?

H:這個船的分布是怎麼樣的?是實心的么? 我:不是……實心兒的船不用等到大西洋,剛launch就沉下去了……房間都分布在不同層的甲板兩側,中間是活動區域,儘可能保證船身平衡和空間利用。像這樣:

如果你還記得船是怎樣沉下去的,那麼你心中應該有想法了。如果不記得,也沒關係。我們一起沉重的review一遍:船頭撞向冰山,船頭開始下沉,船身逐漸傾斜,船尾翹起脫離海面;

船頭沉沒1/3時,受自重的影響,船身從中間開始斷裂;

船尾掉入海中,和船頭一起沉沒。

至此,我們認為基於位置的變數是很重要的。與位置相關的有:Cabin(船艙),Embarked(登船地點),Pclass(船艙等級),Fare(船票價格,同一等級也會有不同房價的房間)。Cabin由於缺失的數量太多,而且我們無法判斷ABCDEF到底是從船頭排起還是船尾排起,暫時先擱置。簡單plot一下船艙等級與存活率的關係。

心疼不心疼?一等艙的存活率遠遠高於三等艙,這就是現實。我一直覺得『物美價廉』挺扯的,市場經濟下,價格貴自然有貴的道理。在這個case當中,一等艙的甲板更高,可供逃生的時間更長;可能離救生艇的距離更短,逃生幾率更大。

Embark是指登船地點,有三個地方,C/Q/S。登船地點會對船票有影響(基於距離),沒想到登船地點對於存活率也有很高影響。

H做了張圖,為什麼在C處登船的人會比另外兩處存活率更高呢?只是地點而已,這不科學。一定還存在別的原因?是不是賣票的時候C處的一等艙賣的多?

C處果然一等艙賣的多。與上圖以及上上圖基本匹配。所以我暫時認為Embarked是個假象,本質是還是基於Pclass的存活表現,當然有可能跟性別比例有關。

雖然現在還看不出什麼……不如先考慮下別的,比如fare。

可以看到,Fare越高,存活率越高。有可能是因為船票越貴,Pclass就越高,Cabin就越好。再一次被現實吊打。這是不是在告訴大家,沒錢就別出去浪了?

除了基於位置以外,還有一個很重要的因素,是基於人群。畢竟船上全是人。有人的地方就有江湖。我們簡單做個分類,gender/age/title/family size。

Hovey plot完這張圖,倒吸一口涼氣:做男人太難了,死都比女人死得快。我說,不是這樣,明明力量速度耐力都比女人強的情況下,男性死亡的還多,只能是因為,他們主動將生存機會讓給了女人。

女性存活率:74.2%, 男性存活率:18.9%。#愛不愛你,保不保護你,讓事實說話。#

在做title分析的這張圖裡,我特別想讓大家都能注意到兩個點。Rev和Master。

一開始我們認為Master是爵位,有權有勢的人可以買一等艙,自然存活率高。後來Hovey查得:Master是指英國小於12歲的男孩子,太年輕還不足以被喚做Mr.,通過數據驗證,他們最小的不到一歲,最大的不過14歲。再做個簡單計算,0~12歲的兒童,不分性別,存活率高達70%,大於12歲的男孩,存活率24%,比普通男性相當。這說明,大家都不遺餘力的優先照顧兒童。大於12歲的男孩子被視為成年人,和大家一起保護女性和兒童。你問我什麼是紳士精神?這就是紳士精神。

另外,Rev也是個很少見的Title,The Reverend is an honorific style, most often placed before the names of Christian clergy and ministers. 你們注意到了嗎?神職人員全滅。在電影中,神父們安撫情緒,帶領大家一起禱告,和Crew一起堅持到最後一秒。你問我什麼是神性?這就是神性。

請和我一起向這些人致以最高的敬意。

我們建立了一個新的變數,family size。數據表明,家庭成員在2~4的,存活表現最好,雖然家庭單位也有團滅,但是總有部分存活。單身或者獨身出行的存活率31%,幾乎屬於上帝擲骰子,看天吃飯,這是老天爺對單身狗和獨行俠的一輪暴擊。家庭成員大於4的,幾乎團滅。可見人多了也不好,不僅照顧不到,可能還會互相拖累。

隨著歲月漸長,我越來越覺得,最好的愛,不是我要和你一起死,而是即便沒了我/你,你/我也希望你帶著我/你的祝福好好活。

至此,我們幾乎找齊了features。data quality 和feature決定了機器學習的上限,演算法和模型只是無限逼近上限。你如果和我一樣有嚴重的強迫症,可以用mice /md來補齊缺失數據,用woe/iv來驗證feature的相關性。機器學習的模型有很多,我愛Random Forest,從名字到內涵,都喜歡。由於這個case樣本量太小,千萬不要過度追求精確度,容易overfitting。超過75%的精確度都已經是很好的預測結果了。

最後,祭出真實的死難者數據,雖然與我們的預測很吻合,accurary(82.53%),但是我的心情依然沉重。海拔 -3800米,那是titanic安息的地方。

May you peace in heaven or seabed.


花了三天時間,琢磨各種奇門遁甲之術,終於有點結果了,有時間回來補充完整細節,one hot encoding後只選了七維特徵,準度從79.994%提高到82.297%,還需要繼續琢磨一段


占坑,一個月前打算做做kaggle的比賽,看到Titanic,只有Python的一點經驗,看過Andrew NG的幾節公開課。

嘗試多次,幾乎提取了我能想到的所有特徵,Name和Ticket也沒放過……最好成績是0.813。

話不多說,上鏈接:

Titanic Data Processing with Python(0.813)

作為數據領域還沒入門的菜鳥,看著sklearn、pandas的文檔整理出這份Notebook……要是還看得過去,點個贊鼓勵一下吧!


chenbowen/Titanic-Kaggle-over0.80861 非常簡單的版本,直接上源碼。

先佔位,過程和解釋之後再寫。


求源碼啊。怎麼才能過百分之八十


同意 @chaoran,後來加特徵,特徵篩選效果都不明顯了


推薦閱讀:

如何看待 Kaggle 被 Google 收購?
機器學習如何在小樣本高維特徵問題下獲得良好表現?
Kaggle 的比賽在 Machine Learning 領域中屬於什麼地位?

TAG:機器學習 | Kaggle |