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