1. 程式人生 > >kaggle泰坦尼克 Kaggle泰坦尼克預測(完整分析)

kaggle泰坦尼克 Kaggle泰坦尼克預測(完整分析)

Kaggle泰坦尼克預測(完整分析)

2017年06月26日 15:53:26 閱讀數:10313

1.引言

先說一句,年末雙十一什麼的一來,真是非(mang)常(cheng)歡(gou)樂(le)!然後push自己抽出時間來寫這篇blog的原因也非常簡單:

  • 寫完前兩篇邏輯迴歸的介紹和各個角度理解之後,我們討論群(戳我入群)的小夥伴們紛紛表示『好像很高階的樣紙,but 然並卵 啊!你們倒是拿點實際資料來給我們看看,這玩意兒 有!什!麼!用!啊!』
  • talk is cheap, show me the code!
  • no example say a jb!

OK,OK,這就來了咯,同學們彆著急,我們先找個簡單的實際例子,來看看,所謂的資料探勘或者機器學習實際應用到底是怎麼樣一個過程。

『喂,那幾個說要看大資料上機器學習應用的,對,就是說你們!彆著急好麼,我們之後拉點大一點實際資料用liblinear或者spark,MLlib跑給你們看,行不行?咱們先拿個例項入入門嘛』

好了,我是一個嚴肅的技術研究和分享者,咳咳,不能廢話了,各位同學繼續往下看吧!

2.背景

2.1 關於Kaggle

  • 我是Kaggle地址,翻我牌子
  • 親,逼格這麼高的地方,你一定聽過對不對?是!這就是那個無數『資料探勘先驅』們,在回答”槍我有了,哪能找到靶子練練手啊?”時候的答案!
  • 這是一個要資料有資料,要實際應用場景有場景,要一起在資料探勘領域high得不要不要的小夥伴就有小夥伴的地方啊!!!

艾瑪,逗逼模式開太猛了。恩,不鬧,不鬧,說正事,Kaggle是一個數據分析建模的應用競賽平臺,有點類似KDD-CUP(國際知識發現和資料探勘競賽),企業或者研究者可以將問題背景、資料、期望指標等釋出到Kaggle上,以競賽的形式向廣大的資料科學家徵集解決方案。而熱愛數(dong)據(shou)挖(zhe)掘(teng)的小夥伴們可以下載/分析資料,使用統計/機器學習/資料探勘等知識,建立演算法模型,得出結果並提交,排名top的可能會有獎金哦!

2.2 關於泰坦尼克號之災

  • 帶大家去該問題頁面溜達一圈吧

    • 下面是問題背景頁 
      泰坦尼克號問題背景頁
    • 下面是可下載Data的頁面 
      Data頁面
    • 下面是小夥伴們最愛的forum頁面,你會看到各種神級人物厲(qi)害(pa)的資料處理/建模想法,你會直視『世界真奇妙』。 
      論壇頁面
  • 泰坦尼克號問題之背景

    • 就是那個大家都熟悉的『Jack and Rose』的故事,豪華遊艇倒了,大家都驚恐逃生,可是救生艇的數量有限,無法人人都有,副船長髮話了『lady and kid first!』,所以是否獲救其實並非隨機,而是基於一些背景有rank先後的

    • 訓練和測試資料是一些乘客的個人資訊以及存活狀況,要嘗試根據它生成合適的模型並預測其他人的存活狀況

    • 對,這是一個二分類問題,是我們之前討論的logistic regression所能處理的範疇。

3.說明

接觸過Kaggle的同學們可能知道這個問題,也可能知道RandomForest和SVM等等演算法,甚至還對多個模型做過融合,取得過非常好的結果,那maybe這篇文章並不是針對你的,你可以自行略過。

我們因為之前只介紹了Logistic Regression這一種分類演算法。所以本次的問題解決過程和優化思路,都集中在這種演算法上。其餘的方法可能我們之後的文章裡會提到。

說點個人的觀點。不一定正確。 
『解決一個問題的方法和思路不止一種』 
『沒有所謂的機器學習演算法優劣,也沒有絕對高效能的機器學習演算法,只有在特定的場景、資料和特徵下更合適的機器學習演算法。』

4.怎麼做?

