機器學習入門之泰坦尼克案例
這是機器學習入門筆記的第三篇,這裡用泰坦尼克號案例來過一遍機器學習的流程
一、提出問題
首先我們從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:機器學習 |