泰坦尼克號(hào)乘客生存分析——用機(jī)器學(xué)習(xí)告訴你王凑,如果你在當(dāng)時(shí)的船上搪柑,有多大機(jī)率生還?

大綱

  • 數(shù)據(jù)來(lái)源
  • 工具介紹
  • 數(shù)據(jù)分析
    • 數(shù)據(jù)概覽
    • 測(cè)定基準(zhǔn)
    • 分析特征重要性
    • 數(shù)據(jù)展示(可視化)
  • 特征工程
    • 數(shù)據(jù)清洗
    • 提取新特征
    • 特征選取
    • 數(shù)據(jù)導(dǎo)出
  • 機(jī)器學(xué)習(xí)預(yù)測(cè)
    • 選擇算法
    • 訓(xùn)練及評(píng)估
    • 預(yù)測(cè)結(jié)果
    • 人物畫像
  • 總結(jié)
    • 結(jié)合歷史核對(duì)結(jié)論
    • 一些特別的數(shù)據(jù)
    • 結(jié)語(yǔ)
  • 參考

  • 1912年索烹,當(dāng)時(shí)世界上體積最龐大工碾、內(nèi)部設(shè)施最豪華的客運(yùn)輪船,有“永不沉沒(méi)”美譽(yù)的泰坦尼克號(hào)百姓,在她的處女航中撞冰山沉入大西洋底3700米處渊额,船上1500多人喪生。
  • 1985年垒拢,美國(guó)和法國(guó)聯(lián)合搜索隊(duì)發(fā)現(xiàn)泰坦尼克號(hào)殘骸旬迹。
  • 1997年,詹姆斯·卡梅隆執(zhí)導(dǎo)美國(guó)電影《泰坦尼克號(hào)》子库,將整個(gè)驚心動(dòng)魄的過(guò)程首次以電影的方式還原舱权。
  • 2012年,《泰坦尼克號(hào)》3D版在中國(guó)內(nèi)地重映仑嗅,再次喚起人們對(duì)艘富有傳奇色彩的巨輪的緬懷宴倍。
  • 2017年5月,有科學(xué)家表示仓技,細(xì)菌正在蠶食泰坦尼克號(hào)沉船殘骸鸵贬。據(jù)最近的估計(jì),到2030年脖捻,這艘船可能會(huì)迎來(lái)它的末日阔逼,徹底消失。

假設(shè)如果真有穿越這回事地沮,突然哪一天你的靈魂穿越到了正在航行的泰坦尼克號(hào)上的某個(gè)乘客身上嗜浮,你發(fā)現(xiàn)你身處某層客艙內(nèi),被你的同伴稱為Mr/Miss摩疑,而你只有現(xiàn)代的記憶危融。突然一聲巨響同時(shí)船身劇烈搖晃,人們驚慌不知所措雷袋,那么此時(shí)此刻的你吉殃,有多大機(jī)率可以活下來(lái)?

接下來(lái),我會(huì)通過(guò)數(shù)據(jù)分析蛋勺,告訴你有哪些特征會(huì)影響你的存活機(jī)率瓦灶。

數(shù)據(jù)來(lái)源

著名的數(shù)據(jù)分析競(jìng)賽網(wǎng)站Kaggle上,舉行了很多數(shù)據(jù)分析比賽抱完,其中比較著名的就有 泰坦尼克號(hào)乘客生還預(yù)測(cè) 贼陶。

Kaggle提供的數(shù)據(jù)集中,共有1309名乘客數(shù)據(jù)乾蛤,其中891是已知存活情況每界,剩下418則是需要進(jìn)行分析預(yù)測(cè)的。

提供的數(shù)據(jù)特征如下:

PassengerId: 乘客編號(hào)
Survived   :存活情況(存活:1 ; 死亡:0)
Pclass      : 客艙等級(jí)
Name       : 乘客姓名
Sex          : 性別
Age          : 年齡
SibSp      : 同乘的兄弟姐妹/配偶數(shù)
Parch      : 同乘的父母/小孩數(shù)
Ticket      : 船票編號(hào)
Fare        : 船票價(jià)格
Cabin       :客艙號(hào)
Embarked   : 登船港口

PassengerId 是數(shù)據(jù)唯一序號(hào)家卖;Survived 是存活情況,為預(yù)測(cè)標(biāo)記特征庙楚;剩下的10個(gè)是原始特征數(shù)據(jù)上荡。

下面我將嘗試分析所得原始數(shù)據(jù),通過(guò)構(gòu)建特征工程馒闷,建模預(yù)測(cè)乘客的生存情況酪捡。

工具介紹

Carpenters Tools used on Titanic.jpg

以下數(shù)據(jù)分析過(guò)程中,我使用的是我自己用Ruby語(yǔ)言開發(fā)的一套簡(jiǎn)單的可通用的數(shù)據(jù)分析工具纳账,集成了數(shù)據(jù)分析報(bào)告逛薇、數(shù)據(jù)可視化、特征工程構(gòu)建疏虫、機(jī)器學(xué)習(xí)分類模型訓(xùn)練永罚、數(shù)據(jù)導(dǎo)出等。

先看下有哪些命令可以使用:


每個(gè)任務(wù)的用途和前置子任務(wù)用途描述如下:


每個(gè)任務(wù)都可以單獨(dú)執(zhí)行卧秘,具體用法會(huì)在后面的分析過(guò)程中逐個(gè)演示呢袱。

數(shù)據(jù)分析

說(shuō)到數(shù)據(jù)挖掘,是把散亂數(shù)據(jù)轉(zhuǎn)換成「有價(jià)值」信息的過(guò)程翅敌,數(shù)據(jù)是可以是數(shù)字或者文本內(nèi)容甚至圖像羞福,而信息是有語(yǔ)義的、人腦可理解的報(bào)告蚯涮、圖表治专。

數(shù)據(jù)分析的結(jié)果,就是把數(shù)字轉(zhuǎn)化成人類可理解的信息遭顶。

數(shù)據(jù)概覽

先看一眼已有的數(shù)據(jù)概括张峰。

第一步,配置好數(shù)據(jù)路徑:

task-config-dataset.png

第二步液肌,執(zhí)行數(shù)據(jù)分析任務(wù) profile_data 輸出數(shù)據(jù)摘要信息:

rake app:classifiers:titanic:profile_data
rake_app_classifiers_titanic_profile_data.png

得到基本的數(shù)據(jù)信息:

Rows: 1309, Cols: 12挟炬,Columns: ["PassengerId", "Survived", "Pclass", "Name", "Sex", "Age", "SibSp", "Parch", "Ticket", "Fare", "Cabin", "Embarked"]

(注:uniq_proportions 是數(shù)據(jù)唯一值數(shù)量的占比值,下面描述時(shí)直接x100,如 0.616 描述為 61.6%谤祖,方便理解)

從輸出統(tǒng)計(jì)中可以得出以下信息:

  • Survived 中549條是0(死亡)婿滓,342條是1(生還);占比(uniq_proportions)分別是61.6%和38.4粥喜,死亡率很高凸主。有418條missing(表示沒(méi)有值),是要預(yù)測(cè)的數(shù)據(jù)量额湘。
  • Pclassunit_count (唯一數(shù)量)是3卿吐,通過(guò)uniq_frequencies 看出分為1,2锋华,3 個(gè)類別嗡官,對(duì)應(yīng)頭等艙、二等艙和三等艙)毯焕,其中3占了過(guò)半為54.2%
  • 有幾個(gè)特征有缺失數(shù)據(jù)(missing 不為0的)衍腥,Age 為263,Fare 為1纳猫,Cabin 為1014婆咸,Embarked 為2
  • Sex 乘客性別分布中男性占 64.4%,女性 35.6%(人多不一定是好事芜辕,后面分析中發(fā)現(xiàn)男性死亡很高)
  • Age 乘客年齡分布中最小0.17(嬰兒)尚骄,最大是80歲,平均為29.881
  • Ticket 總數(shù)是1309侵续,而唯一數(shù)是929倔丈,說(shuō)明有一票多人使用情況(這個(gè)信息在后面的特征提取中有用)
  • Fare 最高是512.3292,而平均是33.295询兴,貧富分化差距不心松场(同樣,這個(gè)信息在后面的特征提取中會(huì)有用)
  • Embarked 有3組為"S"诗舰、"Q"警儒、"C",其中"S"占69.9%眶根,我猜這可能是啟航的港口蜀铲,登船港口跟存活率有什么關(guān)系這是個(gè)疑問(wèn)

