泰坦尼克號辛存者預測
上兩篇文章講了機器學習的回歸演算法和分類演算法中比較經典的簡單線性回歸和邏輯回歸,這次是對Kaggle上的入門項目--Titanic辛存者預測練習過程的回顧和總結。
本文為新手入門筆記,適用於剛入門的朋友參照閱讀練習,大神請繞道,謝謝!
本次練習的項目是kaggle平台的泰坦尼克號生存預測,Kaggle主要是為開發商和數據科學家提供舉辦機器學習的競賽平台,競賽上會有排名,這個排名一定程度上會刺激你的學習,同時幫助了解自己的水平。
一、提出問題
看過《泰坦尼克號》的沉船悲劇你一定知道,該項目的目的就是通過給出的數據,來預測哪些人可以在Titanic船難中存活下來,問題很容易得到。這是為初學者練習時提供的,在實際工作中需要和業務部門深度溝通才能明確需要研究的具體問題。
二、理解數據
1、獲取數據
獲取數據在Kaggle中泰坦尼克項目主界面的Data欄獲取,有測試數據、訓練數據和提交格式三個文件,如下圖:
2、理解數據
train.csv : 代表模型所需的原始數據,我們要從這個原始數據里拆分出測試數據和訓練數據。
test.csv : 是Kaggle給我們用來預測文件裡面的人的生存情況。
gender_submission: 提交預測情況的範本。
3、導入數據
從上面數據注意到訓練數據集比測試數據集多一列,預測數據裡面需要我們來預測人員的生存情況,所以沒有生存情況(Survived)這一列,因此訓練數據比測試數據多一列。
注意:在導入數據集的時候失敗的話,把存放數據集的文件移到notebook的文件夾中就可以解決。
4、合併數據和查看信息
合併數據要把測試數據和測試數據合併在一起,方便同時對這兩組數據集進行清洗。
此處用append()函數合併數據集。
full.head() 查看數據集前5行。
full.describe() 查看數據集的描述統計信息,看看數據是否有異常。
下面用 info() 函數來查看數據整體情況,看看是否有缺失數據:
從上圖看,總共有1309行,其中數據類型列:年齡(age)、票價(fare)兩列的數據缺失最多。字元串列:登船港口(embarked)、客艙號(cabin)里也有缺失數據,但不包括Survived數據。
三、數據清洗
1、數據預處理
1)缺失值處理,先處理數據類型的缺失,用數據的平均值或中位數填充缺失值,本次是用平均值填補:
2)字元串類型的缺失處理,用出現最頻繁的值填充。
- 處理登船港口(Embarked)的缺失,總數是1307,只缺失2條數據
上面的預設出發地點為「S」(Southanpton),途經地點1為「C」(Cherbourg),途經地點2為「Q"(Queenstown)。「S」的出現的頻率最高有914次,此我們用頻率最高的「S」來填補缺失值。
- 處理船艙號(Cabin)的缺失,由於由於這列的缺失數據比較多,用「U」填充,表示未知(unknown):
四、特徵工程
什麼是特徵工程?
特徵工程就是最大限度地從原始數據中提取特徵,以供機器學習演算法和模型使用。也是數據分析和機器學習的重點,特徵工程處理的好壞決定了最後得出模型的效果。
1.特徵提取
- 數值類型:可以直接提取使用
- 時間序列:轉換成單獨的年月日再分別提取
- 分類數據:對事物進行描述,無法用數據進行量化(例如0代表男,1代表女)
超過兩種類別數據:用One-hot編碼方法,如果原始數據中有N種(超過2種)類別,那麼我們將這一個特徵擴展為N種特徵,當原始數據是第i類別時,則這一類別擴展對應的第i個特徵為1,其他都擴展成特徵為0。
通過one-hot編碼後得到的新特徵我們稱之為虛擬變數/啞變數(dummy variables).
下圖為案例中所有變數的數據類型:
然後我們要對分類數據進行處理 。
- 性別(Sex):
先查看下
該數據類型為二分類數據,此處將性別值映射為數值,男對應數值1,女對應數值0。在這用map函數,對Series每個數據應用自定義的函數計算。
- 登船港口(Embarked)
用數值來代替類別,由於登船港口有3個類別,故使用one-hot編碼轉化,進行One-hot編碼的方法是用get_ dummies函數。
- 客艙等級(Pclass)
在上面我們知道有三個客艙等級,所以一樣用get_dummies函數進行One-hot編碼,使客艙等級的類別用數值來代替。
- 乘客姓名(Name)
該特徵是字元串分類數據,無直接類別但可從裡面提取出類別的字元串類型,我們可以從姓名中提取頭銜特徵,用以預測生存率。
首先來查看這一列的具體信息:
可以看出,Name的格式為:名,頭銜,姓,在這裡用split()函數方法拆分字元串,由於是對所有姓名這一列的數據進行操作,用strip()方法移除字元串頭尾指定的字元(默認為空格)。
查看提取出的特徵頭銜有哪些:
我們將上面的頭銜,歸納為以下幾種類別:
最後將各種頭銜字元串映射到頭銜類別後,進行One-hot編碼轉化為二分類數據。
#姓名中頭銜字元串與定義頭銜類別的映射關係title_mapDict = { "Capt": "Officer", "Col": "Officer", "Major": "Officer", "Jonkheer": "Royalty", "Don": "Royalty", "Sir" : "Royalty", "Dr": "Officer", "Rev": "Officer", "the Countess":"Royalty", "Dona": "Royalty", "Mme": "Mrs", "Mlle": "Miss", "Ms": "Mrs", "Mr" : "Mr", "Mrs" : "Mrs", "Miss" : "Miss", "Master" : "Master", "Lady" : "Royalty" }#map函數:對Series每個數據應用自定義的函數計算titleDf[Title] = titleDf[Title].map(title_mapDict)#使用get_dummies進行one-hot編碼titleDf = pd.get_dummies(titleDf[Title])titleDf.head()
- 客艙號(Cabin)
這可以看到客艙號的類別值是首字母,例如:C85類別映射為首字母C,故可將客艙號映射為首字母,再進行One-hot編碼。
此處用到 lambda 匿名函數使客艙號的類別值為首字母:
- 船票編碼(Ticket)
Ticket數據比較複雜,而且重複的比較多(家族的票是相同的),提取不到有用的特徵,所以這裡不提取這個特徵值。
好了,到這裡分類數據已全部處理完。
接下來看可以直接使用的數值數據:
數值數據: 乘客編號(PassengerId),用來統計有多少乘客,沒有使用價值。
年齡(Age),不需要進一步處理,可直接使用。
船票價格(Fare),不需要進一步不處理,可直接使用。
船上兄弟姐妹數/配偶數(SibSp),船上父母數/子女數(Parch)。
還剩兩個即SibSp和Parch,可以看到這兩屬於一個大類——家庭(Family)。
對於家庭,我們可以根據人數多少對家庭類別進行劃分,用lambda的條件語句判定:
小家庭Family_Single:家庭人數=1
中等家庭Family_Small: 2<=家庭人數<=4
大家庭Family_Large: 家庭人數>=5
家庭人數(Family)=同代直系親屬數(Parch)+不同帶直系親屬數(SibSp)+乘客自己
#創建數據框familyDf = pd.DataFrame()#家庭人數familyDf[ FamilySize ] = full[ Parch ] + full[ SibSp ] + 1#if 條件為真的時候返回if前面內容,否則返回0familyDf[ Family_Single ] = familyDf[ FamilySize ].map( lambda s : 1 if s == 1 else 0 )familyDf[ Family_Small ] = familyDf[ FamilySize ].map( lambda s : 1 if 2 <= s <= 4 else 0 )familyDf[ Family_Large ] = familyDf[ FamilySize ].map( lambda s : 1 if 5 <= s else 0 )familyDf.head()
至此,特徵提取全部完成。
2.特徵選擇
上面已提取出所有特徵,但並不是全部的特徵都有用,這裡我們使用相關係數來選擇特徵。
通過查看各特徵與Survived的相關性大小(有正負),我們需要選擇絕對值較大的R值對應的特徵,通過觀察,我們最後選擇了這幾個特徵作為模型的輸入。
至此數據清洗工作就全部完成。
五、構建模型
從提出問題部分已經判定該案例採用邏輯回歸模型,以下將進行數據分割、訓練模型和評估模型。
泰坦尼克號測試數據集因為是我們最後要提交給Kaggle的,裡面沒有生存情況的值,所以不能用於評估模型。
我們將Kaggle泰坦尼克號項目給我們的測試數據,叫做預測數據集(記為pred,英文單詞predict的縮寫)。也就是我們使用機器學習模型來對其生存情況就那些預測。
我們使用Kaggle泰坦尼克號項目給的訓練數據集,做為我們的原始數據集(記為source),
從這個原始數據集中拆分出訓練數據集和測試數據集。
1).建立原始數據集和預測數據集
2).對原始數據進行分割成訓練數據和測試數據
2.訓練模型
3.評估模型
正確率達到0.85,說明該模型還是挺可靠的。
六、方案實施
現在實際情況中,我們需要通過將分析結果寫成分析報告呈現給上級領導的,我們是在kaggle中做項目就需要把預測結果提交給kaggle。
提交的時候要注意生成的預測值是浮點數,但是Kaggle要求提交的結果是整型,所以要對數據類型進行轉換。
最後保存結果,上傳到Kaggle,可以看到排名。
至此完成整個項目,這雖然是個入門項目,但自覺也有相當的難度。
採取何種方法填充缺失值,如何提取想要的特徵值,都還是需要很多練習的。但對於第一次完整的做完一個項目的我來說,還是很受鼓勵的,以後會隨著機器學習的深入,可以繼續對模型進行優化,來提高排名。
推薦閱讀:
※使用sklearn來進行驗證碼識別
※Day6-《The Introduction of Statistical Learning》學習筆記
※全面理解word2vec
※如何六個月內學會深度學習
※【翻譯】Brian2高級指導_外部代碼交互
TAG:機器學習 |