kaggle泰坦尼克号生存预测
发布时间
阅读量:
阅读量
导入数据
train=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
train_test=pd.concat([train,test],ignore_index=True)
python
查看数据
train_test.info()
train_test.head()
python


填充缺失值
年龄、船票价格、座舱号、登船港口 均存在缺失记录
登船港口
分析登船港口字段中的缺失数据所在记录:
train_test[train_test['Embarked'].isnull()==1]
python

注意到这两个人的座位号跟车票号码都是一样的,并推测他们可能是同一团体的人,并认为他们很有可能在同一个港口下船。
train_test[train_test['Ticket'].str.contains('1135',na=False)]
python

部分票号以1135开头的乘客可能从C或S港口上船。仅凭票号无法确定登船港口。进一步观察发现:当票号以1135开头且客舱号以B开头时,在登船记录中显示所有此类情况均来自C港。因此可推断该乘客应属于C港。
train_test['Embarked'].fillna('C',inplace=True)
python
票价 :
train_test[train_test['Fare'].isnull()==1]
powershell

填充思路:可以从座位等级入手,采用舱位等级为3的均值来替代
fare=train_test[train_test['Pclass']==3]['Fare'].mean()
train_test['Fare'].fillna(fare,inplace=True)
python
研究所有与年龄无关的因素是否可能间接反映年龄的信息。通过分析数据集中的各个字段特征,在姓名中发现了乘客头衔的信息。提取出这些乘客头衔的相关信息。
def name_tran(name):
name=name.split(',')[1]
name=name.split('.')[0]
name=name.strip()
return name;
train_test['Name']=train_test['Name'].map(name_tran)
train_test['Name'].value_counts()
python

查看缺失值中,各个姓名种类的数量:
train_test[train_test['Age'].isnull()==1]['Name'].value_counts()
python

用各个姓名种类的平均值来分别填充缺失值:
Name_mean=train_test.groupby('Name').Age.mean()
train_test.set_index("Name",inplace=True)
train_test["Age"].fillna(Name_mean,inplace=True)
train_test.reset_index(inplace=True)
python
客舱号
客舱号缺失值太多,这里选择直接删除:
train_test.drop('Cabin',axis=1,inplace=True)
python
**
数据处理
**
移除Ticket、passengerId字段
passengerid仅作为表单序号存在
由于其具有大量离散值而难以分类的字段为Ticket
train_test.drop('Ticket',axis=1,inplace=True)
train_test.drop('PassengerId',axis=1,inplace=True)
train_test.info()
python

SibSp和Parch分别表示船上的兄弟姐妹数量以及直系亲属的数量,并即相当于家庭人口数量。
train_test['Family']=train_test['SibSp']+train_test['Parch']
train_test['Family'].value_counts()
python

可以把家庭人口数 进行进一步的划分:
0~3:小型家庭
4~6:中型家庭
7~:大家庭
def Family_tran(family):
if 0<=family<4:
family=1;
if 4<=family<7:
family=2;
if 7<=family:
family=3;
return family
train_test['Family']=train_test['Family'].map(Family_tran)
train_test.drop('SibSp',axis=1,inplace=True)
train_test.drop('Parch',axis=1,inplace=True)
python

姓名
在上面讨论过姓名中包含着称呼,可以根据称呼对姓名进行划分:
train_test.replace(['the Countess','Jonkheer'],'noble',inplace=True)
train_test.replace(['Major','Sir','Capt'],'official',inplace=True)
train_test.replace(['Mrs','Dona','Mme'],'women',inplace=True)
train_test.replace(['Miss','Ms','Mile','Lady'],'Lady',inplace=True)
train_test.replace(['Master','Mr'],'man',inplace=True)
train_test.replace(['Rev','Dr','Col','Don'],'Staff',inplace=True)
python
船票价格
对(Fare)船票的价格进行划分:
train_test['Fare'].describe()
python

根据价格分布,可以按下面几个等级划分:
0-15:低价
15-30:中等价格
30~:高价
def Fare_tran(fare):
if 0<=fare <16:
fare=1;
if 16<= fare <30:
fare=2;
if 30<=fare:
fare=3;
return fare
train_test['Fare']=train_test['Fare'].map(Fare_tran)
python
年龄
按照四个等级来划分年龄:
0~15:青少年和小孩
16~35:年轻人
36~60:中年人
60~:老年人
def Age_tran(age):
if 0<=age<=15:
age=1;
if 15<age<36:
age=2;
if 36<=age<60:
age=3;
if 60<=age:
age=4;
return age
train_test['Age']=train_test['Age'].map(Age_tran)
python

将所有数值类型的属性改为object:
train_test['Pclass']=train_test['Pclass'].astype('object')
train_test['Age']=train_test['Age'].astype('object')
train_test['Fare']=train_test['Fare'].astype('object')
train_test['Family']=train_test['Family'].astype('object')
python
对所有属性建立虚变量
train_test_2=pd.get_dummies(train_test)
python
模型学习
建立训练集
source_x=train_test_2.drop('Survived',axis=1).loc[:890,:]
source_y=train_test_2.loc[:890,'Survived']
pred_x=train_test_2.loc[891:,:]
python
调用sklearn包进行训练:
from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y=train_test_split(source_x,source_y,train_size=.7)
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
model.fit(train_x,train_y)
model.score(test_x,test_y)
python

得分83
预测并保存文件
pred_y=model.predict(pred_x.drop('Survived',axis=1))
pred_y=pred_y.astype(int)
passengerid=ty['PassengerId']
pred_Df=pd.DataFrame(
{'PassengerId':passengerid,
'Survived':pred_y})
pred_Df.to_csv('pred2.csv',index=False)
python
最后上传kaggle

全部评论 (0)
还没有任何评论哟~