測(cè)定基準(zhǔn)-沒(méi)事跑個(gè)分

先跑個(gè)分看看,執(zhí)行訓(xùn)練任務(wù)train

rake app:classifiers:titanic:train summary=n
rake_app_classifiers_titanic_train.png

在什么數(shù)據(jù)都沒(méi)改動(dòng)的情況下属百,使用所有特征數(shù)據(jù)來(lái)跑訓(xùn)練任務(wù)(任務(wù)沒(méi)有配置時(shí)记劝,默認(rèn)使用樸素貝葉斯分類)和CV(Cross Validation,交叉驗(yàn)證)族扰,得到平均的 F1 Score0.75889厌丑,意味這個(gè)是我們的模型的最低基準(zhǔn)定欧,最終構(gòu)建出的模型分?jǐn)?shù)要高于這個(gè)之上才是可靠的模型。

分析特征重要性

這么多特征怒竿,有哪些特征是跟存活率比較相關(guān)的砍鸠?

可以使用這個(gè)數(shù)據(jù)分析任務(wù),再做進(jìn)一步分析:使用任務(wù)參數(shù) label_column=Survived 來(lái)指明哪個(gè)是要預(yù)測(cè)的標(biāo)記特征耕驰,再執(zhí)行一次數(shù)據(jù)分析任務(wù):

rake app:classifiers:titanic:profile_data label_column=Survived
rake app:classifiers:titanic:profile_data label_column=Survived

這次的輸出就有些差異爷辱,可以看到是針對(duì) Survived 有值的數(shù)據(jù)來(lái)統(tǒng)計(jì):

Profile 891 data which Survived is not nil

還多了特征分布占比統(tǒng)計(jì):

Calcualte proportions of "Survived"

從而能知道各個(gè)特征值與標(biāo)簽特征Survived的對(duì)比,得出符合該特征時(shí)的“生存率”朦肘。

例如 Pclass 的統(tǒng)計(jì):

+-------------+-------+------------+--------------------------------------------------------------+--------------------------------------------------------------+
|             | count | uniq_count | Survived=0                                                   | Survived=1                                                   |
+-------------+-------+------------+--------------------------------------------------------------+--------------------------------------------------------------+
| Pclass      | 891   | 3          | {3=>[372, "75.8%"], 1=>[80, "37.0%"], 2=>[97, "52.7%"]}      | {3=>[119, "24.2%"], 1=>[136, "63.0%"], 2=>[87, "47.3%"]}     |

Pclass=3(Survived=0)有372條饭弓,占75.8%,意思是三等艙的乘客中死亡率是75.8%媒抠;

Pclass=1(Survived=1)有136條弟断,占63.0%混狠,意味頭等艙的乘客中有63.0%是存活了下來(lái)。

以此類推猪半,性別數(shù)據(jù)中:

+-------------+-------+------------+--------------------------------------------------------------+--------------------------------------------------------------+
|             | count | uniq_count | Survived=0                                                   | Survived=1                                                   |
+-------------+-------+------------+--------------------------------------------------------------+--------------------------------------------------------------+
| Sex         | 891   | 2          | {"male"=>[468, "81.1%"], "female"=>[81, "25.8%"]}            | {"male"=>[109, "18.9%"], "female"=>[233, "74.2%"]}           |

  • 男性死亡率是81.1%豪椿,女性的死亡率是25.8%;
  • 男性存活率是18.9%只洒,女性的存活率是74.2%。

不用建模光是根據(jù)這2組數(shù)據(jù)就已經(jīng)可以想象到,如果當(dāng)時(shí)是女性锉桑,并入駐在頭等艙,存活下來(lái)的機(jī)率是很高的窍株;反之民轴,如果是男性,又是入駐在三等艙區(qū)的球订,差不多5個(gè)人中只能活1個(gè)后裸。。冒滩。

這些分類結(jié)果比較少微驶、存活率傾斜比較明顯的,顯然是比較重要的特征开睡。那么其他特征值分布比較離散的因苹,對(duì)最終的存活率影響是怎樣的呢?

在這里可以先使用 evaluate_features (特征評(píng)估)任務(wù)來(lái)對(duì)每個(gè)特征進(jìn)行一次初步評(píng)估篇恒,原理是單獨(dú)使用每個(gè)特征來(lái)自動(dòng)訓(xùn)練(默認(rèn)使用了樸素貝葉斯做分類算法)并進(jìn)行Cross Validation(交叉驗(yàn)證)扶檐,得出Accuracy(準(zhǔn)確率)、Precision(精確率)胁艰、Recall(召回值)款筑,用來(lái)評(píng)估該特征對(duì)預(yù)測(cè)標(biāo)記特征的重要程度智蝠。

執(zhí)行特征評(píng)估任務(wù),并使用選項(xiàng)label_column指明Survived 為標(biāo)記特征:

rake app:classifiers:titanic:evaluate_features label_column=Survived
rake_app_classifiers_titanic_evaluate_features_label_column_survived.png

留意提示:

Tips: if Average Accuracy > 0.8 means it's an important feature; if Precision is 0 means it's not reliable

從分析結(jié)果中可以看到:

  • SexAccuracy 大于0.8奈梳,屬于比較重要的特征杈湾。
  • PassengerId 以及 NamePrecision0,表示特征值太離散颈嚼,不適合用來(lái)做預(yù)測(cè)的特征毛秘,而事實(shí)上這2個(gè)特征的值都是唯一不重復(fù)的(Name只有2條重復(fù)),確實(shí)不適合做為分類特征阻课。
  • Age叫挟、SibSpParch限煞、Cabin抹恳、和EmbarkedPrecision 值都偏低(< 0.3),說(shuō)明這個(gè)幾項(xiàng)相關(guān)性不足(有部分是受到缺失值得影響)署驻。

數(shù)據(jù)展示(可視化)

人是視覺(jué)生物奋献,天生對(duì)圖像信息比數(shù)字、文字信息更敏感旺上,為了能更直觀的表達(dá)統(tǒng)計(jì)數(shù)據(jù)所體現(xiàn)的意義瓶蚂,可將數(shù)據(jù)以各種圖表的形式來(lái)可做視化展示,輔助對(duì)數(shù)據(jù)的理解宣吱。

我編寫的這套工具中集成了一些圖表的Web UI窃这,可以直接使用數(shù)據(jù)分析任務(wù)的輸出報(bào)表來(lái)生成圖表,可以查看每一個(gè)特征的統(tǒng)計(jì)征候。

例如性別數(shù)量統(tǒng)計(jì):

性別統(tǒng)計(jì)

男多女少杭攻!那人多力量就大嗎?讓數(shù)據(jù)回答疤坝,加入存活狀態(tài)對(duì)比看看:

性別與存活狀態(tài)對(duì)比統(tǒng)計(jì)

很明顯兆解,不用看數(shù)字都看得明白:女性存活率更高!

乘客的年齡與人數(shù)的分布統(tǒng)計(jì)圖:

乘客的年齡與人數(shù)的分布統(tǒng)計(jì)圖

從圖中可看出在乘客中跑揉,人數(shù)最多的是24歲锅睛、有47人,整體呈現(xiàn)出中間層年齡段人數(shù)居多畔裕,人群以年輕衣撬、中年人為主。年輕力壯就會(huì)更有利嗎扮饶?未必具练!

