邏輯回歸分析之泰坦尼克號生存率預測

生活中有很多複雜的事情是無法靠我們人類本身大腦思考來進行預測,所以我們需要藉助數學模型來幫助我們分析和預測一些事情的發生情況。國際著名的數據分析kaggle平台中的一個典型案例——「泰坦尼克號生存率預測」是一個源起於著名的泰坦尼克號沉船事件,眾所周知,泰坦尼克號的沉沒是人類航海史上一次非常嚴重的失事事件,大約有三分之二的人葬身大海,而kaggle平台給出的問題就是研究什麼樣的人在泰坦尼克號沉沒時更容易存活。這就需要我們運用數據分析的知識來對不同種類型的人進行生存率預測。而在預測之前我們首先要搞明白數據分析的過程,也就是通常該走什麼套路,見下圖:

下圖就是進行生存率預測的6大基本步驟,通過這6步我們就可以對泰坦尼克號上的乘客生存情況進行一個基本的預測,當然由於這6步僅為數據分析中的最基本的步驟,不涉及到一些優化的操作,因此預測的結果的精度也就會相應差一些。不過目前我們小白最主要是學習思考去預測問題,也就是每一步該如何去操作,結果並不需要過多關注,因為機器學習和數據分析對經驗和技巧依賴也是很嚴重的。

下面就從第一步開始——提出問題,上文已經提到:什麼樣的人在泰坦尼克號中最容易存活?接下來我們就帶著這個問題來理解一下數據。

首先我們需要先獲取數據,這裡直接到kaggle網站中的泰坦尼克號案例頁面中下載我們要進行分析的數據如下所示:

每個案例的data界面都有如下數據,包括訓練數據,用於訓練模型;測試數據,用於測試模型的準確程度;提交結果案例,用於參考最終提交結果的格式,若格式不正確就不會出現提交結果的排名情況。

獲取數據後需要將數據導入到程序代碼中,如下圖所示,這裡需要注意的是測試數據和訓練數據最好放在英文命名的文件夾中,否則可能會導入數據失敗。

接下來我們執行套路中的第三步——「數據清洗」。由於我們獲得的不論是測試數據還是訓練數據都是原始數據,因此都可能存在一些問題,所以都得進行數據清洗,這裡我們將訓練數據和測試數據合併後進行清洗,避免重複清洗,提高數據處理效率。合併數據代碼如下所示:

我們使用full.head()命令來查看數據集信息,執行結果如下圖所示:

這裡只是羅列了所有數據的情況,接下來我們使用describe()命令來對我們獲取的數據進行簡單的統計顯示,結果如下:

從這個簡單的統計結果中我們可以了解到比較多的信息,包括各種乘客特徵的總數、均值、標準差、四分位數、最大值。從這個描述統計表中我們可以看到一些數據存在問題,比如年齡(age)缺失,船票(Fare)有0值存在等信息,這裡我們就需要在數據清洗步驟中對這些問題進行處理。使用describe()方法我們只能查看數值類型的數據情況,對於字元串類型數據的情況我們無從得知,所以我們還需採用其他的方法來進一步查看數據。這裡使用full.info()方法,我們可以進一步查看缺失值的狀態,如下圖:

這裡缺失值一目了然,棕色區域的四個特徵值都存在不同程度的數據缺失,我們需要對這四項乘客特徵進行處理。

下面就來執行數據清洗工作,首先我們對數據進行預處理,按照下圖所示的套路對數據進行操作即可:

上面的步驟並不需要完全執行,需要根據數據的具體特點來進行操作。比如本案例數據我們只需要進行數據缺失值和異常值得處理即可。這裡由於年齡值缺失,所以我們選擇一種最簡單的辦法——「均值填充」來補全缺失的年齡值,具體實施代碼如下圖所示:

下面我們來對字元串的缺失值進行處理,我們從上文中可以看到登船港口(Embarked)僅缺失兩個,這裡我們首先統計各個登船港口出現的次數,然後選擇出現次數最多的港口名稱來填充,具體執行代碼如下:

我們可以看到S港口出現的次數要遠高於其他港口出現的次數,所以我們選擇S來進行填充缺失值:

此外船艙號(Cabin)是我們發現只有295個值,嚴重缺失,這裡我們採用一下代碼來採用U代表缺失值。

執行上述操作後我們再次執行head和info命令來查看數據的完整性,結果如下:

下面執行數據清洗的第二步——特徵工程,特徵工程是數據清洗中一個非常重要的步驟,業內廣為流傳的一個經驗是:數據和特徵決定了機器學習的上限,模型和演算法只是來逼近這個上限而已。所以數據的特徵篩選處理可以說對於整個的數據分析都是非常重要的,它會直接影響我們最終的預測結果。

特徵工程包括三點:特徵提取、特徵選擇、特徵降維。特徵提取我們需要根據數據的不同特徵來選用不同方法進行提取。對於數值型特徵,直接使用即可;對於時間序列,也就是我們獲得的時間信息,我們需要將其轉換為年月日的格式;對於分類數據,我們需要對每個類別採用數字進行編碼使得計算機通過讀取數值即可對應出相應的類別,即one-hot編碼,比如性別、顏色等特徵。

One-hot編碼這裡我們需要在進一步深入理解一下,它的編碼規則是什麼呢?簡單來說當特徵a有n種類別時候,我們是無法通過數值來對每一種類別進行標註的,這時我們需要將a拆分成n個類別,若對應的第i個類別存在我們就將其數值設為1,其餘類別都設為0。這樣通過這種數值串的形式我們就可以將a的每一種類別進行數值層面的區分了。這個one-hot編碼是我們虛擬設置的,所以也可以稱為虛擬變數或啞變數,具體的命名例子可以參見下圖:

下面我們來對上文中info()方法列表中的特徵進行提取,主要是對於非數值特徵進行數值化。首先是對性別進行重新數值分類,將男性定義為1,女性定義為0。採用map函數即可對性別這一列數據性質數值化,具體如下:

接下來對登船港口進行one-hot編碼,採用get_dummies函數來執行重新賦值,其中函數中的兩個變數分別為選取編碼的列和編碼後的命名前綴,具體如下圖:

客艙等級one-hot編碼如下:

此外還有字元串的分類情況,我們需要分析哪些字元串格式的乘客特徵是否對預測結果會有影響,這就需要通過提取乘客的頭銜來進行分析,我們首先通過定義函數來提取乘客姓名中的頭銜,具體代碼執行如下:

因為乘客姓名中有很多頭銜,這裡我們將所有頭銜分成下面六大類,根據提取出來的頭銜來按照下面的映射規則映射到六大類中,然後將六大類頭銜進行one-hot編碼,這樣我們就完成了對乘客頭銜的數值化過程。具體執行代碼如下:

下面對船艙號(Cabin)進行one-hot編碼,這裡使用了lambda函數來獲取船艙號的首字母,然後對不同首字母進行one-hot編碼,具體如下:

此外還需對家庭成員多少進行命名分類並one-hot編碼,具體如下:

我們使用concat命令來將one-hot編碼後的數值加入到訓練數據中去,如下:

以上就是數據特徵工程的全部過程,特徵都選取後我們需要查看哪些特徵與生存的關係最大,這裡我們計算相關性矩陣來進行篩選,並將與生存相關的特徵按照相關性大小進行排列,具體如下:

我們可以獲得正負線性相關的大小順序,具體如下:

然後我們選取相關性較大的特徵進行模型訓練,具體如下:

下面我們需要將原始數據集中的前891行數據提取出來,具體如下:

我們還需要對原始的891行數據集進行拆分,拆分出訓練數據集和測試數據集:

採用的split函數進行拆分,函數中包含三部分,特徵、標籤、訓練數據佔比。

接下來就是訓練模型了,直接上三行代碼即可:

訓練模型有兩個重要函數,包括LogisticRegression()(採用邏輯回歸演算法進行訓練),fit()進行模型訓練。

我們可以對我們的模型進行結果評估,具體如下:

根據特徵進行預測可以看到預測的正確率為84%,結果還算可以。

以上就是機器學習來進行泰坦尼克號生存預測的全部套路了,我們根據獲得的模型來對kaggle給的測試數據來進行預測並提交,提交的具體代碼如下:

到此為止,雖然整個機器學習的過程比較繁瑣,但是我們仍需保持耐心進行練習,相信不久就會對整個過程輕車熟路了。

推薦閱讀:

當excel不夠用時,如何利用Access進行數據分析?
django系列七:用戶註冊
大數據有哪些工作崗位,日常工作內容是什麼,需要掌握哪些工具和技能
先給自己定個小目標———數據分析學習入門

TAG:預測 | 數據分析 |