手把手教程馬上就來,先來兩條我看到的,覺得很重要的經驗。

  1. 印象中Andrew Ng老師似乎在coursera上說過,應用機器學習,千萬不要一上來就試圖做到完美,先擼一個baseline的model出來,再進行後續的分析步驟,一步步提高,所謂後續步驟可能包括『分析model現在的狀態(欠/過擬合),分析我們使用的feature的作用大小,進行feature selection,以及我們模型下的bad case和產生的原因』等等。

  2. Kaggle上的大神們,也分享過一些experience,說幾條我記得的哈:

    • 『對資料的認識太重要了!』
    • 『資料中的特殊點/離群點的分析和處理太重要了!』
    • 『特徵工程(feature engineering)太重要了!在很多Kaggle的場景下,甚至比model本身還要重要』
    • 『要做模型融合(model ensemble)啊啊啊!』

更多的經驗分享請加討論群,具體方式請聯絡作者,或者參見《“ML學分計劃”說明書》

5.初探資料

先看看我們的資料,長什麼樣吧。在Data下我們train.csv和test.csv兩個檔案,分別存著官方給的訓練和測試資料。

  1. import pandas as pd #資料分析
  2. import numpy as np #科學計算
  3. from pandas import Series,DataFrame
  4. data_train = pd.read_csv( "/Users/Hanxiaoyang/Titanic_data/Train.csv")
  5. data_train

pandas是常用的Python資料處理包,把csv檔案讀入成dataframe各式,我們在ipython notebook中,看到data_train如下所示:

訓練資料

這就是典型的dataframe格式,如果你沒接觸過這種格式,完全沒有關係,你就把它想象成Excel裡面的列好了。 
我們看到,總共有12列,其中Survived欄位表示的是該乘客是否獲救,其餘都是乘客的個人資訊,包括:

  • PassengerId => 乘客ID
  • Pclass => 乘客等級(1/2/3等艙位)
  • Name => 乘客姓名
  • Sex => 性別
  • Age => 年齡
  • SibSp => 堂兄弟/妹個數
  • Parch => 父母與小孩個數
  • Ticket => 船票資訊
  • Fare => 票價
  • Cabin => 客艙
  • Embarked => 登船港口

逐條往下看,要看完這麼多條,眼睛都有一種要瞎的趕腳。好吧,我們讓dataframe自己告訴我們一些資訊,如下所示:

data_train.info()
  • 1
  • 1

看到了如下的資訊: 
資料資訊

上面的資料說啥了?它告訴我們,訓練資料中總共有891名乘客,但是很不幸,我們有些屬性的資料不全,比如說:

  • Age(年齡)屬性只有714名乘客有記錄
  • Cabin(客艙)更是隻有204名乘客是已知的

似乎資訊略少啊,想再瞄一眼具體資料數值情況呢?恩,我們用下列的方法,得到數值型資料的一些分佈(因為有些屬性,比如姓名,是文字型;而另外一些屬性,比如登船港口,是類目型。這些我們用下面的函式是看不到的):

數值型資料基本資訊

我們從上面看到更進一步的什麼資訊呢? 
mean欄位告訴我們,大概0.383838的人最後獲救了,2/3等艙的人數比1等艙要多,平均乘客年齡大概是29.7歲(計算這個時候會略掉無記錄的)等等…

6.資料初步分析

每個乘客都這麼多屬性,那我們咋知道哪些屬性更有用,而又應該怎麼用它們啊?說實話這會兒我也不知道,但我們記得前面提到過

  • 『對資料的認識太重要了!』
  • 『對資料的認識太重要了!』
  • 『對資料的認識太重要了!』

重要的事情說三遍,恩,說完了。僅僅最上面的對資料瞭解,依舊無法給我們提供想法和思路。我們再深入一點來看看我們的資料,看看每個/多個 屬性和最後的Survived之間有著什麼樣的關係呢。

6.1 乘客各屬性分佈