在接下來(lái)的特征工程的后半段中會(huì)有更多的圖表展示,這里先不展開了甜无。


特征工程

什么是特征工程扛点?

數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限哥遮,而模型和算法只是逼近這個(gè)上限而已。而特征工程的目的是最大限度地從原始數(shù)據(jù)中提取特征以供算法和模型使用陵究。顧名思義眠饮,特征工程其實(shí)就是一項(xiàng)工程活動(dòng),它是能夠?qū)?shù)據(jù)像藝術(shù)一般展現(xiàn)的技術(shù)铜邮。這樣說(shuō)的原因是好的特征工程很好的混合了專業(yè)領(lǐng)域知識(shí)仪召、直覺(jué)和基本的數(shù)學(xué)能力。

數(shù)據(jù)清洗

通過(guò)前面的數(shù)據(jù)分析知道有一些數(shù)據(jù)有缺失松蒜,需要先填充扔茅。

這里可以使用console=y 選項(xiàng)來(lái)以交互模式來(lái)執(zhí)行數(shù)據(jù)清洗任務(wù)clean_data

rake app:classifiers:titanic:clean_data console=y

填補(bǔ) Fare

看下 Fare 數(shù)據(jù)的缺失情況:


只有一條缺失記錄,而這個(gè)乘客的Ticket只有他一個(gè)人在使用秸苗,無(wú)法通過(guò)查找相同票號(hào)的價(jià)格來(lái)填補(bǔ)召娜。

船票的價(jià)格顯然是跟 Pclass (客艙等級(jí))及 Cabin(客艙號(hào))有關(guān)的,因此使用具有相同PclassCabin的中位數(shù)來(lái)填補(bǔ):

df.where(df['Fare'].not_eq(nil) & df['Pclass'].eq(3) & df['Cabin'].eq(nil) )['Fare'].median
 => 8.05 

填補(bǔ) Age

df['Age'].missing
 => 263 

發(fā)現(xiàn)所有 Name 中有“Mr.” “Mrs.” 等頭銜字眼惊楼,因此提取出來(lái)可以作為一個(gè)輔助特征Title玖瘸,然后再使用具有相同TitleSex的中位數(shù)來(lái)填補(bǔ)。

填補(bǔ) Cabin

Cabin 缺失的比較多檀咙,但發(fā)現(xiàn)相同CabinTicket也相同雅倒,因此可以反推具有相同Ticket的乘客也會(huì)住在同一個(gè)Cabin內(nèi),因此可以找出具有相同TicketCabin不為空的乘客數(shù)據(jù)來(lái)填補(bǔ):

df['Cabin'].missing
 => 1014 

same_cabins = 0
df.where(df['Cabin'].eq(nil)).each_row_with_index do |row, idx|
  same_cabin = df.where( df['Cabin'].not_eq(nil) & df['Ticket'].eq(row['Ticket']) )
  if same_cabin.size != 0
    same_cabins += 1
  end
end
same_cabins
# => 16

發(fā)現(xiàn)這類數(shù)據(jù)也不多弧可,只有16條屯断。
其他的不確定性太多放棄填補(bǔ)。Cabin 數(shù)據(jù)雖然不完整侣诺,但還可以用來(lái)提取新的特征,下文有說(shuō)明氧秘。

填補(bǔ) Embarked

+-----+-------------+----------+--------+-------------------------------------------+--------+-----+-------+-------+--------+------+-------+----------+
|     | PassengerId | Survived | Pclass | Name                                      | Sex    | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
+-----+-------------+----------+--------+-------------------------------------------+--------+-----+-------+-------+--------+------+-------+----------+
| 62  | 62          | 1        | 1      | Icard, Miss. Amelie                       | female | 38  | 0     | 0     | 113572 | 80   | B28   |          |
| 830 | 830         | 1        | 1      | Stone, Mrs. George Nelson (Martha Evelyn) | female | 62  | 0     | 0     | 113572 | 80   | B28   |          |
+-----+-------------+----------+--------+-------------------------------------------+--------+-----+-------+-------+--------+------+-------+----------+

Embarked 的缺失只有2條年鸳,觀察數(shù)據(jù)后發(fā)現(xiàn)是2位女士,共用同一張Ticket “113572”丸相,住在同一個(gè)Cabin “B28”搔确,在同一個(gè)Pclass 1,因此推斷她們可能是認(rèn)識(shí)的灭忠,因此也非常有可能是一起出行并在同一個(gè)港口登船膳算,所以不用分別處理。另外我按常理推斷相同港口出售的票是相連的弛作,可取Ticket前4位數(shù)字相同的表示是相同港口涕蜂,最后找出有相同Pclass和相似TicketEmbarked 的眾數(shù):

df.filter_rows { |p| p['Ticket'].to_s.first(4) == '113572'.first(4) && p['Pclass'] == 1 } ['Embarked'].frequencies.max_index
 => #<Daru::Vector(1)>
   C   7 

得出是 “C”。

完成數(shù)據(jù)清洗后映琳,查看現(xiàn)有的數(shù)據(jù)概況:


可以看到只有 Cabin 還有998條是缺失的了机隙,至此數(shù)據(jù)清洗完畢蜘拉,接下來(lái)做新特征提取。


提取新特征

問(wèn)題:應(yīng)該提取出哪些特征?

面對(duì)這樣的群體災(zāi)難事件場(chǎng)景中有鹿,有什么因素會(huì)影響到個(gè)人生存機(jī)會(huì)呢旭旭?是個(gè)人的年齡、體力葱跋、社會(huì)身份持寄、財(cái)富、擁有的權(quán)力娱俺?是因?yàn)槟闶桥陨晕丁е⒆拥哪赣H?小孩和老人行動(dòng)緩慢會(huì)很不利矢否?人緣好朋友多會(huì)更有優(yōu)勢(shì)仲闽?拖家?guī)Э谑抢圪樳€是助力,還是獨(dú)善其身更有利僵朗?亦或是你當(dāng)時(shí)所處的位置導(dǎo)致了最后的結(jié)局赖欣?

設(shè)想

