目錄
項(xiàng)目問(wèn)題
各變量解釋
一低葫、數(shù)據(jù)描述
1.總覽數(shù)據(jù)
2.可視化探索
3.相關(guān)性分析
二冀膝、特征工程
1.缺失值處理
2.構(gòu)造家庭規(guī)模特征
3.構(gòu)造乘客身份特征
4.對(duì)Fare分箱(消除異常值)
5.用Ticket構(gòu)造票根特征
三二庵、建模
1.導(dǎo)入模型
2.數(shù)據(jù)準(zhǔn)備
3.擬合模型及評(píng)估結(jié)果
4.輸出結(jié)果及導(dǎo)出
四撼唾、項(xiàng)目總結(jié)及反省
——————————————————————————————————
問(wèn)題:
What sorts of people were more likely to survive in tatanic?
各變量解釋:
Variable Definition Key
survival: Survival 0 = No, 1 = Yes
pclass: Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
sex:Male or Female
Age: Age in years
sibsp: # of siblings / spouses aboard the Titanic
parch: # of parents / children aboard the Titanic
ticket:Ticket number
fare:Passenger fare
cabin: Cabin number
embarked: Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton
Variable Notes
pclass: A proxy for socio-economic status (SES) 1st = Upper 2nd = Middle 3rd = Lower
age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5
sibsp: The dataset defines family relations in this way...
Sibling = brother, sister, stepbrother, stepsister
Spouse = husband, wife (mistresses and fiancés were ignored)
parch: The dataset defines family relations in this way...
Parent = mother, father
Child =daughter, son, stepdaughter, stepson
Some children travelled only with a nanny, therefore parch=0 for them
一梅尤、數(shù)據(jù)描述
1.導(dǎo)入文件替劈,總覽數(shù)據(jù)
import pandas as pd
import numpy as np
import seaborn
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
#合并訓(xùn)練集和測(cè)試集蜒滩,方便做同樣的特征工程
data = train.append(test)
data.head()
#查看缺失值及數(shù)據(jù)類型
[data.info](http://data.info)()
2.可視化探索
2.1餅狀圖可視化預(yù)測(cè)目標(biāo)Survived
#使用matplotlib來(lái)可視化
import matplotlib.pyploy as plt
#設(shè)置餅圖塊標(biāo)簽
labels = ['Survived','Unsuvived']
#autopect顯示百分比
plt.pie(data['Survived'],labels = labels,autopect = '%.0f%%')
#data['Survived'].plot.pie(autopect='%.0f%%')可以實(shí)現(xiàn)相同效果
2.2柱狀圖探索性別Sex與生存Survived的關(guān)系
女士?jī)?yōu)先滨达,發(fā)現(xiàn)女士生存率較高
import seaborn as sns
sns.barplot(x='Sex',y='Survived',data=data)
2.3Embarked登船地點(diǎn)與生存的關(guān)系
從C港口上船的客人生存概率較高
推測(cè)C港口的客人更多女性或者票等級(jí)更高
sns.barplot(x='Embarked',y='Survived',data=data)
2.3.1查看不同港口登船客人的男女****Sex****人數(shù)以及票等級(jí)****Plcass對(duì)比
#col表示已什么分類,kind='count'表示計(jì)數(shù)方式計(jì)算'Sex'
sns.factorplot('Sex',col='Embarked',data=data,kind='count',size=3)
可見C和Q港口登船的客人女性比例相同,所以可能C生存率高由Pclass影響
sns.factorplot(x='Pclass',col='Embarked',data=data,kind='count',size=3)
可見C港口登船客人Pclass=1比例最高俯艰,票等級(jí)最高捡遍,故生存率高,見2.3
2.4年齡與生存率的關(guān)系
根據(jù)年齡劃分年齡段
#劃分年齡段竹握,查看年齡與生存率關(guān)系
def age_split(age):
if age<12:
return '兒童'
elif (age>=12)&(age<=18):
return
elif (age>18)&(age<=50):
return "青壯年"
else:
return "老年"
#創(chuàng)建新列Age_spilt代表年齡段画株,根據(jù)"Age"代入函數(shù)得出
data['Age_Split'] = data['Age'].map(age_split)
data[['Age_Split']]
#解決中文顯示不了問(wèn)題
plt.rcParams['font.family'] = ['Arial Unicode MS']
#繪圖
sns.barplot(x='Age_Split',y='Survived',data=data)
可見兒童組存活率最高,老年組最低
3.相關(guān)性分析
分析可見性別、船票價(jià)和
#二值化'Sex',男性為0谓传,女性為1
data['Sex']=pd.get_dummies(data['Sex'])
#觀察其他變量與“Survived”變量的相關(guān)性
data.corr()[['Survived']].sort_values('Survived',ascending=0)

