鐵達尼號生存挑戰

人工智能遇見磐創 發佈 2020-02-28T02:43:45+00:00

submit= SubmitField我找到了一個來自WillKoehrsen的HTML模板,並在其上進行了構建。

Kaggle

Kaggle是一個數據科學家共享數據、交換思想和比賽的平台。人們通常認為Kaggle不適合初學者,或者它學習路線較為坎坷。

沒有錯。它們確實給那些像你我一樣剛剛起步的人帶來了挑戰。作為一個(初級)數據科學家,我忍不住要在Kaggle上搜索有趣的數據集來開始我的旅程。我了解了鐵達尼號數據集。

鐵達尼號

數據集包含鐵達尼號上乘客的信息。

我使用Python來可視化和理解更多關於數據集的信息。我用scikit-learn訓練了一組分類器來預測一個人的生存幾率。然後使用pickle保存模型,並使用Flask將其部署為本地主機上的Web應用程式。最後,我利用AWS來託管它。

代碼可以在GitHub上找到。

1.數據檢查

首先第一件事。我將數據導入了pandas的DataFrame。它包括乘客身份、存活時間、船票等級、姓名、性別、年齡、船上兄弟姐妹和配偶人數、船上父母和子女人數、船票號碼、乘客車費、客艙號碼和登船港,前5行數據如圖。

可以立即觀察到的是:-每行的PassengerID都是唯一的,-Survived是我們想要推斷的目標-Name可能沒用-Ticket是票務數據-如果Ticket有缺失就被標記為NaN。

為了簡單起見,我決定暫時放棄Ticket欄位。這些欄位可能包含有用的信息,但是需要大量的特徵工程來提取它們。我們先從最簡單的第一步開始。

另一方面,讓我們仔細看看缺失的數據。在變量Embarked和Fare中有一些缺失的條目。另一方面,約20%的乘客年齡沒有被記錄。這可能會給我們帶來一個問題,因為Age可能是數據集中的關鍵預測因素之一。「婦女和兒童優先」是當時的行為準則,報告顯示,他們確實是先得救的。Cabin大於77%的條目是缺失的,不大可能有幫助,我們先把它去掉。

2.數據可視化

Pair圖(下面沒有顯示)通常是我在數據可視化任務開始時的首選,因為它通常很有幫助,而且它代碼少。一行seaborn.pairplot()給你$n^2$的圖(準確的是$n(n+1)/2$不同的圖),其中n代表變量的數量。它讓你對每一對變量之間的關係,以及每一個變量本身的分布有一個基本的了解。讓我們研究一下不同的變量。

首先逐項檢驗目標變量與預測因子Survived的關係。通過seaborn.countplot(),我們發現大多數人屬於第三類,這並不奇怪;一般來說,他們生存的可能性更低。即使有了這個單一的預測器,在其他一切未知的情況下,我們也可以推斷,頭等艙乘客生還的可能性更大,而三等艙乘客生還的可能性不大。

與此同時,婦女和兒童更有可能生存下來,這與前面提到的「婦女和兒童優先」理論相一致。如果我們只檢查三個變量Pclass、Sex和Age,頭等艙的年輕女性乘客將是最有可能存活下來的。

然而,可能很難解釋密度圖seaborn.kdeplot()。對於「倖存」和「未倖存」這兩個類別,它們的跨度很廣,而「未倖存」類別的平均值和方差較小。值得注意的是,在「倖存」類的分配中有一個有趣的尾部,即三個人以每人512美元的價格獲得頭等艙船票。他們都是在瑟堡港上船的,都活了下來。

另一方面,embarkation似乎也在決定誰能活下來方面發揮了作用。大多數人在南安普頓港上船——這是旅程的第一站,他們的存活率最低。也許他們被分配到離出口更遠的船艙里,或者花更多的時間在遊輪上可以讓人們放鬆或疲勞。或者它只是由第三個變量間接造成的——比如在第一個港口登機的女性/兒童/頭等艙乘客更少。還需要進一步的調查。

如果你喜歡錶而不是圖,我們還可以通過pandas.DataFrame.groupby()可視化數據,並對每個類取平均值。然而,我不認為下面的Parch表中有一個清晰的模式。

由seaborn.heatmap()生成的相關矩陣說明了任意兩個變量之間的相關強度。如你所見,Sex與Survived的相關性最高,而Fare和Pclass高度相關。SibSp和Parch在預測一個人的生存機會上似乎沒有起到很大的作用,儘管我們的直覺告訴我們不是這樣的。

3.缺失的數據填充

