kaggle—Titanic生存情況預測
來自專欄猴子聊數據分析
機器學習入門——(上篇)
一、人工智慧與機器學習是什麼?
1、機器學習是什麼?
機器學習的本質是用機器取代人來做決策(eg:淘寶有近百億件商品,上萬商家為用戶推薦什麼樣的商品)
機器取代人做決策的一個非常重要的前提有三個:
①雲計算:重組計算海量數據
②大數據:有處理海量數據的需求,對雲計算的要求也越來越高
③演算法:雲計算和大數據聯繫在一起,通過演算法推動行業高速發展
2、什麼是機器學習演算法?
機器學習演算法是把人類決策思考的過程抽象成一個模型,用數學的方法給這個模型找到最優化的解,再用代碼把這個解變成機器可執行的命令,最終完成一個機器大腦的構建。
這個模型和代碼與人腦的區別在於模型最核心是靠不斷的海量數據來進行不斷地優化以實現自己的決策(所以大數據與演算法是分不開的)。
3、人工智慧分為三個層次:
第一層:基礎技術層
用雲計算重組海量數據,eg:淘寶的購物數據、滴滴打車的交通數據,為人工智慧的技術的實現和人工智慧技術的應用落地提供基礎的後台保障。
第二層:技術層
處理各種機器學習的演算法
第三層:應用層
是人工智慧應用聚集在Google搜索、智能醫療、滴滴交通方面的應用,以及百度提到的無人駕駛領域。
案例:從Google搜索與海量用戶互動中看到它是如何將雲計算、大數據和演算法運用在一起的
Google有兩個簡單的頁面:
①搜索框
②搜索後的頁面
用Google搜索的3個步驟:
輸入關鍵詞→出現搜索結果的頁面(可見結果是根據相關性大小進行排序的,往往第一排的結果越是你想要的結果,越靠後的結果說明相關性演算法不夠好)→點擊某個頁面,進入該頁面完成搜索
實際上你每一次的點擊都在幫助Google培訓它們的機器演算法和優化它的決策過程。
4、機器學習的6個步驟
機器學習(入門)——下篇
案例:用python預測泰坦尼克號生還率
一、提出問題:研究的問題是什麼樣的人在泰坦尼克號中更容易存活?
數據來源:Kaggle的泰坦尼克號項目中
Kaggle是一個怎樣的網站?
Kaggle是一個流行的數據科學競賽平台。Kaggle的競賽分成4個最常見的類別:
①Feature:通常由公司、組織甚至政府贊助的,有獎金池
②Research:研究方向的競賽
③Recruitment:想要招聘數據科學家的公司贊助的
④Getting Started:練習項目,與Feature競賽結構相同,但是沒有獎金,但有更簡單的數據集和大量教程。新手可以從這開始進行對項目的練習。
Kaggle網站:https://www.kaggle.com/
二、理解數據
1、下載數據:找到Kaggle網站的泰坦尼克項目中的data的頁面下載數據文件。下載的文件有3個,分別如圖:
gender_submission.csv:kaggle給我們一個提交結果的案例文件,告訴我們預測完成後提交的文件要與這個文件的格式一樣。
test.csv文件:測試數據使用機器學習模型對生存率進行預測,並將預測結果提交給kaggle,讓Kaggle來評估我們的模型的正確率。
train.csv 文件:裡面的數據為訓練數據,用於建立模型。
2、導入數據
(1)導入numpy和pandas包
(2)打開train_csv和test_csv表格,再讀取這兩個表。
再用shape屬性列印出這兩個數據集的大小。可以看到訓練數據集有891行,有12個變數;測試數據集有418行,但只有11個變數。測試數據集的變數比訓練數據集的變數少的這個變數是什麼呢?
原來是生存率預測結果,而這正是要我們通過建立模型去預測出這個結果。我們也需要記住這裡訓練數據集的條數,方便我們從後面合併整理後的數據集中拆分出測試數據集,用於提交kaggle的結果。
(3)合併訓練數據與測試數據以便對他們進行統一清洗,用函數append來對兩個數據集進行合併
將測試數據合併到訓練數據中,變數full存放的是包括測試數據和訓練數據全部的數據,查看數據集的總體情況。
3、查看數據集信息:
列名變數的含義:
Age:年齡
Cabin:客艙號
Embarked:登船港口
Fare: 船票價格
Name:姓名
Parch:船上父母數/子女數(不同代直系親屬)
PassengerId:乘客編號
Pclass: 客艙等級(1:一等艙,2:二等艙,3:三等艙)
Sex:性別
Sibsp:船上兄妹姐妹數/配偶數(同代直系親屬)
Survived:生存情況(0=死亡,1=存活)
Ticket: 船票編號
(1).用describe()的方法查看、理解數據集:
count: 數據總數
mean: 平均值
std:標準差
min:最小值
25%:下四分位數
50%:中位數
75%:上四分位數
max: 最大值
發現問題一:
可以看到出年齡的數據總數只有1046條,而合併後的數據的總行數是1039條。年齡的數據有缺失。
發現問題二:
船票價格總行數只有1308,依舊比合併後的數據集的總行數小於1。當我們發現船票價格為0時也是有問題的,因為船的票價不能是0(可以找到最小年齡的乘客的票價來參考)。
用loc函數定位最小年齡乘客,再找到對應行的船票價格,可以看到不足一歲的兒童也是產生了費用的。
由此可見之前合併後的數據集中的船票價格為0是異常的,所以這也是我們在做數據清洗時要處理這樣的異常值。
(2).用數據框的info()方法來查看每列的數據類型和數據總數
這因為describe()是描述統計分析,所以只能查看數據類型的列的信息,對於其他類型的數據它是不顯示的(如字元串類型的:姓名、客艙號等列的指標信息)。
可見年齡、客艙號、登船港口以及票價的數據都有缺失。其中客艙號的缺失率很大:
客艙號缺失率為=(1309-295)/1309=77.5%
三、清洗數據
同過第二步對這個項目的數據理解,需要在數據清洗時處理兩個問題:一個是數據的缺失,另一個是需要處理數據的異常值(船票價格不能為0)。
1.數據預處理:
(1)如何處理缺失值:(許多機器學習演算法為了訓練模型要求我們傳入的特徵不能為空值)
用fillna填充缺失值。
年齡和船票價格的列為數值類型,填充方法是取各自的平均值進行填充。
因為登船港口的缺失值不大只有2條,所以我們可以把這缺失的兩個登船港口,看成是出現頻次最多的港口「S」。
接著再處理船艙號的異常值:
因為船艙號只有295條數據,缺失的數據量大無法推斷,就用未知的(」U」)來填充。
2.特徵工程:
(1)數據和特徵決定了機器學習的上限,模型和演算法則是去逼近這個上限;什麼又是」特徵工程」呢?
特徵工程就是最大限度地從原始數據中提取特徵以供機器學習演算法和模型使用。好的特徵的選擇會影響演算法和模型的預測結果。
把info所得到的每列的數據類型進行分類,分類成為我們常用的3種數據類型(數值類型、時間序列、分類數據)。
(2)對分類數據進行提取:
①對「性別」的提取(已有明顯分類的特徵)
方法一:
但是這裡的結果只是一個一維數組,所以要把它轉化成二維表格的格式,把title命名為Sex。
方法二:
使用one-hot編碼生成新特徵。
map() 函數:會根據提供的函數對指定序列做映射。可以對pandas的一維數組Series里的每一個數據用自定義函數來計算,所以這裡可以按照字典中定義的映射關係來計算。
②對「登船港口」變數數據特徵的提取:(已有明顯分類的特徵)
因為登船港口的類別不止2個類別,所以會用到get_dummy來進行one-hot編碼。
One-hot編碼:原始數據中有n種類別,可將這一個特徵擴展為n種新的特徵。
Dummy:經過one-hot編碼後得到的新特徵被稱之為「虛擬變數」,是人物虛設的變數「0」或「1」來反映某個變數的不同屬性。
因為港口有三種類別,因此生成了3列新的特徵。
③對「客艙等級」變數數據特徵的提取(已有明顯分類的特徵):
提取方式與「登船港口」同。
(3)對「姓名」變數數據特徵進行分類提取(無明顯分類,需要從字元串中提取類別):
乘客姓名中的頭銜和稱謂,不同頭銜的人是否生存情況也有差異呢?於是,將這些信息提取出來作為一個新變數,也可以幫助進行預測。用split方法對字元串進行拆分。
從「姓名」中提取出「頭銜」之後,將series的一維數據存放到二維數據框中
那麼怎麼來看出已經提取出的所有頭銜的種類呢?這裡還是需要用到One_hot編碼來得到:
這樣就可以查看到所有「頭銜」的類別了。然後,根據這些頭銜來查找出它們的含義,把它分類成比較熟悉的頭銜類別。接下來可以對這些姓名中的頭銜來做映射,將每個頭銜映射到自己定義的頭銜類別中。
這樣就把姓名分為了自定義的6個類別了。
(4)對「家庭類別」進行分類提取特徵(無明顯分類,需要加工整理得出):
因為Series的一維數組支持向量化運算,所以可以算出每個家庭成員的個數,通過家庭的大小來預測出的不同家庭生存的情況是怎樣的。
根據計算出的家庭成員的多少來為家庭的大小分類,用匿名函數lambda來進行條件判斷來
建立出家庭大小的類別:
(5)對「客艙號」的數據進行分類提取(無明顯分類,需從字元串中提取分類數據):
抽取索引為10-28的客艙號數據進行查看,發現可以提取客艙號的首字母來對船艙進行分類。
用lambda函數來提取,所設參數為c,函數主題為c[0](即要獲取第一個字母)。因為map()會根據提供的函數對指定序列做映射,所以Cabin這列的首字母可以提取出,作為客艙分類的數據類型。
再用get_dummies進行One-hot編碼獲取新的客艙分類信息
(3)特徵選擇:選擇對預測數據有影響的特徵,有助於提高模型的準確率。
因為特徵和降維需要用到許多統計知識和機器學習演算法,所以這裡從最簡單的用「相關係數」篩選特徵開始。
a.用corr()的方法得到相關係數矩陣
b.將之前提取的有用的數據特徵都聯繫起來:
可以得到這樣的形式,這樣的虛擬變數為數值類型,有助於得出各種特徵與「survived」的矩陣。
c.將相關係數矩陣中的「Survived」生存情況這一列提取出來,並按降序排列就得到了各個特徵與生存情況從[-1,1]的相關係數值。
紅框內為正線性相關的特徵(隨著特徵x↑,y↑),相關係數大於0;藍色框為負線性相關的特徵(隨著特徵x↑,y↓),相關係數小於0。
這裡可以看到女士,頭等艙的乘客生存率更高;而男士和客艙等級低的乘客生存率排在了最後的位置。
根據各個特徵和生存情況的相關係數選擇幾個更有代表性的特徵作為模型輸入的特徵。
四、構建模型
因為test_csv 為預測試數據集,其中的生存情況的結果是需要我們進行預測的並提交給kaggle的,所以裡面沒有生存情況的值。
Kaggle給到的train_csv為原始數據集,可將其拆分為訓練數據集(train)和測試數據集(test)。
train訓練數據集用於構建模型,test預測數據集用於評估模型,pred預測數據集(test_csv)用於生成預測結果提交給kaggle。
(1)在合併數據集中full_X1中用數據框的loc屬性根據索引值提取出原始數據和預測數據。
因為原始數據集train_csv有891行,測試數據集test_csv有418行。所以可以先從合併並清洗後後數據集full_X1中提取出原來的891行的訓練數據集的特徵和標籤;然後再將891行之後的481條的預測數據集的特徵也提取出來:
注意:因為第一行的數據索引為0,所以891行的索引是891-1=890;列這裡取的是所有列。
(2)從原始數據集中拆分出訓練數據集和測試數據集
train_test_split(機器學習包中的一個函數):功能是從樣本中隨機地按比例篩選出訓練數據集合測試數據集。
(3)建立模型
因為預測Titanic的生存率是二分分類的問題(通過乘客特徵來預測其是存活還是死亡)。
選擇一個合適機器學習演算法用於模型的訓練,二分分類用最簡單的邏輯回歸演算法開始。
有3個步驟:
step1: 導入機器學習包里的邏輯回歸函數LogisticRegression
step2: 創建邏輯回歸模型,並給模型命名為變數model
step3:用訓練數據訓練模型用fit()函數來實現
五、評估模型的好壞
評估模型時使用測試數據,模型的score方法算出的是模型的正確率。
六、方案實施
這個環節需要將分析結果撰寫成報告彙報給老闆彙報,或是將參加kaggle項目的預測結果上傳至kaggle中查看排名。
如何將預測結果提交到kaggle中?
(1)預測test_csv中生存率的值,這裡要使用到predict函數來預測出放入模型中的預測數據的生存情況結果(pred_Y)。
(2)因為pred_Y是浮點型數據,因此要用astype(int)來轉換成整型(kaggle要求提交整型)。
(3)將預測結果保存到csv文件中,文件位置在當前notebook文件目錄下。
(4)上傳至Kaggle中,生成的最後排名如下:
通過這次練習對建立模型預測生存率結果有了初步了解。感覺對我來說的難點還是對一些函數的運用,所以還得保持耐心多敲代碼,多練習,順利完成這個練習總的說來還是蠻開心的,↖(^ω^)↗。
推薦閱讀:
※Titanic災難倖存者預測
※CHAPTER4-2 : KAGGLE經典練習項目-Titanic
※Mercari Price 比賽分享——語言不僅是演算法和公式而已
※Mac OSX 下安裝XGBoost
※泰坦尼克號kaggle隨機森林預測
TAG:機器學習 | Kaggle | 「泰坦尼克號」沉沒事故 |