目录
项目问题
各变量解释
一、数据描述
1.总览数据
2.可视化探索
3.相关性分析
二、特征工程
1.缺失值处理
2.构造家庭规模特征
3.构造乘客身份特征
4.对Fare分箱(消除异常值)
5.用Ticket构造票根特征
三、建模
1.导入模型
2.数据准备
3.拟合模型及评估结果
4.输出结果及导出
四、项目总结及反省
——————————————————————————————————
问题:
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
一、数据描述
1.导入文件,总览数据
import pandas as pd
import numpy as np
import seaborn
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
#合并训练集和测试集,方便做同样的特征工程
data = train.append(test)
data.head()
#查看缺失值及数据类型
[data.info](http://data.info)()
2.可视化探索
2.1饼状图可视化预测目标Survived
#使用matplotlib来可视化
import matplotlib.pyploy as plt
#设置饼图块标签
labels = ['Survived','Unsuvived']
#autopect显示百分比
plt.pie(data['Survived'],labels = labels,autopect = '%.0f%%')
#data['Survived'].plot.pie(autopect='%.0f%%')可以实现相同效果
2.2柱状图探索性别Sex与生存Survived的关系
女士优先,发现女士生存率较高
import seaborn as sns
sns.barplot(x='Sex',y='Survived',data=data)
2.3Embarked登船地点与生存的关系
从C港口上船的客人生存概率较高
推测C港口的客人更多女性或者票等级更高
sns.barplot(x='Embarked',y='Survived',data=data)
2.3.1查看不同港口登船客人的男女****Sex****人数以及票等级****Plcass对比
#col表示已什么分类,kind='count'表示计数方式计算'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比例最高,票等级最高,故生存率高,见2.3
2.4年龄与生存率的关系
根据年龄划分年龄段
#划分年龄段,查看年龄与生存率关系
def age_split(age):
if age<12:
return '儿童'
elif (age>=12)&(age<=18):
return
elif (age>18)&(age<=50):
return "青壮年"
else:
return "老年"
#创建新列Age_spilt代表年龄段,根据"Age"代入函数得出
data['Age_Split'] = data['Age'].map(age_split)
data[['Age_Split']]
#解决中文显示不了问题
plt.rcParams['font.family'] = ['Arial Unicode MS']
#绘图
sns.barplot(x='Age_Split',y='Survived',data=data)
可见儿童组存活率最高,老年组最低
3.相关性分析
分析可见性别、船票价和
#二值化'Sex',男性为0,女性为1
data['Sex']=pd.get_dummies(data['Sex'])
#观察其他变量与“Survived”变量的相关性
data.corr()[['Survived']].sort_values('Survived',ascending=0)
![image.png](https://upload-images.jianshu.io/upload_images/21421395-dcbeb3e9c1b637eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二、特征工程
1.缺失值处理
1)'Cabin':发现Cabin存在大量空值,且多为字母加数字如A41,B15,C23
这里空值可能代表其他含义,可能无房间代表工作人员,所以把“Cabin”中的空值转换为字母“S”,stands for Special
data['Cabin'] = data['Cabin'].fillna('S')
2)Embarked登船港口缺失值只有两个,填充众数S
data['Cabin'] = data['Cabin'].fillna('S')
2.根据SibSp+Parch构建“家庭规模”特征
data['Family_Size'] = data['SibSp']+data['Parch']#父母孩子+兄弟姐妹=家庭规模
sns.distplot(data['Family_Size'])#查看家庭规模分布情况
发现规模等于10的家庭
查看规模等于10的家庭存活情况
#取家庭规模=10的dataframe
F_Size10 = data[data['Family_Size']==10]
可见这10个人都是一个家庭的,且全部不幸遇难,太惨了吧
该家庭都为3等Cabin
查看家庭人员与生存率关系
3.根据"Name"构造代表乘客身份的称谓'title'
比如女士是Miss、Mrs,男士是Mr,船员有Master
#根据符号, 切分"Name",得到姓氏和名字的列表:[0]为名字,[1]为姓氏
#提取姓氏
Surname = data['Name'].map(lambda x:x.split(',')[1])
Surname
#x.split(',')[1]代表姓氏,根据姓氏再提取title; strip()删除字符串的空格
title = data['Name'].map(lambda x:(x.split(',')[1]).split('.')[0].strip())
title.value_counts()
对Title进行分箱操作,需要了解不同称谓的代表,这里可以查有道,并且根据生存率进行分箱
女士类: Miss/Mlle/Lady--生存率较高
已婚夫人类: Mrs/Ms/Mme--生存率较高
男士类: Mr/Sir/Rev牧师--生存率最低
地位显赫类: the Countess伯爵夫人/jonkheer荷兰皇家
工作人员类: Capt船长/Master船长/Col上校/Major少校/Dr教授/Don大学老师--生存率较低
4.将Fare分箱消除异常值,构建‘Fare_Split’
#将Fare等分为5段,观察每段的存活率.
#不同的数值型变量应该调整箱子数量以求发现具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
由结果可得,主要生存率由票价分为三个部分(0,10.5],(10.5,41.579](41.579-512.329]
#将票价分成3个箱子,指定区间和标签
data['Fare_Split'] = pd.cut(data['Fare'],[0,10.51,41.58,513],labels=['Fare_1','Fare_2','Fare_3'])
5.Ticket票根可能有不同含义,分离首字母构造Ticket_Letter字段
#提取首字母
data['Ticket_Letter']=data['Ticket'].map(lambda x:x[0])
#查看不同首字母票根下的生存率
data['Survived'].groupby(data['Ticket_Letter']).mean()
三、建模预测
1.导入模型
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
#集成学习
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.数据准备:特征选择、分离训练测试集、one-hot编码
2.预测前数据准备
#查看各字段与Survivied的相关性
data2.corr()[['Survived']].sort_values('Survived')
#选择相关性较高的字段
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()]#选出训练集
test = data2[data2['Survived'].isnull()]#选出测试集
test = test.drop('Survived',axis=1)
train_x = train.drop('Survived',axis=1)#
train_y = train[['Survived']]
3.开始预测:建立三个列表存放训练结果及训练效果
#建立3个列表:一个存放模型名字、一个存放模型、一个存放评分。方便后期统一展示对比
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()可以包含一个或多个迭代器
for name,model in zip(model_name,models):
m = model#实例化模型
cross_value_score(m,x,y,cv=5)#交叉验证得分,迭代次数为5
m.fit(x,y)#用训练集训练模型
pre_y = m.predict(test2)#用模型预测test的生存情况
grade = model.score(x,y)#对模型评分
score.append(grade)#将评分加入score列表
#建立用来展示各模型评分的DataFrame
#建立方法:Dataframe中包含一个字典,字典的"键"是列名,字典的"值"是列表
result = pd.DataFrame({'Model':model_name,'Score':score})
根据评分可见决策树以及随机森林表现较好,选用这两个模型跑测试集
四、输出结果
选用决策树及随机森林预测结果
RM = RandomForestClassifier()#随机森林
DT = DecisionTreeClassifier()#决策树
RM.fit(x,y)#拟合随机森林
DT.fit(x,y)#拟合决策树
test['Survived'] = RM.predict(test)#将随机森林预测结果赋值给test
RM_result=test[['Passenger_Id','Survivied']]#提交格式
#index=Flase表示不生成index列
#生成随机森林csv结果
RM_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)
test['Survived'] = DT.predict(test)将决策树预测结果赋值给test
DT_result=test[['Passenger_Id','Survivied']]#提交格式
DT_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)#生成决策树结果
四、项目总结及反省
这次的Tatanic项目主要目的是练习使用python,作为练手项目
从目录的数据描述、特征工程及建模三方面总结
(一)数据描述:
1.导入数据时,需将测试集和训练集先合并,因特征工程会构造新特征或对原有特征进行操作,要确保测试、训练集一致
2.两变量间的关系
2.1可视化sns.barplot(x=变量A,y=变量B,data)
2.2groupby 例如:data['Survived'].groupby(data['Sex']).mean()
3.要善于挖掘分离特征中的信息,比如姓名中的不同称谓Mr Mrs Countless Jonkerr等有特定的意义 对预测值能产生重大影响
3.快速发现异常值的方法
data.describe() 观察有没有大幅偏离平均值的数据或者是不符合常识的数据
(二)特征工程
1.常用构造新特征的两种方法
#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():每一段的样本数量相同
data['Fare'] = pd.qcut(data['Fare'],5,labels=[])
2.3查看分箱后效果
#将Fare等分为5段,观察每段的存活率.
#不同的数值型变量应该调整箱子数量以求发现具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
3.字符串分割提取
#将'Mr. Yang' 的 'Yang'提取出来
data['Title'] = data['Title'].map(lambda x : x.split(',')[1])