腦容量太有限了…數值看花眼了。我們還是統計統計,畫些圖來看看屬性和結果之間的關係好了,程式碼如下:

  1. import matplotlib.pyplot as plt
  2. fig = plt.figure()
  3. fig.set(alpha= 0.2) # 設定圖表顏色alpha引數
  4. plt.subplot2grid(( 2, 3),( 0, 0)) # 在一張大圖裡分列幾個小圖
  5. data_train.Survived.value_counts().plot(kind= 'bar') # 柱狀圖
  6. plt.title( u"獲救情況 (1為獲救)") # 標題
  7. plt.ylabel( u"人數")
  8. plt.subplot2grid(( 2, 3),( 0, 1))
  9. data_train.Pclass.value_counts().plot(kind= "bar")
  10. plt.ylabel( u"人數")
  11. plt.title( u"乘客等級分佈")
  12. plt.subplot2grid(( 2, 3),( 0, 2))
  13. plt.scatter(data_train.Survived, data_train.Age)
  14. plt.ylabel( u"年齡") # 設定縱座標名稱
  15. plt.grid(b= True, which= 'major', axis= 'y')
  16. plt.title( u"按年齡看獲救分佈 (1為獲救)")
  17. plt.subplot2grid(( 2, 3),( 1, 0), colspan= 2)
  18. data_train.Age[data_train.Pclass == 1].plot(kind= 'kde')
  19. data_train.Age[data_train.Pclass == 2].plot(kind= 'kde')
  20. data_train.Age[data_train.Pclass == 3].plot(kind= 'kde')
  21. plt.xlabel( u"年齡") # plots an axis lable
  22. plt.ylabel( u"密度")
  23. plt.title( u"各等級的乘客年齡分佈")
  24. plt.legend(( u'頭等艙', u'2等艙', u'3等艙'),loc= 'best') # sets our legend for our graph.
  25. plt.subplot2grid(( 2, 3),( 1, 2))
  26. data_train.Embarked.value_counts().plot(kind= 'bar')
  27. plt.title( u"各登船口岸上船人數")
  28. plt.ylabel( u"人數")
  29. plt.show()

資料基本資訊圖示

bingo,圖還是比數字好看多了。所以我們在圖上可以看出來,被救的人300多點,不到半數;3等艙乘客灰常多;遇難和獲救的人年齡似乎跨度都很廣;3個不同的艙年齡總體趨勢似乎也一致,2/3等艙乘客20歲多點的人最多,1等艙40歲左右的最多(→_→似乎符合財富和年齡的分配哈,咳咳,別理我,我瞎扯的);登船港口人數按照S、C、Q遞減,而且S遠多於另外倆港口。

這個時候我們可能會有一些想法了:

  • 不同艙位/乘客等級可能和財富/地位有關係,最後獲救概率可能會不一樣
  • 年齡對獲救概率也一定是有影響的,畢竟前面說了,副船長還說『小孩和女士先走』呢
  • 和登船港口是不是有關係呢?也許登船港口不同,人的出身地位不同?

口說無憑,空想無益。老老實實再來統計統計,看看這些屬性值的統計分佈吧。

6.2 屬性與獲救結果的關聯統計

  1. #看看各乘客等級的獲救情況
  2. fig = plt.figure()
  3. fig.set(alpha= 0.2) # 設定圖表顏色alpha引數
  4. Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
  5. Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
  6. df=pd.DataFrame({ u'獲救':Survived_1, u'未獲救':Survived_0})
  7. df.plot(kind= 'bar', stacked= True)
  8. plt.title( u"各乘客等級的獲救情況")
  9. plt.xlabel( u"乘客等級")
  10. plt.ylabel( u"人數")
  11. plt.show()

各乘客等級的獲救情況

嘖嘖,果然,錢和地位對艙位有影響,進而對獲救的可能性也有影響啊←_← 
咳咳,跑題了,我想說的是,明顯等級為1的乘客,獲救的概率高很多。恩,這個一定是影響最後獲救結果的一個特徵。

  1. #看看各性別的獲救情況
  2. fig = plt.figure()
  3. fig.set(alpha= 0.2) # 設定圖表顏色alpha引數
  4. Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
  5. Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
  6. df=pd.DataFrame({ u'男性':Survived_m, u'女性':Survived_f})
  7. df.plot(kind= 'bar', stacked= True)
  8. plt.title( u"按性別看獲救情況")
  9. plt.xlabel( u"性別")
  10. plt.ylabel( u"人數")
  11. plt.show()

各乘客等級的獲救情況

歪果盆友果然很尊重lady,lady first踐行得不錯。性別無疑也要作為重要特徵加入最後的模型之中。

再來個詳細版的好了。

  1. #然後我們再來看看各種艙級別情況下各性別的獲救情況
  2. fig=plt.figure()
  3. fig.set(alpha= 0.65) # 設定影象透明度,無所謂
  4. plt.title( u"根據艙等級和性別的獲救情況")
  5. ax1=fig.add_subplot( 141)
  6. data_train.Survived[data_train.Sex == 'female'][data_train.Pclass != 3].value_counts().plot(kind= 'bar', label= "female highclass", color= '#FA2479')
  7. ax1.set_xticklabels([ u"獲救", u"未獲救"], rotation= 0)
  8. ax1.legend([ u"女性/高階艙"], loc= 'best')
  9. ax2=fig.add_subplot( 142, sharey=ax1)
  10. data_train.Survived[data_train.Sex == 'female'][data_train.Pclass == 3].value_counts().plot(kind= 'bar', label= 'female, low class', color= 'pink')
  11. ax2.set_xticklabels([ u"未獲救", u"獲救"], rotation= 0)
  12. plt.legend([ u"女性/低階艙"], loc= 'best')
  13. ax3=fig.add_subplot( 143, sharey=ax1)
  14. data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().plot(kind= 'bar', label= 'male, high class',color= 'lightblue')
  15. ax3.set_xticklabels([ u"未獲救", u"獲救"], rotation= 0)
  16. plt.legend([ u"男性/高階艙"], loc= 'best')
  17. ax4=fig.add_subplot( 144, sharey=ax1)
  18. data_train.Survived[data_train.Sex == 'male'][data_train.Pclass == 3].value_counts().plot(kind= 'bar', label= 'male low class', color= 'steelblue')
  19. ax4.set_xticklabels([ u"未獲救", u"獲救"], rotation= 0)
  20. plt.legend([ u"男性/低階艙"], loc= 'best')
  21. plt.show()

各性別和艙位的獲救情況

恩,堅定了之前的判斷。

我們看看各登船港口的獲救情況。

  1. fig = plt.figure()
  2. fig.set(alpha= 0.2) # 設定圖表顏色alpha引數
  3. Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
  4. Survived_1 = data_train.Embarked[data_train.Survived == 1].value_counts()
  5. df=pd.DataFrame({ u'獲救':Survived_1, u'未獲救':Survived_0})
  6. df.plot(kind= 'bar', stacked= True)
  7. plt.title( u"各登入港口乘客的獲救情況")
  8. plt.xlabel( u"登入港口")
  9. plt.ylabel( u"人數")
  10. 相關推薦

    kaggle Kaggle預測(完整分析)

    Kaggle泰坦尼克預測(完整分析) 2017年06月26日 15:53:26 閱讀數:10313 1.引言 先說一句,年末雙十一什麼的一來,真是非(mang)常(cheng)歡(gou)樂(le)!然後push自己抽

    Kaggle預測(完整分析)

    1.引言 先說一句,年末雙十一什麼的一來,真是非(mang)常(cheng)歡(gou)樂(le)!然後push自己抽出時間來寫這篇blog的原因也非常簡單: 寫完前兩篇邏輯迴歸的介紹和各個角度理解之後,我們討論群(戳我入群)的小夥伴們紛紛表示『好像很高階的樣紙,but 然

    Kaggle競賽(1)——Tantic之災

    1.引言 先說一句,年末雙十一什麼的一來,真是非(mang)常(cheng)歡(gou)樂(le)!然後push自己抽出時間來寫這篇blog的原因也非常簡單: 寫完前兩篇邏輯迴歸的介紹和各個角度理解之後,我們討論群(戳我入群)的小夥伴們紛紛表示『好像很高階的樣紙,but 然並卵 啊!你們倒是拿點

    Python機器學習入門1.8《使用整合模型預測號乘客的生還情況預測

    # -*- coding: utf-8 -*- """ Created on Fri Oct 19 08:11:26 2018 @author: asus """ import pandas as pd titanic=pd.read_csv('http://biosta

    詳解斯納點及斯納樹及模版歸納總結

    什麽是 com 需要 spa hub 等於 pac 其中 給定 ①什麽是斯坦納點? 假設原來已經給定了個點,庫朗等指出需要引進的點數至多為,此種點稱為斯坦納點。過每一斯坦納點,至多有三條邊通過。若為三條邊,則它們兩兩交成120°角;若為兩條邊,則此斯坦納點必為某一已

    NLP中kaggle比賽例項《每日新聞對股票市場的預測》進階版

    這篇比基礎版加了什麼呢?基礎版是直接將文字放入TF-IDF,雖然簡單方便,但還是不夠嚴謹,可以對資料進行進一步處理,如先小寫化,將文字分成曉得tokens,接著刪減如the,a,that等停止詞,用正則

    kaggle練習項目—乘客生還預測

    sans 練習 missing 中文 ces 大寫 param show ont 一、問題復述   泰坦尼克號是一艘英國皇家郵輪,在當時是全世界最大的海上船舶。1912年4月,該郵輪在首航中碰撞上冰山後沈沒。造成船上2224名人員中1514人罹難。   現在根據乘客的船艙等

    ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測號生存人員

    ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kaggle資料集預測泰坦尼克號生存人員 實驗資料 設計思路   實現程式碼(部分程式碼) /** js程式碼實現SVM演算法 */ //ML之SVM:基於Js程式碼利用SVM演算法的實現根據Kagg

    機器學習 (十七)kaggle競賽之號專案實戰-2

    導航        想寫這篇部落格的由衷是做完幾個專案,有時對於圖的畫法和模型融合演算法原理理解還很膚淺,特此加深一下印象。 內容概覽 圖 pandas、matplotlib、seaborn 餅圖 直方圖

    機器學習 (八)kaggle競賽之號專案實戰-1

    引言        機器學習演算法都是為專案為資料服務的,某一個演算法都有它自己的適用範圍,以及優勢與劣勢,研究演算法由於平日的日常操練,那麼用它去做專案就如同上戰場殺敵一樣,去發揮它的價值,kaggle就是這樣一個刷怪升級

    kaggle 預測 案例

    kaggle 泰坦尼克預測準確率79%。 #!/usr/bin/Python # -*- coding: utf-8 -*- # This Python 3 environment comes with many helpful analytics libraries installed # I

    人工智障也刷題!Kaggle 入門之實戰

    背景 關於 Kaggle www.kaggle.com/ 這是一個為你提供完美資料,為你提供實際應用場景,可以與小夥伴在資料探勘領域 high 的不要不要的的地方啊!!! Kaggle 是一個用來學習、分享和競賽的線上資料實驗平臺,有點類似 KDD—CUP(國際知識發現和資料探勘競賽),企

    用python實現Kaggle的Titanic資料分析例子

    用python實現Kaggle的Titanic資料分析例子 2016年07月04日 23:44:00 閱讀數:11875 一、在資料處理方向上,R語言相比,python更接近程式語言,先學習p

    kaggle競賽:倖存者預測

    kaggle競賽:泰坦尼克倖存者預測——(一) import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import os import warnin

    機器學習kaggle實戰-號問題知識梳理

    工作流程: 在資料科學競賽的解決問題的七個步驟: 1.問題或問題的定義。(理解題目)2.獲得培訓和測試資料。(獲取資料)3.爭論,準備清理資料。(初步清洗資料)4.分析、識別模式,並探索資料。(特徵工程)5.模型,預測和解決問題。(機器學習演算法介入)6.視覺化報告,並提出解決問題的步驟和最終的解決方案。

    【機器學習】kaggle

    參考程式碼 kaggle泰坦尼克入門,分別使用了線性迴歸、邏輯迴歸和隨機森林三種演算法。 連結如下: https://www.jianshu.com/p/bbfbdedc3c1c 隨機森林演算法介紹 決策樹-Gini不純度 決策樹演算法有缺陷,當我們需要區分的特徵很多時,需要引入Gini

    【SciKit-Learn學習筆記】4:決策樹擬合號資料集並提交到Kaggle

    學習《scikit-learn機器學習》時的一些實踐。 決策樹擬合泰坦尼克號資料集 這裡用繪製引數-score曲線的方式去直觀看出模型引數對模型得分的影響,作者使用了GridSearchCV來自動做k-fold交叉驗證,並且能在多組模型引數中找到最優的一組和最優值(用平均s

    Kaggle —— 號Titanic

    1. 資料總覽 Titanic 生存模型預測,其中包含了兩組資料:train.csv 和 test.csv,分別為訓練集合和測試集合。 import re import numpy as np import pandas as pd import matpl

    kaggle tensorflow 邏輯迴歸

    import pandas as pd import numpy as np import tensorflow as tf from sklearn import preprocessing from tensorflow.contrib.tensor_forest.python imp

    kaggle的年齡使用tensorflow進行隨機森林迴歸

    kaggle上泰坦尼克的年齡轉換為int型,0~80歲一共81個標籤。使用隨機森林分類準確率為0.47,然後再用這個模型去獲得未知的年齡資料。 import pandas as pd import numpy as np import tensorflow as tf from te