Titanic倖存者預測
本文是對Kaggle上的入門項目--Titanic倖存者預測練習過程的回顧和總結。分兩個部分項目思路和實際操作。
第一部分:項目思路
以下是聽完課程後所做思路,下面代碼操作將根據該思維導圖的思路完成。
第二部分:實際操作
一、提出問題
該項目的目的就是預測什麼人能在Titanic船難中更易存活,問題很容易得到。這僅為初學者練習時提供,在實際工作中需要和業務部門深度溝通才能明確需要研究的具體問題。
在以上思維導圖特徵提取的分類中,很容易看到該項目屬於分類問題,符合邏輯回歸模型的特點,當然,這類問題還能用其他模型解。由於剛入門機器學習,以下將採用邏輯回歸模型來預測倖存者存活率。
二、理解數據
1、採集和導入數據
數據的採集是從Kaggle中Titanic項目的data中下載,有測試數據、訓練數據和提交格式三個文件。
導入數據:
先導入數據處理包
再導入數據集並查看大小,這裡用到read_csv()函數讀取文件,用到shape()函數查看大小。
從以上數據大小注意到訓練數據集比測試數據集多一個列,因為測試數據最後需要將預測結果提交Kaggle,故少了Survived列的數據。
2、合併數據和查看信息
- 合併數據以方便同時將兩組數據進行清洗,得到相同格式的數據集。此處用append()函數合併數據集。
- 查看前五行信息,看看有哪些變數(信息太多就不一一列印出來)。
- 查看數據類型列的描述統計信息,看看整體數據長什麼樣,是否有異常。
從上圖可看出Fare(船票)列最小值是0,顯然這是異常值。
- 為了查看每一列的數據類型和數據總數,看看是否有缺失數據,需要用到info()函數。
從上圖可知,總共有1309行數據,其中Age(年齡)、Cabin(船艙號)兩列的數據缺失最多,不包括Survived數據。
三、數據清洗
(一)數據預處理
本案例所有數據都需用到,不需選擇子集。重點處理缺失數據。
1、數據類型缺失值處理:用數據的平均值或中位數填充缺失值,此處用平均值填充。
2、字元串類型缺失值處理:用出現最頻繁的值填充。
- Embarked(登船港口)缺失兩條數據。
預設出發地點為「S」(Southanpton),途經地點1為「C」(Cherbourg),途經地點2為「Q」(Queenstown)。
3、缺失數據較多的列:用「U」填充。
Cabin(船艙號)缺失1014條數據
(二)特徵工程
特徵工程就是最大限度地從原始數據中提取特徵,以供機器學習演算法和模型使用。也是數據分析和機器學習的重點,特徵工程處理的好壞決定最後得出結果的準確性。
1、特徵提取
(1)數值類型:直接提取使用
(2)時間序列:轉換成單獨的年月日再分別提取
(3)分類數據:
- 二分類數據:用0和1替代;
- 超過兩種類別數據:用One-hot編碼方法,為每種類別生成新特徵,轉化為二分類問題。這樣做不用增加調倉工作,更方便。
下圖為案例中所有變數的數據類型
以下將對分類數據一一提取。
Sex(性別)
該數據類型為二分類數據,此處將性別值映射為數值,男對應數值1,女對應數值0。
用到map函數:對Series每個數據應用自定義的函數計算。
Embarked(登船港口)
由於登船港口有三個,故該數據需要用One-hot編碼轉化。
用get_dummies函數進行One-hot編碼。
Pclass(客艙等級)
從數據分類圖中可知,有三個客艙等級,設定頭等艙=1,二等艙=2,三等艙=3,同樣用get_dummies函數進行One-hot編碼。
Name(姓名)
該特徵是字元串分類數據,我們可以從姓名中提取頭銜特徵,用以預測生存率。
- 首先看看Name這一列的具體信息
可以看出,Name的格式為:名,頭銜. 姓
- 再用split()函數分離提取字元串,用strip()方法移除字元串頭尾指定的字元(默認為空格),用map函數對Serise中每個數據應用自定義的函數計算。
- 統計提取出的特徵頭銜有多少個
- 最後將各種頭銜字元串映射到頭銜類別後,進行One-hot編碼。各種頭銜字元串可以大致分為以下幾個類別
以下進行頭銜映射(可查詢英國頭銜關係得知)並用One-hot編碼轉化為二分類數據。
Cabin(客艙號)
客艙號的類別值是首字母,故可將客艙號映射為首字母,再進行One-hot編碼。
此處用到lambda匿名函數(相當於表達式,更簡單)和map函數。
Family(家庭大小)
Family包括SibSp(同代直系親屬數)、Parch(不同代直系親屬數)以及乘客自己。
將家庭分為大中小三種家庭,用lambda的條件語句判定。
2、特徵選擇
上一步已提取出所有特徵,但並不是所有特徵都有用,此處用各個特徵與生存情況的相關性來選擇特徵。
先將提取出的特徵替換原特徵
然後看看各個特徵與生存情況的相關係數
從以上選取相關係數較大的特徵才有分析的意義。
以上數據清洗工作全部完成。
四、構建模型
從提出問題部分已經判定該案例採用邏輯回歸模型,以下將進行數據分割、訓練模型和評估模型。
1、數據分割
從Kaggle上下載的test數據需要作為預測模型的數據,提交到Kaggle,所以將下載的train數據作為原始數據,分割成模型的訓練數據和測試數據。
準備原始數據和預測數據,並保證原始數據和預測數據的特徵相同。
然後對原始數據進行分割成訓練數據和測試數據。
此處用到split函數進行分割。
2、訓練模型
3、評估模型
分類問題,用score函數評估模型的正確率
正確率達到0.83,說明該模型還是挺可靠。
五、方案實施
用以上模型對預測數據集中的生存情況進行預測。
要注意的是,生成的預測值是浮點數,而Kaggle提交的格式要求是整型,故需要進行數據類型轉換。
最後保存結果,上傳Kaggle,得到排名
排名為TOP 56%
至此完成整個項目。
雖然最後得分和排名都不算高,但對於第一次完整的做完一個項目的我來說,還是很受鼓勵,後續隨著機器學習的加深,可繼續對模型進行優化,提高排名。
小結
- 這一關拖的時間太長,需要繼續和拖延症戰鬥。
- 思路理清楚後再根據課程一步步寫代碼,務必弄懂每一行代碼的意思和用途。
- 對於課程中沒有講到但邏輯上需要補充的,要補充完整,保證代碼的嚴謹。如在做此項目過程中對姓名頭銜的提取,一開始漏掉了統計提取出所有頭銜那一步,直接跳到映射頭銜關係。再如忘記將提取出的特徵替換原特徵,以至於在判斷線性關係那一步生成的還是原特徵的關係。
- 照著課程寫代碼做項目和自己寫仍然還有很大的差距,需要加強練習才能將所學吃透。
推薦閱讀:
※ML4-Brief Introduction of Deep Learning(李宏毅筆記)
※機器學習入門:邏輯回歸案例
※再薅谷歌羊毛:用谷歌GPU免費訓練你的機器學習模型
※第二章:機器學習對配電網健康指數分析