Kaggle Titanic乘客生還預(yù)測

各列數(shù)據(jù)的意義:

  1. PassengerId:乘客id
  2. Survived:是否生還
  3. Pclass:船票等級
  4. Name:姓名
  5. Sex:性別
  6. Age:年齡
  7. SibSp:登船兄弟姊妹/配偶數(shù)量
  8. Parch:登船父母/子女?dāng)?shù)量
  9. Ticket:船票號碼
  10. Fare:船票價(jià)格
  11. Cabin:船艙
  12. Embarked:登船口
import pandas as pd
import numpy as np

# 加載訓(xùn)練數(shù)據(jù)
original_data = pd.read_csv("train.csv")
# 加載要預(yù)測的數(shù)據(jù)
original_predict_data = pd.read_csv("test.csv")
# 我們要預(yù)測的值是Survived律胀,所以將其取出來读第。
y = original_data.Survived
original_data_without_survived = original_data.drop(["Survived"], axis=1)
# 由于數(shù)據(jù)分為訓(xùn)練數(shù)據(jù)和預(yù)測數(shù)據(jù)兩個(gè)數(shù)據(jù)集咪橙,為了能以統(tǒng)一的方式處理數(shù)據(jù)野来,先將這兩個(gè)數(shù)據(jù)集合并。
data = pd.concat([original_data_without_survived, original_predict_data], ignore_index=True)

1. 處理屬性

有一些屬性需要處理后才能用于訓(xùn)練模型。

1.1 PassengerId

PassengerId僅代表數(shù)據(jù)集中乘客的順序,不影響乘客是否生還的結(jié)果祟滴,所以將其移除以防止影響預(yù)測結(jié)果。

data = data.drop(["PassengerId"], axis=1)

1.2 姓名

姓名屬于標(biāo)稱屬性歌溉,但每個(gè)人的姓名都不一樣垄懂,這樣并不好處理。檢查數(shù)據(jù)發(fā)現(xiàn)每個(gè)姓名中都帶有頭銜痛垛,頭銜的可能性較少草慧,可以將其提取出來作為一個(gè)獨(dú)立的屬性來處理。

import re
name_title_pattern = re.compile(r'\w+\.')
# NameTitle的可能性為18個(gè)匙头,與15相差不大漫谷,可適用one-hot編碼。
data["NameTitle"] = data.Name.apply(lambda n: name_title_pattern.search(n).group())
# 去除姓名屬性
data = data.drop(["Name"], axis=1)

1.3 性別

性別屬于二元屬性(只有男和女兩種可能性)蹂析,這里用“0”表示male抖剿,“1”表示female。

data["Sex"] = data.Sex.map({"male":0, "female":1})

1.4 船票號碼

大多數(shù)的船票號碼都是獨(dú)立的识窿,小部分號碼是重復(fù)的。猜測擁有相同船票號碼的乘客可能是同伴關(guān)系脑融,因此將號碼重復(fù)的次數(shù)作為一個(gè)獨(dú)立的屬性喻频。

ticket_map = {}
for ticket in data.Ticket:
    if ticket in ticket_map:
        ticket_map[ticket] += 1
    else:
        ticket_map[ticket] = 1
data["Ticket"] = data.Ticket.apply(lambda t: ticket_map[t])

1.5 船艙

類似船票號碼,大多數(shù)船艙都是獨(dú)立唯一的肘迎。檢查數(shù)據(jù)發(fā)現(xiàn)船艙首字母的重復(fù)性較高甥温,猜測其代表船艙的區(qū)域锻煌,所以將其提取出來作為獨(dú)立屬性。

data["Cabin"] = data.Cabin.apply(lambda c: np.NaN if pd.isnull(c) else c[0])

1.6 船票等級

雖然船票等級屬性為數(shù)值類型姻蚓,但是可以將其看作分類屬性宋梧。

pclass_names = ["A", "B", "C"]
data["PclassName"] = data.Pclass.apply(lambda x: pclass_names[x-1])
data = data.drop(["Pclass"], axis=1)

2. 處理缺失值

2.1 年齡

年齡丟失情況比較多,這里以pclass和性別進(jìn)行分組狰挡,并取其中位數(shù)作為缺失值捂龄。

def get_default_age(pclass_name, sex):
    ages = data.Age[(data.PclassName == pclass_name) & (data.Sex == sex)]
    return ages.quantile(0.5)

data["Age2"] = data.apply(lambda r: get_default_age(r.PclassName, r.Sex) if pd.isnull(r.Age) else r.Age, axis=1)
# 將填充年齡的位置標(biāo)記出來
data["AgeFill"] = data.apply(lambda r: 1 if pd.isnull(r.Age) else 0, axis=1)
# 將原本的年齡去除
data = data.drop(["Age"], axis=1)

2.2 船票價(jià)格

船票價(jià)格缺失值使用乘客所在等級的船票平均價(jià)格代替。

data["Fare"] = data.apply(lambda r: data.Fare[data.PclassName == r.PclassName].mean() if pd.isnull(r.Fare) else r.Fare, axis=1)

2.3 船艙

船艙缺失值太多加叁,強(qiáng)行補(bǔ)充數(shù)據(jù)可能會為模型引入不必要的影響倦沧,所以將缺失值用“unknown”代替。

data["Cabin"] = data.Cabin.apply(lambda x: "unknown" if pd.isnull(x) else x)

2.4 登船口

缺失值使用出現(xiàn)頻率最高的值代替它匕。

# 出現(xiàn)頻率最高的值是S
data["Embarked"] = data.Embarked.apply(lambda e: "S" if pd.isnull(e) else e)

3. one-hot編碼

數(shù)據(jù)集中包含object類型的數(shù)據(jù)展融,不能直接用來訓(xùn)練模型。one-hot編碼則是這種情況的常用解決方法豫柬,可以將object類型的數(shù)據(jù)轉(zhuǎn)變成數(shù)值類型的數(shù)據(jù)告希。

data = pd.get_dummies(data)

4. 建立模型

4.1 訓(xùn)練模型

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline

train_y = y
train_X = data[:len(train_y)]

my_pipeline = make_pipeline(RandomForestClassifier(max_depth=5,
                                                   n_estimators=120))
my_pipeline.fit(train_X, train_y)
Pipeline(steps=[('randomforestclassifier', RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=5, max_features='auto', max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            n_estimators=120, n_jobs=1, oob_score=False, random_state=None,
            verbose=0, warm_start=False))])

4.2 預(yù)測并輸出結(jié)果

predict_X = data[len(y):]
predict_y = my_pipeline.predict(predict_X)

ids = original_predict_data.PassengerId
submission = pd.DataFrame({
        "PassengerId": ids,
        "Survived": predict_y
    })
submission.to_csv('submission.csv', index=False)

最終結(jié)果:0.80382,排名前12%烧给。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燕偶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子创夜,更是在濱河造成了極大的恐慌杭跪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驰吓,死亡現(xiàn)場離奇詭異涧尿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)檬贰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門姑廉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翁涤,你說我怎么就攤上這事桥言。” “怎么了葵礼?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵号阿,是天一觀的道長。 經(jīng)常有香客問我鸳粉,道長扔涧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮枯夜,結(jié)果婚禮上弯汰,老公的妹妹穿的比我還像新娘。我一直安慰自己湖雹,他們只是感情好咏闪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摔吏,像睡著了一般鸽嫂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舔腾,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天溪胶,我揣著相機(jī)與錄音,去河邊找鬼稳诚。 笑死哗脖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扳还。 我是一名探鬼主播才避,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氨距!你這毒婦竟也來了桑逝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤俏让,失蹤者是張志新(化名)和其女友劉穎楞遏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體首昔,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寡喝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勒奇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片预鬓。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赊颠,靈堂內(nèi)的尸體忽然破棺而出格二,到底是詐尸還是另有隱情,我是刑警寧澤竣蹦,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布顶猜,位于F島的核電站,受9級特大地震影響痘括,放射性物質(zhì)發(fā)生泄漏驶兜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抄淑。 院中可真熱鬧,春花似錦驰后、人聲如沸肆资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郑原。三九已至,卻和暖如春夜涕,著一層夾襖步出監(jiān)牢的瞬間犯犁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工女器, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酸役,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓驾胆,卻偏偏與公主長得像涣澡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子丧诺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

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