結(jié)合已有的數(shù)據(jù),我覺(jué)得有如下這些因素可以嘗試:

  • Sex(性別):性別是人類個(gè)體之間最大的生理特征區(qū)別验庙,影響到體力顶吮、社交地位,在群體中往往也受到優(yōu)待(女士?jī)?yōu)先)粪薛,而且前面的特征評(píng)估已說(shuō)明這個(gè)特征很重要
  • AgeLevel(年齡層):年齡影響到體力悴了、社交地位,年紀(jì)小的违寿、或者年紀(jì)大的在群體中往往也受到優(yōu)待(尊老愛幼)湃交;這里可以分組為(child, young, midlife, aged),基于 Age 提取
  • SocialTitle(社交頭銜):在群體活動(dòng)中藤巢,不同身份顯然也會(huì)影響到群體決策 搞莺;這里分組為 Mrs, Miss, Mr and Master,基于 Name 提取
  • IncomeClass(收入水平): 收入決定了所買的船票類型掂咒,也就決定了客艙所在的位置才沧,以及社交地位;分組為 no-income, lower-income, middle-income, upper-income), 可基于 FarePclass 提取
  • SocialClass(社交地位):一個(gè)人可以沒(méi)有很多錢绍刮,但他從事的職業(yè)温圆、貴族身份在群體活動(dòng)中是有影響力的;分為 lower-class, middle-class, upper-class孩革,基于Title, IncomeClass 提取
  • FamilyRole(家庭角色):如果你是位父親岁歉,你所肩負(fù)的責(zé)任能讓你愿意作出巨大犧牲;一位母親在災(zāi)難面前為了保護(hù)孩子往往迸發(fā)超出常人的生存欲望嫉戚;可分組為grandparent, couple, father, mother, child刨裆;可基于Sex,AgeLevel,SibSp,Parch
  • CabinArea(艙位所在區(qū)域):顯然這會(huì)影響到逃生的時(shí)機(jī)澈圈,基于Cabin
  • Mates(伙伴數(shù)量):這次航行中的同行人數(shù)(有多少人使用相同的Ticket
  • FamilySize(同船的家庭成員數(shù)量): 家人在一起互助肯定比一群陌生人有更多的信任和生存機(jī)會(huì);基于SibSpParch
  • TravelAlone(是否孤身上路):Mates + FamilySize帆啃,無(wú)論是朋友還是家人瞬女,多一個(gè)熟人在身邊也許就比別人多一份生存機(jī)率

實(shí)現(xiàn)


提取Sex(性別)

使用原有數(shù)據(jù),不需要改動(dòng)努潘。

提取 AgeLevel(年齡層)

按如下年齡劃分:

age_level = lambda { |age, default="unknown"|
  {
    0..14.5  => 'child',     # 少年0-14
    15..35.5 => 'young',     # 青年15-35
    36..60.5 => 'midlife',   # 中年36-60
    61..90.5 => 'aged',      # 老年61-90
  }.select { |range| range === age }.values[0] || default
}
df['AgeLevel'] = df['Age'].map { |age| age_level.call(age) }
提取 SocialTitle(社交頭銜)
# extract "Title" from "Name"
df['NameTitle'] = df['Name'].map { |name| name.match(/, ([^.]+)./)[1] }

# extract SocialTitle: what was his social title?
social_title = lambda { |title, sex|
  title = title.sub("the ", "")
  title = 'Mrs' if title == 'Dr' && sex == 'female' # a special case
  {
    %w{Mr Don Major Capt Jonkheer Rev Col Dr Sir}=> 'Mr',
    %w{Miss Mlle Ms Lady Dona} => 'Miss',
    %w{Mrs Countess Mme} => 'Mrs',
    %w{Master} => 'Master',
  }.select { |_| _.include? title }.values[0]
}
df['SocialTitle'] = df['NameTitle', 'Sex'].map(:row) { |row| social_title.call(row["NameTitle"], row["Sex"]) }

這樣把一些數(shù)量較少的NameTitle都?xì)w類起來(lái)诽偷,另外提取這個(gè)特征時(shí),發(fā)現(xiàn)有一條特殊記錄疯坤,有一個(gè)Dr是女性报慕,因此做了特殊處理:

title = 'Mrs' if title == 'Dr' && sex == 'female' # a special case
提取 IncomeClass(收入水平)

考慮到游船還是需要一定的經(jīng)濟(jì)收入,我將上層階級(jí)压怠、中產(chǎn)階級(jí)眠冈、下層階級(jí) 按照 1:2:7 的比例(下層等級(jí)的數(shù)量是上層的數(shù)量之和),獲取對(duì)應(yīng)的唯一票價(jià)的分位數(shù)菌瘫,作為分層的水平線:

uniq_fare = df['Fare'].uniq
income_classes = {"no-income": 0, "lower-income": uniq_fare.percentile(100-70), "middle-income": uniq_fare.percentile(100-20), "upper-income": uniq_fare.percentile(100-10) }.stringify_keys
# => {"no-income"=>0, "lower-income"=>10.5, "middle-income"=>57.75, "upper-income"=>82.2667}

得出的數(shù)據(jù)統(tǒng)計(jì)如下:

df['IncomeClass'].uniq_frequencies
# => {"middle-income"=>587, "lower-income"=>513, "upper-income"=>192, "no-income"=>17}
df['IncomeClass'].uniq_proportions
# => {"middle-income"=>0.448, "lower-income"=>0.392, "upper-income"=>0.147, "no-income"=>0.013}

參考資料:

提取 SocialClass(社交地位)

社交地位中“名”與”利“起主要作用(別不服氣蜗顽,現(xiàn)實(shí)社會(huì)的游戲規(guī)則就是這樣)。乘客數(shù)據(jù)中的頭銜信息很重要雨让,因此可以把有貴族頭銜以及IncomeClass是高級(jí)的都視作upper-class雇盖;中產(chǎn)收入的歸為middle-class;其他的就是lower-class栖忠。

代碼簡(jiǎn)單不展示了崔挖,只是有些英國(guó)的貴族頭銜信息我不熟悉需要查下參考資料。

參考資料:

提取 FamilyRole(家庭角色)

這里判別規(guī)則比較復(fù)雜庵寞,看圖理解

提取 CabinArea(艙位所在區(qū)域)

這里要先提取一個(gè)Deck(甲板)特征狸相,這個(gè)是根據(jù)Cabin的首位字母得出的,可以分為A捐川、B卷哩、C、D属拾、E、F冷溶、G和T渐白,未知的則標(biāo)記為N/A

# extract "Deck" from "Cabin"
df['Deck'] = df['Cabin'].map { |cabin| cabin && cabin[0] || 'N/A' }

可以參考泰坦尼克號(hào)的剖面圖:

泰坦尼克號(hào)的剖面圖

從圖上可以看出從字母越前越靠近輪船上層逞频,意味逃生的路徑更短(這個(gè)和后面做新特征分析得到的統(tǒng)計(jì)信息是吻合的)纯衍。

這也是為什么Cabin即使有缺失數(shù)據(jù),也可以換個(gè)姿勢(shì)用來(lái)提取新特征苗胀。

CabinArea 則由PclassDeck組合而成襟诸,如 "P-1 D-C"瓦堵,意思是“頭等艙的C區(qū)”

# extract CabinArea: where was he? () based on Pclass, Deck
# e.g.: "P-1 D-C"
df['CabinArea'] = df['Pclass', 'Deck'].map(:row) { |x| "P-#{x['Pclass']} D-#{x['Deck']}" }
提取 Mates(伙伴數(shù)量)
tickets = df['Ticket'].to_a.group_by(&:itself)
df['Mates'] = df['Ticket'].map { |ticket| tickets[ticket].size }

df['Mates'].uniq_proportions
# => {1=>0.545, 2=>0.202, 3=>0.112, 4=>0.049, 5=>0.027, 7=>0.027, 6=>0.018, 8=>0.012, 11=>0.008}

發(fā)現(xiàn)有近55%的乘客是獨(dú)自出行,而后面做新數(shù)據(jù)分析發(fā)現(xiàn)歌亲,這樣的人的生存率菇用,不到3成。

提取 FamilySize(同船的家庭成員數(shù)量)

很簡(jiǎn)單陷揪,SibSp + Parch

# extract "FamilySize" from "SibSp" and "Parch"
df['FamilySize'] = df['SibSp'] + df['Parch']

df['FamilySize'].uniq_proportions
# {0=>0.604, 1=>0.18, 2=>0.121, 3=>0.033, 5=>0.019, 4=>0.017, 6=>0.012, 10=>0.008, 7=>0.006}

有6成是不帶家人惋鸥,然而,后面的數(shù)據(jù)分析顯示悍缠,這個(gè)不是好主議卦绣。

提取 TravelAlone(是否孤身上路)

是否有伙伴或親人,只有個(gè)人則標(biāo)記為1飞蚓,否則取0

df['TravelAlone'] = df['Mates', 'FamilySize'].map(:row) { |row| row.sum == 1 ? 1 : 0 }

df['TravelAlone'].uniq_frequencies
# => {1=>0.506, 0=>0.494}

各占一半滤港。

把所有特征提取相關(guān)代碼添加到 extract_features子任務(wù)中保存,至此趴拧,新的特征構(gòu)建完畢溅漾!

至此我得到以下特征的數(shù)據(jù):

  • Sex(性別)
  • AgeLevel(年齡層)
  • SocialTitle(社交頭銜)
  • IncomeClass(收入水平)
  • SocialClass(社交地位)
  • FamilyRole(家庭角色)
  • CabinArea(艙位所在區(qū)域)
  • Mates(伙伴數(shù)量)
  • FamilySize(同船的家庭成員數(shù)量)
  • TravelAlone(是否孤身上路)

這些新特征是否真的對(duì)預(yù)測(cè)存活有幫助,接下來(lái)讓看下新特征的分析和評(píng)估八堡。


特征選取 - 評(píng)估及選取新特征

重新跑一次數(shù)據(jù)分析任務(wù)profile_data樟凄,這次加上任務(wù)參數(shù)feature_columns 來(lái)指定要分析的特征數(shù)據(jù): feature_columns=Sex,AgeLevel,SocialTitle,IncomeClass,SocialClass,FamilyRole,CabinArea,Mates,FamilySize,TravelAlone

執(zhí)行的完整命令為:

rake app:classifiers:titanic:profile_data label_column=Survived feature_columns=Sex,AgeLevel,SocialTitle,IncomeClass,SocialClass,FamilyRole,CabinArea,Mates,FamilySize,TravelAlone

可以了解新增特征數(shù)據(jù)的整體概況,下面接著逐一分析每個(gè)新特征的數(shù)據(jù)統(tǒng)計(jì)兄渺。

新特征數(shù)據(jù)分析

要針對(duì)某個(gè)feature 分析缝龄,可以增加參數(shù)profile_feature=$feature_name 來(lái)執(zhí)行數(shù)據(jù)分析任務(wù)profile_data,例如:

rake app:classifiers:titanic:profile_data label_column=Survived feature_columns=Sex,AgeLevel,SocialTitle,IncomeClass,SocialClass,FamilyRole,CabinArea,Mates,FamilySize,TravelAlone profile_feature=Sex

得到:

Sex(性別):

結(jié)合存活狀態(tài)分布圖:

Sex(性別)與存活狀態(tài)分布圖

在這場(chǎng)事故中挂谍,女性擁有更高的生存機(jī)率:74.2%叔壤;男性僅有18.9%。

性別為什么在這樣的災(zāi)難中其關(guān)鍵性作用口叙?從事后幸存者的口中得知炼绘,這是因?yàn)橐粋€(gè)男人的一個(gè)命令。我們帶著疑問(wèn)繼續(xù)看下其他特征的統(tǒng)計(jì)分析妄田。

AgeLevel(年齡層):

年齡層統(tǒng)計(jì)結(jié)果:

Profile feature "AgeLevel"
+----------+-------+-------------+----------------+----------------+
| AgeLevel | count | proportions | Survived=0     | Survived=1     |
+----------+-------+-------------+----------------+----------------+
| young    | 591   | 0.663       | [379, "64.1%"] | [212, "35.9%"] |
| midlife  | 196   | 0.22        | [118, "60.2%"] | [78, "39.8%"]  |
| child    | 82    | 0.092       | [35, "42.7%"]  | [47, "57.3%"]  |
| aged     | 22    | 0.025       | [17, "77.3%"]  | [5, "22.7%"]   |
+----------+-------+-------------+----------------+----------------+

按生理階段分為4組:

  • child:少年(0-14)
  • young:青年(15-35)
  • midlife:中年(36-60)
  • aged:老年(61-90)

生存率最高的是少年們俺亮,存活率是57.3%;老年人有最高的死亡率:77.3%疟呐;身強(qiáng)力壯的青年死亡率第二脚曾,為64.1%;更有生活經(jīng)驗(yàn)的中年存活率不到4成启具,為39.8%本讥。

看圖更直觀:

AgeLevel(年齡層)與存活狀態(tài)分布圖

從這些數(shù)據(jù)對(duì)比可以看出,年齡與存活率不是線性的關(guān)系,不是越低越好拷沸,也不是越高越差色查。思考下,年齡的分組撞芍,實(shí)際上也形成社會(huì)關(guān)系秧了、家庭角色的分組差異,因此在這里統(tǒng)計(jì)表現(xiàn)可能只是表面結(jié)果勤庐,并不是深層原因示惊。

SocialTitle(社交頭銜):
Profile feature "SocialTitle"
+-------------+-------+-------------+----------------+----------------+
| SocialTitle | count | proportions | Survived=0     | Survived=1     |
+-------------+-------+-------------+----------------+----------------+
| Mr          | 537   | 0.603       | [451, "84.0%"] | [86, "16.0%"]  |
| Miss        | 186   | 0.209       | [55, "29.6%"]  | [131, "70.4%"] |
| Mrs         | 128   | 0.144       | [26, "20.3%"]  | [102, "79.7%"] |
| Master      | 40    | 0.045       | [17, "42.5%"]  | [23, "57.5%"]  |
+-------------+-------+-------------+----------------+----------------+

被稱呼為 Mrs(太太)的存活率最高為79.7%,這個(gè)只是簡(jiǎn)單的稱呼信息愉镰,別人尊稱你一聲“先生”米罚、“小姐”或者“太太”,不會(huì)決定你的生死丈探,但你可以據(jù)此快速了解到录择,當(dāng)有人稱呼你為MrMiss時(shí),你在這場(chǎng)事故中的存活概率碗降。

SocialTitle(社交頭銜)與存活狀況分布圖
IncomeClass(收入水平):
Profile feature "IncomeClass"
+---------------+-------+-------------+----------------+----------------+
| IncomeClass   | count | proportions | Survived=0     | Survived=1     |
+---------------+-------+-------------+----------------+----------------+
| middle-income | 403   | 0.452       | [222, "55.1%"] | [181, "44.9%"] |
| lower-income  | 348   | 0.391       | [273, "78.4%"] | [75, "21.6%"]  |
| upper-income  | 125   | 0.14        | [40, "32.0%"]  | [85, "68.0%"]  |
| no-income     | 15    | 0.017       | [14, "93.3%"]  | [1, "6.7%"]    |
+---------------+-------+-------------+----------------+----------------+

存活率最低的是no-income只有6.7%隘竭,最高的是upper-income為68.0%,收入水平跟存活率有很明顯的線性關(guān)系:收入水平越高生存機(jī)率越高讼渊。這樣的結(jié)果很殘酷也很現(xiàn)實(shí)动看,更富有則擁有更多的生存優(yōu)勢(shì),從來(lái)如此爪幻。

IncomeClass(收入水平)與存活狀況分布圖

有錢就一定能活下來(lái)嗎菱皆?

SocialClass(社交地位):
Profile feature "SocialClass"
+--------------+-------+-------------+----------------+----------------+
| SocialClass  | count | proportions | Survived=0     | Survived=1     |
+--------------+-------+-------------+----------------+----------------+
| lower-class  | 361   | 0.405       | [286, "79.2%"] | [75, "20.8%"]  |
| middle-class | 357   | 0.401       | [201, "56.3%"] | [156, "43.7%"] |
| upper-class  | 173   | 0.194       | [62, "35.8%"]  | [111, "64.2%"] |
+--------------+-------+-------------+----------------+----------------+

存活率最低的是lower-class 為20.8%,最高的是upper-class為64.2%挨稿,社交地位跟存活率有很明顯的線性關(guān)系:社交地位越高生存機(jī)率越高仇轻。這是說(shuō)沒(méi)有利,也要有名嗎奶甘?數(shù)據(jù)不會(huì)撒謊篷店,同樣很現(xiàn)實(shí)。

SocialClass(社交地位)與存活狀況分布圖
FamilyRole(家庭角色):

不看外因看內(nèi)因臭家,從家庭的角度看看:

Profile feature "FamilyRole"
+-------------+-------+-------------+----------------+----------------+
| FamilyRole  | count | proportions | Survived=0     | Survived=1     |
+-------------+-------+-------------+----------------+----------------+
| single      | 530   | 0.595       | [363, "68.5%"] | [167, "31.5%"] |
| mother      | 87    | 0.098       | [27, "31.0%"]  | [60, "69.0%"]  |
| child       | 82    | 0.092       | [35, "42.7%"]  | [47, "57.3%"]  |
| husband     | 72    | 0.081       | [57, "79.2%"]  | [15, "20.8%"]  |
| wife        | 49    | 0.055       | [8, "16.3%"]   | [41, "83.7%"]  |
| father      | 49    | 0.055       | [42, "85.7%"]  | [7, "14.3%"]   |
| grandparent | 22    | 0.025       | [17, "77.3%"]  | [5, "22.7%"]   |
+-------------+-------+-------------+----------------+----------------+

存活率最低的是father父親(14.3%)疲陕,緊接是husband丈夫(20.8%);最高的不是mother母親(69.%)钉赁,而是沒(méi)有孩子的wife太太(83.7%)鸭轮。

FamilyRole(家庭角色)與存活狀況分布圖

作為男性,明明是群體中最具有強(qiáng)壯的體魄橄霉,又有相對(duì)更豐富的生存經(jīng)驗(yàn),怎么反而在這場(chǎng)事故中就成了生存機(jī)率最低的?這里再提出一個(gè)疑問(wèn)姓蜂。

CabinArea(艙位所在區(qū)域):

“天時(shí)不如地利”按厘,艙位所在區(qū)域是否影響乘客到達(dá)甲板的時(shí)間、登上救生艇的機(jī)會(huì)钱慢?

Profile feature "CabinArea"
+-----------+-------+-------------+----------------+----------------+
| CabinArea | count | proportions | Survived=0     | Survived=1     |
+-----------+-------+-------------+----------------+----------------+
| P-3 D-N/A | 478   | 0.536       | [366, "76.6%"] | [112, "23.4%"] |
| P-2 D-N/A | 167   | 0.187       | [93, "55.7%"]  | [74, "44.3%"]  |
| P-1 D-C   | 67    | 0.075       | [26, "38.8%"]  | [41, "61.2%"]  |
| P-1 D-B   | 48    | 0.054       | [12, "25.0%"]  | [36, "75.0%"]  |
| P-1 D-N/A | 31    | 0.035       | [19, "61.3%"]  | [12, "38.7%"]  |
| P-1 D-D   | 29    | 0.033       | [7, "24.1%"]   | [22, "75.9%"]  |
| P-1 D-E   | 25    | 0.028       | [7, "28.0%"]   | [18, "72.0%"]  |
| P-1 D-A   | 15    | 0.017       | [8, "53.3%"]   | [7, "46.7%"]   |
| P-2 D-F   | 8     | 0.009       | [1, "12.5%"]   | [7, "87.5%"]   |
| P-3 D-F   | 6     | 0.007       | [4, "66.7%"]   | [2, "33.3%"]   |
| P-2 D-E   | 5     | 0.006       | [2, "40.0%"]   | [3, "60.0%"]   |
| P-2 D-D   | 4     | 0.004       | [1, "25.0%"]   | [3, "75.0%"]   |
| P-3 D-G   | 4     | 0.004       | [2, "50.0%"]   | [2, "50.0%"]   |
| P-3 D-E   | 3     | 0.003       | [0, "0.0%"]    | [3, "100.0%"]  |
| P-1 D-T   | 1     | 0.001       | [1, "100.0%"]  | [0, "0.0%"]    |
+-----------+-------+-------------+----------------+----------------+
  • 存活率最低的是 P-1 D-T逮京,頭等艙T層甲板,只有1個(gè)人束莫,存活率只有0%懒棉;
  • 存活率最高的是 P-3 D-E,頭等艙E層甲板览绿,有3個(gè)人策严,都活了下來(lái),存活率100%饿敲;
  • 幸存人數(shù)最多的是P-3 D-N/A妻导,三等艙其他區(qū)域,112人活了下來(lái)怀各,而存活率只有23.4%倔韭;
  • 人數(shù)次之的是P-2 D-N/A,二等艙其他區(qū)域瓢对,存活率44.3%寿酌;
  • 第三的是P-1 D-C,頭等艙C層甲板硕蛹,存活率61.2%醇疼;
CabinArea(艙位所在區(qū)域)與存活狀況分布圖

觀察泰坦尼克號(hào)的艙室布局圖:

泰坦尼克號(hào)的艙室布局圖

可以發(fā)現(xiàn)頭等艙分布在船體的各段部位,比二等妓美、三等艙有更好的出入口僵腺、更接近甲板,因此應(yīng)該擁有更有利的生存機(jī)會(huì)壶栋,跟得出的統(tǒng)計(jì)信息是吻合的辰如。

你在哪里出發(fā)也就決定了你能走到哪里?輸在起跑線上贵试,又有誰(shuí)愿意呢琉兜。

Mates(伙伴數(shù)量):

中國(guó)古語(yǔ)云:“地利不如人和”,“在家靠父母毙玻,出門靠朋友”豌蟋,看看出行的伙伴數(shù)量:

Profile feature "Mates"
+-------+-------+-------------+----------------+----------------+
| Mates | count | proportions | Survived=0     | Survived=1     |
+-------+-------+-------------+----------------+----------------+
| 1     | 481   | 0.54        | [351, "73.0%"] | [130, "27.0%"] |
| 2     | 181   | 0.203       | [88, "48.6%"]  | [93, "51.4%"]  |
| 3     | 101   | 0.113       | [35, "34.7%"]  | [66, "65.3%"]  |
| 4     | 44    | 0.049       | [12, "27.3%"]  | [32, "72.7%"]  |
| 7     | 24    | 0.027       | [19, "79.2%"]  | [5, "20.8%"]   |
| 5     | 21    | 0.024       | [14, "66.7%"]  | [7, "33.3%"]   |
| 6     | 19    | 0.021       | [15, "78.9%"]  | [4, "21.1%"]   |
| 8     | 13    | 0.015       | [8, "61.5%"]   | [5, "38.5%"]   |
| 11    | 7     | 0.008       | [7, "100.0%"]  | [0, "0.0%"]    |
+-------+-------+-------------+----------------+----------------+
  • 1個(gè)獨(dú)自出行是最多的,但存活率只有 27.0%桑滩;
  • 2個(gè)人結(jié)伴出行是數(shù)量排第二梧疲,存活率為 51.4%;
  • 人數(shù)最多的有11個(gè),有存活狀態(tài)的有7人幌氮,然后一個(gè)也沒(méi)活下來(lái)缭受,存活率是0%;
  • 存活率最高的是4個(gè)人一組的该互,有44個(gè)米者,存活率是72.7%;
  • 除了0%以外存活率最低的是7個(gè)人一組的宇智,有24人蔓搞,存活率比單人還低,僅有20.8%随橘;

從數(shù)據(jù)看掌唾,伙伴數(shù)量跟存活率并非是線性關(guān)系对嚼,而是呈現(xiàn)“凸函數(shù)”特征乔妈,2魔策、3、4這樣的中間值都有過(guò)半的存活機(jī)率蜒车;1及6讳嘱、7、11 兩端數(shù)值的生存率均不過(guò)3成酿愧。這是否是表明在出行時(shí)沥潭,3到4人是最佳的團(tuán)隊(duì)人數(shù),人數(shù)過(guò)少或過(guò)多都不利團(tuán)隊(duì)生存嬉挡。

Mates(伙伴數(shù)量)與存活狀態(tài)分布圖
FamilySize(同船的家庭成員數(shù)量):

家庭規(guī)模對(duì)生存的影響:

Profile feature "FamilySize"
+------------+-------+-------------+----------------+----------------+
| FamilySize | count | proportions | Survived=0     | Survived=1     |
+------------+-------+-------------+----------------+----------------+
| 0          | 537   | 0.603       | [374, "69.6%"] | [163, "30.4%"] |
| 1          | 161   | 0.181       | [72, "44.7%"]  | [89, "55.3%"]  |
| 2          | 102   | 0.114       | [43, "42.2%"]  | [59, "57.8%"]  |
| 3          | 29    | 0.033       | [8, "27.6%"]   | [21, "72.4%"]  |
| 5          | 22    | 0.025       | [19, "86.4%"]  | [3, "13.6%"]   |
| 4          | 15    | 0.017       | [12, "80.0%"]  | [3, "20.0%"]   |
| 6          | 12    | 0.013       | [8, "66.7%"]   | [4, "33.3%"]   |
| 10         | 7     | 0.008       | [7, "100.0%"]  | [0, "0.0%"]    |
| 7          | 6     | 0.007       | [6, "100.0%"]  | [0, "0.0%"]    |
+------------+-------+-------------+----------------+----------------+
  • 沒(méi)有與親人同行的有537人钝鸽,存活率30.4%;
  • 存活率最低的去到0%庞钢,是成員數(shù)最大的7和10拔恰;
  • 存活率最高是72.4%,是成員數(shù)為3基括;而人數(shù)到了4時(shí)生存率急劇下降到20.0%颜懊;

3人加上自己,也就是4风皿,跟前面的Mates=4時(shí)生存率最高的結(jié)果重疊了河爹,這應(yīng)該是團(tuán)體票都是同一個(gè)票號(hào)的緣故。

FamilySize(同船的家庭成員數(shù)量)與存活狀態(tài)分布圖
TravelAlone(是否孤身上路):
Profile feature "TravelAlone"
+-------------+-------+-------------+----------------+----------------+
| TravelAlone | count | proportions | Survived=0     | Survived=1     |
+-------------+-------+-------------+----------------+----------------+
| 1           | 448   | 0.503       | [327, "73.0%"] | [121, "27.0%"] |
| 0           | 443   | 0.497       | [222, "50.1%"] | [221, "49.9%"] |
+-------------+-------+-------------+----------------+----------------+

當(dāng)你一個(gè)人時(shí)桐款,只有27.0%的機(jī)率存活咸这;你有伙伴時(shí),有49.9%的機(jī)會(huì)活下去魔眨。

TravelAlone(是否孤身上路)與存活狀態(tài)分布圖

所以出遠(yuǎn)門時(shí)媳维,還是結(jié)伴出行吧酿雪。

MatesFamilySize侄刽、TravelAlone 這幾組數(shù)據(jù)表明执虹,組隊(duì)是有必要的,但人數(shù)不宜過(guò)多唠梨,4個(gè)人在一起是最有優(yōu)勢(shì)的組合。

數(shù)據(jù)導(dǎo)出

導(dǎo)出需要的特征數(shù)據(jù)進(jìn)行存檔侥啤,執(zhí)行數(shù)據(jù)導(dǎo)出任務(wù)export_features

rake app:classifiers:titanic:export_features label_column=Survived feature_columns=Sex,AgeLevel,SocialTitle,IncomeClass,SocialClass,FamilyRole,CabinArea,Mates,FamilySize,TravelAlone
Save to tmp/classifiers_output/titanic_survival_prediction-export.csv

導(dǎo)出數(shù)據(jù)在這里可以下載: titanic_survival_prediction-export.csv


機(jī)器學(xué)習(xí)預(yù)測(cè)

machine-learning-cheet-sheet.png

選擇算法

訓(xùn)練數(shù)據(jù)有帶標(biāo)注的特征当叭、需要預(yù)測(cè)是否存活,顯然這是一個(gè)非常典型的二元分類問(wèn)題盖灸,屬于監(jiān)督學(xué)習(xí)分類問(wèn)題蚁鳖;特征數(shù)據(jù)中有連續(xù)數(shù)值(continuous)和離散值(discrete),數(shù)據(jù)量也不大赁炎,這里我選擇了決策樹算法(Decisiontree)醉箕。另外,選擇這個(gè)算法徙垫,這也有種命運(yùn)在做決策的意味讥裤。

訓(xùn)練及評(píng)估

為了讓要預(yù)測(cè)特征比較語(yǔ)義,我加了一個(gè)新的特征 Survival姻报,只是簡(jiǎn)單把1和0值映射為SurvivedNo

# extract "Survival" so that can use it as the label_column
df['Survival'] = df['Survived'].map { |survived| survived && (survived == 1 ? 'Survived' : 'No') }

然后配置模型參數(shù):

訓(xùn)練及交叉驗(yàn)證:

執(zhí)行訓(xùn)練任務(wù)train會(huì)自動(dòng)把有標(biāo)記的數(shù)據(jù)集按比例拆分成訓(xùn)練集和測(cè)試集己英,進(jìn)行交叉驗(yàn)證:

rake app:classifiers:titanic:train summary=n

模型評(píng)估結(jié)果的F1 Score平均分是 0.81489,高于最開始的評(píng)分基準(zhǔn)值吴旋,說(shuō)明新增的特征整體上有更高的相關(guān)性损肛。

要評(píng)估每個(gè)新特征的相關(guān)性,執(zhí)行特征評(píng)估任務(wù) evaluate_features

rake app:classifiers:titanic:evaluate_features

對(duì)比原始數(shù)據(jù)的評(píng)估結(jié)果荣瑟,新特征的相關(guān)性更高些(CabinArea 由于有數(shù)據(jù)缺失治拿,精確度不高)。

訓(xùn)練結(jié)束后選擇 Persist trained data?(y/n):y 保存訓(xùn)練結(jié)果笆焰,任務(wù)會(huì)自動(dòng)保存模型圖像劫谅,可得到一棵決定存活與否的命運(yùn)決策之樹:

DecisiontreeClassifier-for-titanic_survival_prediction.png

『點(diǎn)擊查看大圖』

預(yù)測(cè)結(jié)果

認(rèn)為模型可信后,就可以對(duì)待預(yù)測(cè)數(shù)據(jù)進(jìn)行預(yù)測(cè)仙辟,執(zhí)行預(yù)測(cè)任務(wù) predict

rake app:classifiers:titanic:predict summary=n 
rake app:classifiers:titanic:predict summary=n

至此同波,完成了從數(shù)據(jù)分析到數(shù)據(jù)清洗、特征工程叠国、機(jī)器學(xué)習(xí)建模以及最后的乘客生存狀態(tài)預(yù)測(cè)未檩。

人物畫像

有了特征提取的規(guī)則,以及預(yù)測(cè)的模型粟焊,最后我們可以做下簡(jiǎn)單的人物畫像冤狡,構(gòu)建一個(gè)persona任務(wù)孙蒙,運(yùn)行:

rake app:classifiers:titanic:persona

輸出如下:

... ...

 "Klasen, Miss. Gertrud Emilia" was a child Miss.
 She was 1 years old.
 She was a child, with 2 families.
 She was in a middle-income family since She spent $12.1833 to buy a 3rd Class ticket.
 She embarked from Southampton port.
 > Did She survive? Probably No.

 "Parker, Mr. Clifford Richard" was a young Mr.
 He was 28 years old.
 He was single.
 He was in a lower-income family since He spent $10.5 to buy a 2nd Class ticket.
 He embarked from Southampton port.
 > Did He survive? Probably No.
 
 "Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)" was a midlife Mrs.
 She was 47 years old.
 She was a wife, with Her husband.
 She was in a upper-income family since She spent $61.175 to buy a 1st Class ticket.
 She embarked from Southampton port.
 Her cabin was on E Deck.
 > Did She survive? Probably Survived.
 
... ...

那么,現(xiàn)在在船上的“你”悲雳,可以對(duì)照“自己”的特征挎峦,預(yù)測(cè)下自己有多少機(jī)會(huì)可以活下來(lái)了。

總結(jié)

結(jié)合歷史核對(duì)結(jié)論

數(shù)據(jù)分析的目的:通過(guò)數(shù)據(jù)合瓢,找出事件背后的原因坦胶、規(guī)律,用來(lái)改進(jìn)晴楔、預(yù)防未來(lái)相似的事件顿苇。

在先前的分析數(shù)據(jù)時(shí)提出的疑問(wèn):

