標籤:

機器學習入門之泰坦尼克案例

這是機器學習入門筆記的第三篇,這裡用泰坦尼克號案例來過一遍機器學習的流程

一、提出問題

首先我們從kaggle上下載了泰坦尼克號案例的train.csv和test.csv兩個數據,

泰坦尼克號1912年4月從英國南安普頓出發,途徑法國,愛爾蘭在美國大西洋碰觸冰山沉沒,一部分人幸免於難,一部分人沒有生存,這個案例中就是要通過機器學習的演算法來預測一下test.csv中418人的生存狀況。

2、理解數據

首先導入數據,可以看到訓練數據集train.csv中有891行,12列數據,而測試數據集中有418行,11列數據;缺少的這一列數據正是我們要預測的生存狀況數據。

我們先看一下這12列的變數名、變數的含義及數據類型。

然後我們通過查看數據的基本信息發現

總數據有1309行,Age、Cabin、Embarked、Fare這四列數據中有缺失的情況,接下來的第三步就是要清洗數據,填補缺失值。

三、清洗數據

首先處理一下缺失的數據,如果缺失的數據是數字類型的,可以用平均數代替,如果是字元串類型的,可以用出現最多的數(眾數)來替代。

這時候我們再看一下數據就發現沒有缺失的情況了,只有在Survived這一列中需要我們預測生存的數據有空缺。

在做好這一步之後,數據還需要對一些列的字元串數據類型進行編碼,比如Sex性別的分類數據,需要進行one-hot編碼,方便機器學習識別。

這裡需要對性別、港口和姓名、船艙等級這些分類數據,進行重新編碼。

應用map函數可以對一列數據做同一個操作:

登船的港口有三個,分別是英國南安普頓、法國瑟堡、愛爾蘭昆士敦,分別用首字母S、C、Q表示。

接下來我們看一下名字這一列的數據

字元串格式:名,頭銜,姓,

我們需要從名字裡面獲取頭銜來判定是否對生存情況的影響。

通過定義一個函數:

第一步獲取name1剔除名字中逗號前面的名,

第二步剔除名字中冒號後面的姓,

第三步用strip函數剔除字元串頭尾指定的字元(默認為空格)然後返回中間的頭銜。

第四步應用函數,用一個表格型數據Df存放提取後的頭銜,

第五步講姓名中的頭銜字元串與定義頭銜類別的映射關係,再把頭銜進行one-hot編碼,

接著從座位號提取坐席類別,

用seat存放客艙號的信息

坐席類別就是座位號的首字母,比如C85,類別映射為首字母C,

用U代表不知道的數據。

使用lambda匿名函數提取Cabin中的首字母。

對船上每一個乘客的家庭成員數量進行一個統計。

分別將原始數據中的SibSp列和Parch中的數據相加,再加上被統計者自身。

最後就是將原始數據複製一份,刪除我們剛剛對其中重新編碼的列(Cabin、Name、Sex、Pclass、Embarked、Parch、SibSp;還有票的編號Ticket這一列沒有關係的數據。

最後合併的列包括了剛剛處理產生的新列名比如:da、family、seat、titleDf、pclass、embarked、sex。我們發現新的數據da有1309行,27列。

四、模型建立與評估

第一步:用數據框corr()得到相關係數矩陣,

第二步:講相關係數矩陣的生存情況的列提取出來,分別按照降序排列和升序排列

我們發現相關係數大於0的列中:頭銜、客艙等級、船票價格、船艙號都與生存狀況呈現正線性關係

在相關係數小於0的列中:頭銜、性別、客艙等級、客艙號與生存情況呈現負線性相關。

這些特徵其實與我們在數據清洗過程中處理的列非常相關,這裡我們直接採用上一步最後形成的新數據da

第三步:我們在原始訓練數據中有891行,選取特徵和標籤,然後對這個數據進行拆分訓練集和測試集,

第四步是導入演算法,訓練模型:

導入訓練數據的特徵train_X712條,包括性別,頭銜等,導入標籤train_y712條生存狀況,得到正確率0.87

用一個圖形表達一下這一步中間的邏輯過程:

第五步:方案實施

用機器學習模型,對預測數據集中的生存情況進行預測,

這裡用乘客的ID,數據框Df保存預測情況的值。

最後提交到Kaggle平台,查看排名。

推薦閱讀:

Learning Explanatory Rules from Noisy Data 閱讀筆記1
讓我們一起來學習CNTK吧
SRCNN 論文閱讀
Perceptual loss for Real time Style Transfer and Super-Resolution 論文閱讀
譜聚類的consistency

TAG:機器學習 |