我們在之前的數據檢查中發現有很多數據項丟失。例如,我們似乎不知道60歲的托馬斯·斯托里(ThomasStorey)花了多少錢買票。直覺告訴我們,船票票價在很大程度上取決於船票等級和登機港,我們可以用上面的相關矩陣進行交叉檢驗。因此,我們只取南安普頓三等艙票價的平均值。這只是一個有根據的猜測,可能是錯誤的,但它已經足夠好了。記住,要獲得無噪聲的數據是不可能的,機器學習模型應該對噪聲具有魯棒性。

還有兩個女人,我們不知道她們上了船。票的等級與票價密切相關。由於她們兩人都花了80美元買了頭等艙的座位,我猜是在瑟堡(圖中的C)。

如果在一個特定的變量中只有很少的缺失項,我們可以使用上面的技巧,通過取最大似然值來進行有根據的猜測。儘管如此,如果我們丟失的數據更多的話,做同樣的事情是非常危險的,比如Age缺失了20%。

我們目前能猜測的已經猜測完了。由於我們丟棄了Cabin,並且填入了其他缺失的條目,所以我們可以利用所有其他變量,通過隨機森林回歸變量來推斷缺失的Age。80%的「訓練」數據可以推斷出剩下的20%。

4.特徵工程

雖然其中大多數的頭銜是「先生」、「夫人」和「小姐」,但也有一些不太常見的頭銜——「博士」、「牧師」、「上校」等,其中一些只出現過一次,如「女士」、「多納」、「上校」等。他們罕見的頭銜對模型訓練沒什麼幫助。為了找到模式,你需要數據。讓我們把那些相對罕見的標題歸類為「罕見」。

分類數據在模型訓練之前需要格外小心。分類器無法處理字符串輸入,如「Mr」、「Southampton」等。雖然我們可以將它們映射到整數,比如('Mr'、'Miss'、'Mrs'、'Rare')→(1,2,3,4),但是不應該有頭銜等級的概念。當醫生並不意味著你就高人一等。為了不誤導機器並意外地構造出一個性別歧視的人工智慧,我們應該對它們進行一次one-hot編碼。他們成為:

((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1))

另一方面,我決定增加兩個變量——FamilySize和IsAlone。加上FamilySize=SibSp+Parch+1更有意義,因為整個家庭都會在遊輪上待在一起。此外,孤獨可能是一個關鍵因素。你可能更容易做出魯莽的決定,或者你可以在不照顧家人的情況下在災難中更加靈活。通過一次添加一個變量,我發現它們在模型中的存在提高了整體的可預測性。

5.模型評估

我嘗試了我所知道的最流行的分類器——隨機森林、支持向量機、KNN、AdaBoost等等。

XGBoost最終以87%的測試精度脫穎而出。為了提高分類器的魯棒性,我們訓練了一組不同性質的分類器,並通過多數投票得到最終結果。

最後,我把它提交給Kaggle,獲得了80%的準確率。不壞。總有改進的餘地。

例如,在Cabin和Ticket中肯定隱藏了一些有用的信息,但是為了簡單起見,我們放棄了它們。我們還可以創建更多的特徵

但我暫時先不談這個。

6.部署為Web應用程式

在Python中,Flask是一個易於使用的web框架。

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "<h1>Write something here.</h1>"
app.run(host='0.0.0.0', port=60000)

你可以在本地主機中瀏覽它。

我們還需要什麼?我們希望人們填寫一個表單來收集所需的數據並將其傳遞給機器學習模型。模型將有一個輸出,我們將把用戶重定向到該頁面。

我們將使用WTForms在Python中構建一個表單,單個表單由一個類定義,它看起來像下面這樣:

from wtforms import Form, TextField, validators, SubmitField,  DecimalField, IntegerField, SelectField
class ReusableForm(Form):
sex = SelectField('Sex:',choices=[('1', 'Male'), ('0', 'Female') ],
                   validators=[validators.InputRequired()])
fare = DecimalField('Passenger Fare:',default=33,places=1,
                     validators=[validators.InputRequired(),
                                 validators.NumberRange(min=0,
                                                        max=512,
                                                          
                         message='Fare must be between 0 and 512')])
submit = SubmitField('Predict')


我找到了一個來自WillKoehrsen的HTML模板,並在其上進行了構建。

7.雲託管

現在網頁可以通過我的本地主機查看,一切正常。最後一步是在線託管。現在有三種主要的雲託管服務——AWS、GCP和Azure。AWS是目前最受歡迎的,所以我選擇了12個月的免費服務。

我使用我的私有密鑰連接到Linux伺服器實例,將我的存儲庫遷移到伺服器,運行我的腳本,它工作了!

對我來說不太好…

關鍵字: