数据分析-kaggle泰坦尼克号生存率分析
概述
1912年4月15日,泰坦尼克號在首次航行期間撞上冰山后沉沒,2224名乘客和機組人員中有1502人遇難。沉船導致大量傷亡的原因之一是沒有足夠的救生艇給乘客和船員。雖然幸存下來有一些運氣因素,但有一些人比其他人更有可能生存,比如婦女,兒童和上層階級。在本文中將對哪些人可能生存作出分析,特別是運用Python和機器學習的相關模型工具來預測哪些乘客幸免于難,最后提交結果。從kaggle泰坦尼克生存預測項目下載相關數據。
實施步驟
1.提出問題
什么樣的人在泰坦尼克號中更容易存活?
2.理解數據
2.1 采集數據
從Kaggle泰坦尼克號項目頁面下載數據:https://www.kaggle.com/c/titanic
2.2 導入數據
#導入處理數據包 import numpy as np import pandas as pd #導入數據 #訓練數據集 train = pd.read_csv('E:\kaggle\\train.csv') #測試數據集 test = pd.read_csv('E:\kaggle\\test.csv') print ('訓練數據集:',train.shape,'測試數據集:',test.shape) rowNum_train=train.shape[0] rowNum_test=test.shape[0] print('kaggle訓練數據集有多少行數據:',rowNum_train,',kaggle測試數據集有多少行數據:',rowNum_test,) #合并數據集,方便同時對兩個數據集進行清洗 full = train.append( test , ignore_index = True ) print ('合并后的數據集:',full.shape)2.3 查看數據集信息
#查看數據 full.head() #獲取數據類型列的描述統計信息 full.describe()describe只能查看數據類型的描述統計信息,對于其他類型的數據不顯示
# 查看每一列的數據類型,和數據總數 full.info() 我們發現數據總共有1309行。其中數據類型列:年齡(Age)、船艙號(Cabin)里面有缺失數據:
1)年齡(Age)里面數據總數是1046條,缺失了1309-1046=263,缺失率263/1309=20%
2)船票價格(Fare)里面數據總數是1308條,缺失了1條數據
字符串列:
1)登船港口(Embarked)里面數據總數是1307,只缺失了2條數據,缺失比較少
2)船艙號(Cabin)里面數據總數是295,缺失了1309-295=1014,缺失率=1014/1309=77.5%,缺失比較大
這為我們下一步數據清洗指明了方向,只有知道哪些數據缺失數據,我們才能有針對性的處理。
3.數據清洗
3.1 數據預處理
缺失值處理
在前面,理解數據階段,我們發現數據總共有1309行。 其中數據類型列:年齡(Age)、船艙號(Cabin)里面有缺失數據。 字符串列:登船港口(Embarked)、船艙號(Cabin)里面有缺失數據。這為我們下一步數據清洗指明了方向,只有知道哪些數據缺失數據,我們才能有針對性的處理。很多機器學習算法為了訓練模型,要求所傳入的特征中不能有空值。
字符串列:
1)登船港口(Embarked)里面數據總數是1307,只缺失了2條數據,缺失比較少
2)船艙號(Cabin)里面數據總數是295,缺失了1309-295=1014,缺失率=1014/1309=77.5%,缺失比較大
登船港口(Embarked):
出發地點:S=英國南安普頓Southampton
途徑地點1:C=法國 瑟堡市Cherbourg
途徑地點2:Q=愛爾蘭 昆士敦Queenstown #登船港口(Embarked):查看里面數據長啥樣 full['Embarked'].head() #分類變量Embarked,看下最常見的類別,用其填充 full['Embarked'].value_counts()
從結果來看,S類別最常見。我們將缺失值填充為最頻繁出現的值:
S=英國南安普頓Southampton
3.2 特征提取
3.2.1數據分類
查看數據類型,分為3種數據類型。并對類別數據處理:用數值代替類別,并進行One-hot編碼。1.數值類型:
乘客編號(PassengerId),年齡(Age),船票價格(Fare),同代直系親屬人數(SibSp),不同代直系親屬人數(Parch)
2.時間序列:無
3.分類數據:
1)有直接類別的
乘客性別(Sex):男性male,女性female
登船港口(Embarked):出發地點S=英國南安普頓Southampton,途徑地點1:C=法國 瑟堡市Cherbourg,出發地點2:Q=愛爾蘭 昆士敦Queenstown
客艙等級(Pclass):1=1等艙,2=2等艙,3=3等艙
2)字符串類型:可能從這里面提取出特征來,也歸到分類數據中
乘客姓名(Name)
客艙號(Cabin)
船票編號(Ticket)
有直接類別-性別(Sex)
#查看性別數據這一列 full['Sex'].head()將性別的值映射為數值
男(male)對應數值1,女(female)對應數值0
有直接類別-登船港口(Embarked)
使用get_dummies進行one-hot編碼,產生虛擬變量(dummy variables),列名前綴是Embarked
#存放提取后的特征 embarkedDf = pd.DataFrame() embarkedDf = pd.get_dummies( full['Embarked'] , prefix='Embarked' ) embarkedDf.head()因為已經使用登船港口(Embarked)進行了one-hot編碼產生了它的虛擬變量(dummy variables)
所以這里把登船港口(Embarked)刪掉
有直接類別-客艙等級(Pclass)
客艙等級(Pclass):
1=1等艙,2=2等艙,3=3等艙
字符串類型-乘客姓名(Name)
注意到在乘客名字(Name)中,有一個非常顯著的特點:乘客頭銜每個名字當中都包含了具體的稱謂或者說是頭銜,將這部分信息提取出來后可以作為非常有用一個新變量,可以幫助我們進行預測。
例如:
Braund, Mr. Owen Harris
Heikkinen, Miss. Laina
Oliva y Ocana, Dona. Fermina
Peter, Master. Michael J
定義函數:從姓名中獲取頭銜 def getTitle(name):str1=name.split( ',' )[1] #Mr. Owen Harrisstr2=str1.split( '.' )[0]#Mr#strip() 方法用于移除字符串頭尾指定的字符(默認為空格)str3=str2.strip()return str3 #存放提取后的特征 titleDf = pd.DataFrame() #map函數:對Series每個數據應用自定義的函數計算 titleDf['Title'] = full['Name'].map(getTitle) titleDf.head()
定義以下幾種頭銜類別:
Officer政府官員
Royalty王室(皇室)
Mr已婚男士
Mrs已婚婦女
Miss年輕未婚女子
Master有技能的人/教師
字符串類型-客艙號(Cabin)
python 使用 lambda 來創建匿名函數。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數,預防如下:
lambda 參數1,參數2:函數體或者表達式
客場號的類別值是首字母,例如:
C85 類別映射為首字母C
建立家庭人數和家庭類別
家庭人數=同代直系親屬數(Parch)+不同代直系親屬數(SibSp)+乘客自己(因為乘客自己也是家庭成員的一個,所以這里加1)
家庭類別:
小家庭Family_Single:家庭人數=1
中等家庭Family_Small: 2<=家庭人數<=4
大家庭Family_Large: 家庭人數>=5 #存放家庭信息 familyDf = pd.DataFrame() familyDf[ 'FamilySize' ] = full[ 'Parch' ] + full[ 'SibSp' ] + 1 #if 條件為真的時候返回if前面內容,否則返回0 familyDf[ '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() #添加one-hot編碼產生的虛擬變量(dummy variables)到泰坦尼克號數據集full full = pd.concat([full,familyDf],axis=1) full.head()
到現在我們已經有了33個特征了
3.3 特征選擇
相關系數法:計算各個特征的相關系數
#相關性矩陣 corrDf = full.corr() corrDf ''' 查看各個特征與生成情況(Survived)的相關系數, ascending=False表示按降序排列 ''' corrDf['Survived'].sort_values(ascending =False)根據各個特征與生成情況(Survived)的相關系數大小,我們選擇了這幾個特征作為模型的輸入:
頭銜(前面所在的數據集titleDf)、客艙等級(pclassDf)、家庭大小(familyDf)、船票價格(Fare)、船艙號(cabinDf)、登船港口(embarkedDf)、性別(Sex)
#特征選擇 full_X = pd.concat( [titleDf,#頭銜pclassDf,#客艙等級familyDf,#家庭大小full['Fare'],#船票價格cabinDf,#船艙號embarkedDf,#登船港口full['Sex']#性別] , axis=1 ) full_X.head()4.構建模型
用訓練數據和某個機器學習算法得到機器學習模型,用測試數據評估模型
4.1 建立訓練數據集和測試數據集
1)坦尼克號測試數據集因為是我們最后要提交給Kaggle的,里面沒有生存情況的值,所以不能用于評估模型。我們將Kaggle泰坦尼克號項目給我們的測試數據,叫做預測數據集(記為pred,也就是預測英文單詞predict的縮寫)。
也就是我們使用機器學習模型來對其生存情況就那些預測。
2)我們使用Kaggle泰坦尼克號項目給的訓練數據集,做為我們的原始數據集(記為source),
從這個原始數據集中拆分出訓練數據集(記為train:用于模型訓練)和測試數據集(記為test:用于模型評估)。
sourceRow是我們在最開始合并數據前知道的,原始數據集有總共有891條數據
從特征集合full_X中提取原始數據集提取前891行數據時,我們要減去1,因為行號是從0開始的。 #原始數據集:特征 source_X = full_X.loc[0:sourceRow-1,:] #原始數據集:標簽 source_y = full.loc[0:sourceRow-1,'Survived'] #預測數據集:特征 pred_X = full_X.loc[sourceRow:,:] ''' 確保這里原始數據集取的是前891行的數據,不然后面模型會有錯誤 ''' #原始數據集有多少行 print('原始數據集有多少行:',source_X.shape[0]) #預測數據集大小 print('原始數據集有多少行:',pred_X.shape[0]) 從原始數據集(source)中拆分出訓練數據集(用于模型訓練train),測試數據集(用于模型評估test)
train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取train data和test data
train_data:所要劃分的樣本特征集
train_target:所要劃分的樣本結果
test_size:樣本占比,如果是整數的話就是樣本的數量 from sklearn.cross_validation import train_test_split #建立模型用的訓練數據集和測試數據集 train_X, test_X, train_y, test_y = train_test_split(source_X ,source_y,train_size=.8)#輸出數據集大小 print ('原始數據集特征:',source_X.shape, '訓練數據集特征:',train_X.shape ,'測試數據集特征:',test_X.shape)print ('原始數據集標簽:',source_y.shape, '訓練數據集標簽:',train_y.shape ,'測試數據集標簽:',test_y.shape)
4.2 選擇機器學習算法
#第1步:導入算法 from sklearn.linear_model import LogisticRegression #第2步:創建模型:邏輯回歸(logisic regression) model = LogisticRegression() #隨機森林Random Forests Model #from sklearn.ensemble import RandomForestClassifier #model = RandomForestClassifier(n_estimators=100) #支持向量機Support Vector Machines #from sklearn.svm import SVC, LinearSVC #model = SVC() #Gradient Boosting Classifier #from sklearn.ensemble import GradientBoostingClassifier #model = GradientBoostingClassifier() #K-nearest neighbors #from sklearn.neighbors import KNeighborsClassifier #model = KNeighborsClassifier(n_neighbors = 3) # Gaussian Naive Bayes #from sklearn.naive_bayes import GaussianNB #model = GaussianNB()4.3 訓練模型
#第3步:訓練模型 model.fit( train_X , train_y )5.評估模型
# 分類問題,score得到的是模型的正確率 model.score(test_X , test_y )6.方案實施(Deployment)
6.1 得到預測結果上傳到Kaggle
使用預測數據集到底預測結果,并保存到csv文件中,上傳到Kaggle中,就可以看到排名。
#使用機器學習模型,對預測數據集中的生存情況進行預測 pred_Y = model.predict(pred_X)''' 生成的預測值是浮點數(0.0,1,0) 但是Kaggle要求提交的結果是整型(0,1) 所以要對數據類型進行轉換 ''' pred_Y=pred_Y.astype(int) #乘客id passenger_id = full.loc[sourceRow:,'PassengerId'] #數據框:乘客id,預測生存情況的值 predDf = pd.DataFrame( { 'PassengerId': passenger_id , 'Survived': pred_Y } ) predDf.shape predDf.head() #保存結果 predDf.to_csv( 'titanic_pred.csv' , index = False )?
?
?
轉載于:https://www.cnblogs.com/python-1807/p/10645170.html
總結
以上是生活随笔為你收集整理的数据分析-kaggle泰坦尼克号生存率分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决——》feign文件下载时报错fei
- 下一篇: python中path函数_示例1-pa