性別為什么在這樣的災(zāi)難中其關(guān)鍵性作用?

為什么婦女兒童這類“弱者”反而更能生存税弃?

根據(jù)泰坦尼克號(hào)唯一存活副船長(zhǎng)查爾斯·萊特勒纪岁,事后描述,面對(duì)沉船災(zāi)難時(shí)则果,船長(zhǎng)愛德華·約翰·史密斯(Edward J. Smith)在最后的時(shí)刻下命令幔翰,命令先讓婦女和兒童上救生艇,許多乘客顯得十分平靜西壮,一些人則拒絕與家人分開遗增。

船長(zhǎng)愛德華·史密斯在最后的時(shí)刻下命令

在生命面前,一切都是平等的茸时。是什么抑制了生存的本能贡定,讓人能作出如此犧牲讓步?顯然可都,是社會(huì)文明發(fā)展的結(jié)果缓待。

是不是可以有個(gè)結(jié)論:災(zāi)難發(fā)生時(shí),如果跟高素質(zhì)的人群聚集渠牲,弱者能得到優(yōu)待旋炒?

再看另外一個(gè)問(wèn)題:

有錢就一定能活下來(lái)嗎?

回憶錄中有描述:

亞斯特四世(當(dāng)時(shí)世界第一首富)把懷著五個(gè)月身孕的妻子送上4號(hào)救生艇后签杈,站在甲板上瘫镇,帶著他的狗,點(diǎn)燃一根雪茄煙答姥,對(duì)劃向遠(yuǎn)處的小艇最后呼喊:"我愛你們O吵"

還有一個(gè)問(wèn)題:

作為男性,明明是群體中最具有強(qiáng)壯的體魄鹦付,又有相對(duì)更豐富的生存經(jīng)驗(yàn)尚粘,怎么反而在這場(chǎng)事故中就成了生存機(jī)率最低的?

作為男人敲长、作為孩子的父親郎嫁、作為妻子的丈夫秉继,肩頭上扛的一邊感情,另一邊是責(zé)任泽铛,面對(duì)災(zāi)難是作出了何種抉擇尚辑,其實(shí)不用多說(shuō),看一段回憶錄:

一名叫那瓦特列的法國(guó)商人把兩個(gè)孩子送上了救生艇盔腔,委托幾名婦女代為照顧杠茬,自己卻拒絕上船。

兩個(gè)兒子得救后弛随,世界各地的報(bào)紙紛紛登載兩個(gè)孩子的照片澈蝙,直到他們的母親從照片上認(rèn)出了他們。不幸的是撵幽,孩子們永遠(yuǎn)失去了父親。

新婚燕爾的麗德帕絲同丈夫去美國(guó)度蜜月礁击,她死死抱住丈夫不愿獨(dú)自逃生盐杂。

丈夫在萬(wàn)般無(wú)奈中一拳將她打昏。麗德帕絲醒來(lái)時(shí)哆窿,她已在一條在海上漂浮的救生艇上了链烈。

此后,她終生未再嫁挚躯,以此懷念亡夫强衡。

一些特別數(shù)據(jù)

  • 人數(shù)最多的家庭:

是 Sage一家,有11個(gè)人码荔,大部分沒(méi)有存活漩勤。

  • 年紀(jì)最小的乘客:

一個(gè)不足2個(gè)月的女嬰。

  • 年紀(jì)最大的乘客:

是一位80高齡的老先生缩搅,當(dāng)時(shí)幸存了下來(lái)越败。

  • 唯一的女博士:
  • 沒(méi)有家人的小孩:

不知為何沒(méi)有登記父母記錄,還是真的沒(méi)有父母陪同出行硼瓣。

  • 同名的人:

不確定是真的巧合同名究飞,還是乘客登記信息有誤。

結(jié)語(yǔ)

泰坦尼克號(hào)事件發(fā)生距今已有105年堂鲤,即使是年齡最小的幸存者也早已不在人世亿傅,這個(gè)事件留下給世人的教訓(xùn)不應(yīng)該只有對(duì)影視作品的唏噓與緬懷。

在冰冷沒(méi)有情感的數(shù)據(jù)上進(jìn)行分析解讀瘟栖,我們發(fā)現(xiàn)“物競(jìng)天擇葵擎,適者生存”這樣的大自然生存法則,在泰坦尼克這樣的災(zāi)難事件上完全失去了作用慢宗。

隨著科技的發(fā)展坪蚁、更為先進(jìn)的探測(cè)奔穿、預(yù)警工具的研發(fā),人工智能駕駛技術(shù)的投入敏晤,以后這樣大型的意外事件可能會(huì)越來(lái)少發(fā)生贱田,但一旦發(fā)生了,影響個(gè)體存活的因素嘴脾,除了科技手段男摧,還有群體的文明程度。很慶幸译打,我們生活在一個(gè)科技耗拓、文明都在高速發(fā)展的時(shí)代。

那么當(dāng)科技發(fā)展的速度超過(guò)文明發(fā)展奏司,由沒(méi)有感性只有理性的機(jī)器乔询、人工智能來(lái)定最佳的生存選擇的策略時(shí),又會(huì)是一種什么局面韵洋?


參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竿刁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搪缨,更是在濱河造成了極大的恐慌食拜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件副编,死亡現(xiàn)場(chǎng)離奇詭異负甸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)痹届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門呻待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人队腐,你說(shuō)我怎么就攤上這事带污。” “怎么了香到?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵鱼冀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我悠就,道長(zhǎng)千绪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任梗脾,我火速辦了婚禮荸型,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炸茧。我一直安慰自己瑞妇,他們只是感情好稿静,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辕狰,像睡著了一般改备。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔓倍,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天悬钳,我揣著相機(jī)與錄音,去河邊找鬼偶翅。 笑死默勾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聚谁。 我是一名探鬼主播母剥,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼形导!你這毒婦竟也來(lái)了媳搪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骤宣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后序愚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憔披,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年爸吮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芬膝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡形娇,死狀恐怖锰霜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桐早,我是刑警寧澤癣缅,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站哄酝,受9級(jí)特大地震影響友存,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陶衅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一屡立、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搀军,春花似錦膨俐、人聲如沸勇皇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敛摘。三九已至,卻和暖如春檩坚,著一層夾襖步出監(jiān)牢的瞬間着撩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工匾委, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拖叙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓赂乐,卻偏偏與公主長(zhǎng)得像薯鳍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挨措,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 導(dǎo)語(yǔ): 1912年4月10日挖滤,號(hào)稱 “世界工業(yè)史上的奇跡”的豪華客輪泰坦尼克號(hào)開始了自己的處女航,從英國(guó)的南安普頓...
    Mr_dvbkhm閱讀 5,575評(píng)論 3 5
  • 就是這篇文章浅役,知乎稱“您的帳號(hào)由于存在異常行為暫時(shí)被知乎反作弊系統(tǒng)限制使用”斩松,然后任憑我申訴多久,都恢復(fù)不了了>跫取惧盹!...
    奔跑的蜈蚣閱讀 1,401評(píng)論 1 2
  • 我生活在黑暗的枯井中 這井, 絕崖般無(wú)底 我被一條鐵鏈?zhǔn)`著 鐵鏈上散發(fā)出的 難聞的鐵銹氣息 令茍活著的我 將至窒...
    默者f閱讀 381評(píng)論 2 2
  • 給他 父親是雨天的休止符 多年來(lái)瞪讼,我的文字里少有提及他 這個(gè)自打出生就接納我的男人 我們?cè)诒舜说膲?mèng)里混淆視聽 見證...
    蔥蔥_閱讀 607評(píng)論 22 14
  • 生肖豬 生肖屬豬的人,風(fēng)生水起符欠,生意有成嫡霞,路遇豪客,家業(yè)大興希柿,五行水相更能在4月10日前后達(dá)到鼎盛階段诊沪,生意上富得...
    人工變美日記閱讀 209評(píng)論 0 0