二蜈项、特征工程
1.缺失值處理
1)'Cabin':發(fā)現(xiàn)Cabin存在大量空值,且多為字母加數(shù)字如A41良拼,B15战得,C23
這里空值可能代表其他含義,可能無(wú)房間代表工作人員庸推,所以把“Cabin”中的空值轉(zhuǎn)換為字母“S”常侦,stands for Special
data['Cabin'] = data['Cabin'].fillna('S')
2)Embarked登船港口缺失值只有兩個(gè),填充眾數(shù)S
data['Cabin'] = data['Cabin'].fillna('S')
2.根據(jù)SibSp+Parch構(gòu)建“家庭規(guī)谋崦剑”特征
data['Family_Size'] = data['SibSp']+data['Parch']#父母孩子+兄弟姐妹=家庭規(guī)模
sns.distplot(data['Family_Size'])#查看家庭規(guī)模分布情況
發(fā)現(xiàn)規(guī)模等于10的家庭
查看規(guī)模等于10的家庭存活情況
#取家庭規(guī)模=10的dataframe
F_Size10 = data[data['Family_Size']==10]
可見這10個(gè)人都是一個(gè)家庭的聋亡,且全部不幸遇難,太慘了吧
該家庭都為3等Cabin
查看家庭人員與生存率關(guān)系
3.根據(jù)"Name"構(gòu)造代表乘客身份的稱謂'title'
比如女士是Miss际乘、Mrs坡倔,男士是Mr,船員有Master
#根據(jù)符號(hào), 切分"Name"脖含,得到姓氏和名字的列表:[0]為名字罪塔,[1]為姓氏
#提取姓氏
Surname = data['Name'].map(lambda x:x.split(',')[1])
Surname
#x.split(',')[1]代表姓氏,根據(jù)姓氏再提取title; strip()刪除字符串的空格
title = data['Name'].map(lambda x:(x.split(',')[1]).split('.')[0].strip())
title.value_counts()
對(duì)Title進(jìn)行分箱操作,需要了解不同稱謂的代表养葵,這里可以查有道征堪,并且根據(jù)生存率進(jìn)行分箱
女士類: Miss/Mlle/Lady--生存率較高
已婚夫人類: Mrs/Ms/Mme--生存率較高
男士類: Mr/Sir/Rev牧師--生存率最低
地位顯赫類: the Countess伯爵夫人/jonkheer荷蘭皇家
工作人員類: Capt船長(zhǎng)/Master船長(zhǎng)/Col上校/Major少校/Dr教授/Don大學(xué)老師--生存率較低
4.將Fare分箱消除異常值,構(gòu)建‘Fare_Split’
#將Fare等分為5段关拒,觀察每段的存活率.
#不同的數(shù)值型變量應(yīng)該調(diào)整箱子數(shù)量以求發(fā)現(xiàn)具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
由結(jié)果可得佃蚜,主要生存率由票價(jià)分為三個(gè)部分(0,10.5],(10.5,41.579](41.579-512.329]
#將票價(jià)分成3個(gè)箱子,指定區(qū)間和標(biāo)簽
data['Fare_Split'] = pd.cut(data['Fare'],[0,10.51,41.58,513],labels=['Fare_1','Fare_2','Fare_3'])
5.Ticket票根可能有不同含義着绊,分離首字母構(gòu)造Ticket_Letter字段
#提取首字母
data['Ticket_Letter']=data['Ticket'].map(lambda x:x[0])
#查看不同首字母票根下的生存率
data['Survived'].groupby(data['Ticket_Letter']).mean()
三谐算、建模預(yù)測(cè)
1.導(dǎo)入模型
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.neural_network import MLPRegressor
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import ExtraTreeRegressor
#集成學(xué)習(xí)
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import BaggingRegressor
2.數(shù)據(jù)準(zhǔn)備:特征選擇、分離訓(xùn)練測(cè)試集归露、one-hot編碼
2.預(yù)測(cè)前數(shù)據(jù)準(zhǔn)備
#查看各字段與Survivied的相關(guān)性
data2.corr()[['Survived']].sort_values('Survived')
#選擇相關(guān)性較高的字段
data1=data[['PassengerId','Age','Pclass','Embarked','Fare','Family_Size','Title','Fare_Split','Ticket_Letter','Cabin_Class','Survived']]
#one-hot編碼
data2 = pd.get_dummies(data1)
train = data2[data2['Survived'].notnull()]#選出訓(xùn)練集
test = data2[data2['Survived'].isnull()]#選出測(cè)試集
test = test.drop('Survived',axis=1)
train_x = train.drop('Survived',axis=1)#
train_y = train[['Survived']]
3.開始預(yù)測(cè):建立三個(gè)列表存放訓(xùn)練結(jié)果及訓(xùn)練效果
#建立3個(gè)列表:一個(gè)存放模型名字洲脂、一個(gè)存放模型、一個(gè)存放評(píng)分剧包。方便后期統(tǒng)一展示對(duì)比
model_name = ['LinearRegression','KNeighborsRegressor','SVR','Lasso','Ridge','MLPRegressor','DecisionTreeClassifier','ExtraTreeRegressor','RandomForestRegressor','AdaBoostRegressor','GradientBoostingRegressor','BaggingRegressor']
models=[LinearRegression(),KNeighborsRegressor(),SVR(),Lasso(),Ridge(),MLPRegressor(),DecisionTreeClassifier(),ExtraTreeRegressor(),RandomForestRegressor(),AdaBoostRegressor(),GradientBoostingRegressor(),BaggingRegressor()]
cross_score=[]
score=[]
from sklearn.value_selection import cross_val_score
#zip()可以包含一個(gè)或多個(gè)迭代器
for name,model in zip(model_name,models):
m = model#實(shí)例化模型
cross_value_score(m,x,y,cv=5)#交叉驗(yàn)證得分腮考,迭代次數(shù)為5
m.fit(x,y)#用訓(xùn)練集訓(xùn)練模型
pre_y = m.predict(test2)#用模型預(yù)測(cè)test的生存情況
grade = model.score(x,y)#對(duì)模型評(píng)分
score.append(grade)#將評(píng)分加入score列表
#建立用來(lái)展示各模型評(píng)分的DataFrame
#建立方法:Dataframe中包含一個(gè)字典,字典的"鍵"是列名,字典的"值"是列表
result = pd.DataFrame({'Model':model_name,'Score':score})
根據(jù)評(píng)分可見決策樹以及隨機(jī)森林表現(xiàn)較好玄捕,選用這兩個(gè)模型跑測(cè)試集
四、輸出結(jié)果
選用決策樹及隨機(jī)森林預(yù)測(cè)結(jié)果
RM = RandomForestClassifier()#隨機(jī)森林
DT = DecisionTreeClassifier()#決策樹
RM.fit(x,y)#擬合隨機(jī)森林
DT.fit(x,y)#擬合決策樹
test['Survived'] = RM.predict(test)#將隨機(jī)森林預(yù)測(cè)結(jié)果賦值給test
RM_result=test[['Passenger_Id','Survivied']]#提交格式
#index=Flase表示不生成index列
#生成隨機(jī)森林csv結(jié)果
RM_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)
test['Survived'] = DT.predict(test)將決策樹預(yù)測(cè)結(jié)果賦值給test
DT_result=test[['Passenger_Id','Survivied']]#提交格式
DT_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)#生成決策樹結(jié)果
四棚放、項(xiàng)目總結(jié)及反省
這次的Tatanic項(xiàng)目主要目的是練習(xí)使用python枚粘,作為練手項(xiàng)目
從目錄的數(shù)據(jù)描述、特征工程及建模三方面總結(jié)
(一)數(shù)據(jù)描述:
1.導(dǎo)入數(shù)據(jù)時(shí)飘蚯,需將測(cè)試集和訓(xùn)練集先合并馍迄,因特征工程會(huì)構(gòu)造新特征或?qū)υ刑卣鬟M(jìn)行操作福也,要確保測(cè)試、訓(xùn)練集一致
2.兩變量間的關(guān)系
2.1可視化sns.barplot(x=變量A攀圈,y=變量B,data)
2.2groupby 例如:data['Survived'].groupby(data['Sex']).mean()
3.要善于挖掘分離特征中的信息暴凑,比如姓名中的不同稱謂Mr Mrs Countless Jonkerr等有特定的意義 對(duì)預(yù)測(cè)值能產(chǎn)生重大影響
3.快速發(fā)現(xiàn)異常值的方法
data.describe() 觀察有沒有大幅偏離平均值的數(shù)據(jù)或者是不符合常識(shí)的數(shù)據(jù)
(二)特征工程
1.常用構(gòu)造新特征的兩種方法
#1.map配合lambda
data['Ticket_Letter']=data['Ticket'].map(lambda x:x[0])
#2.map配合自己定義的方法
def add(x)
x=x+1
return x
data['Increment'] = data['Number'].map(add)
2.分箱兩種方法
2.1pd.cut():每一段的范圍大小相同
data['Fare'] = pd.cut(data['Fare'],5, labels=[])
2.2pd.qcut():每一段的樣本數(shù)量相同
data['Fare'] = pd.qcut(data['Fare'],5,labels=[])
2.3查看分箱后效果
#將Fare等分為5段,觀察每段的存活率.
#不同的數(shù)值型變量應(yīng)該調(diào)整箱子數(shù)量以求發(fā)現(xiàn)具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
3.字符串分割提取
#將'Mr. Yang' 的 'Yang'提取出來(lái)
data['Title'] = data['Title'].map(lambda x : x.split(',')[1])