26 kaggle titanic生存预测总结

1 导入数据并查看数据

1.1 数据集的拼接

数据导入后通过append拼接训练集和测试集,便于特征提取时同时处理训练集和测试集

full = train.append(test,sort=False,ignore_index=True)
  • 设置参数sort=False保证拼接后数据列为原始顺序,如果不设置则列按照字母排序。
  • 设置 ingore_index=True 表示重生成index,避免index重复
full2 = pd.concat([train,test],sort=False,ignore_index=True)

得到相同的结果。

1.2 查看数据集基本信息
full.describe()
image.png

获取数据集中的数值类别的统计信息,包括数量、平均值、标准差、最小值,升序25%的值,百分之50的值,百分之75的值和最大值。

full.info()
image.png

统计数据数量,数据类别,所占存储空间。通过该统计信息能够发现哪列由缺失值。便于下一步进行数据清洗。

2 数据清洗

数据清洗三种方法:

  • 如果是数值类型,用平均值取代
  • 如果是分类数据,用最常见的类别取代
  • 使用模型预测缺失值
# 用平均值取代年龄的缺失值
full['Age'] = full['Age'].fillna(full['Age'].mean())

列数据通过列名‘Age’直接取值,fillna方法用于缺失值的填充,.mean()方法取得平均值。

 # 字符串缺失值的处理,Embarked缺两条,Cabin缺1014条
full['Embarked'].value_counts() 

value_counts()方法统计类别频次,下一步将用出现最多的类别代替缺失值

full['Embarked'] = full['Embarked'].fillna('S')
# 缺失值比较多,Canbin缺失值填充为U,表示未知(Uknow)
full['Cabin'] = full['Cabin'].fillna('U')

如果缺失值太多,则用一个新的类别代替缺失值。

3 特征提取

数据类型分析:
(1)数值类型
(2)时间序列
(3)分类数据
a)有直接类别的
b)字符串类型

3.1 有直接类别且只有两类的分类数据
# 将性别值映射为数值,男(male)为1,女(female)为0
sex_mapDict = {'male':1,'female':0}
full['Sex']=full['Sex'].map(sex_mapDict)   # 通过map方法,接收字典参数进行映射
full.head()

有直接类别的数据类型,通过字典利用map方法直接映射

3.2 有直接类别且多余两类的数据
# 将 Embarked 映射为one-hot形式
embarkedDf = pd.DataFrame()
# 使用get_dummies进行one-hot编码,产生虚拟变量(dummy variables),列名前缀为Embarked
embarkedDf = pd.get_dummies(full['Embarked'], prefix='Embarked')
embarkedDf.head()
image.png

pd.get_dummies()方法传入单列字符串数据,生成多列one-hot数据类型

full = pd.concat([full,embarkedDf], axis=1)
full.drop('Embarked', axis=1,inplace=True)
full.head()

生成的多列one-hot数据,与原数据进行拼接,然后删除原始列。

3.3 根据行业知识对原始字符串进行处理,映射,然后转化为one-hot

3.3.1 获取字符串的某一部分

# 从姓名中获取头衔
# Braund,Mr.Pwen Harris 逗号前面时'名',逗号后面时'头衔.姓'
def getTitle(name):
    str1 = name.split(',')[1] # Mr. Owen Harris
    str2 = str1.split('.')[0]  # Mr
    # strip方法移除字符串头尾指定的字符
    str3 = str2.strip()
    return str3
titleDf = pd.DataFrame()
titleDf['Title'] = full['Name'].map(getTitle)
titleDf.iloc[30:40]

利用map和lambda函数获取一列数据的首字母

cabinDf = pd.DataFrame()
full['Cabin'] = full['Cabin'].map(lambda c:c[0])

3.3.2 定义映射关系

# 定义头衔映射关系?
title_mapDict = {
                    "Capt":       "Officer",
                    "Col":        "Officer",
                    "Major":      "Officer",
                    "Jonkheer":   "Royalty",
                    "Don":        "Royalty",
                    "Sir" :       "Royalty",
                    "Dr":         "Officer",
                    "Rev":        "Officer",
                    "the Countess":"Royalty",
                    "Dona":       "Royalty",
                    "Mme":        "Mrs",
                    "Mlle":       "Miss",
                    "Ms":         "Mrs",
                    "Mr" :        "Mr",
                    "Mrs" :       "Mrs",
                    "Miss" :      "Miss",
                    "Master" :    "Master",
                    "Lady" :      "Royalty"
                    }
# 通过map函数,对Series每个数据使用定义的字典进行映射
titleDf['Title'] = titleDf['Title'].map(title_mapDict)

3.3.3 使用pd.get_dummies进行one-hot编码

titleDf = pd.get_dummies(titleDf['Title'])
full = pd.concat([full,titleDf], axis=1)
full.drop('Name',axis=1,inplace=True)

3.3.4 构造特征

# 家庭信息特征提取
familyDf = pd.DataFrame()
familyDf['FamilySize'] = full['Parch'] + full['SibSp'] + 1
# 人数=1 小家庭,2<=人数<=4 中等家庭,人数 > 5 大家庭
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 s>=5 else 0)
familyDf.head()

4 特征选择

# 计算各个特征的相关系数
corrDf = full.corr()
corrDf

full.corr()计算各个特征的相关系数

# 查看各个特征与生存情况(Survived)的相关系数
corrDf['Survived'].sort_values(ascending=False)

通过sort_values进行排序

选择特征,使用pd.concat()方法进行合并

# 根据各个特征与生存情况的相关系数大小,选择几个特征作为模型的输入
# 头衔(titleDf),客仓等级(篇classDf),家庭大小(familyDf),船票价格(Fare),船舱号(cabinDf),登船港口(embaredDF),性别(Sex)
full_X = pd.concat([titleDf,
                   PlclassDf,
                   familyDf,
                   full['Fare'],#船票价格
                   cabinDf, # 船舱号
                   embarkedDf, # 登船港口
                   full['Sex'], # 性别  
                   ],axis=1)

full_X.head()

5 构建模型

5.1 从特征数据中选取训练集数据
  • 训练集特征
# 原始数据集有891行
sourceRow = 891
# 原始数据:特征
source_X = full_X.loc[0:sourceRow-1,:]
  • 训练集标签
# 原始数据:标签
source_y = full.loc[0:sourceRow-1,'Survived']
source_y
  • 预测集特征
# 预测数据集:特征
pred_X = full_X.loc[sourceRow:,:]
  • 进一步把训练集分为训练集和测试集
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=0.8)
5.2 选择机器学习算法计算的到结果
# 第一步: 选择一个机器学习算法,用于模型的训练
from sklearn.linear_model import LogisticRegression
# 第二步:创建模型:逻辑回归
model = LogisticRegression()
# 第三步: 训练模型
model.fit(train_X, train_y)
# 第四步:分类问题,score得到的是模型的正确率
model.score(test_X, test_y)
# 第五步:在预测集上计算得到的结果
pred_Y = model.predict(pred_X)
# 第六步:结果导出
pred_Y = pred_Y.astype(int)
passenger_id = full.loc[sourceRow:,'PassengerId']
predDf = pd.DataFrame({'PassengerId':passenger_id,
                      'Survived':pred_Y})
predDf.to_csv('titanic_pred.csv', index=False)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 机器学习术语表 本术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义。 A A/B 测试 (...
    yalesaleng阅读 1,961评论 0 11
  • 本项目数据来源于https://www.kaggle.com/c/titanic,是Kaggle上一个非常经典的比...
    LilyandJulie阅读 1,665评论 0 1
  • 本文编译自谷歌开发者机器学习术语表项目,介绍了该项目所有的术语与基本解释。 A 准确率(accuracy) 分类模...
    630d0109dd74阅读 1,990评论 0 1
  • 《朗读者》是最近广为称赞的综艺节目,堪称综艺节目里的一股“清流”。对此,我是十分赞同的,因为我是书籍的忠实爱...
    竹芒一阅读 222评论 0 1
  • 今天周一,清晨艾哲在闹铃声中睁开惺忪的双眼,“妈妈,又不能睡到自然醒了,唉,,好命苦啊。真想回到幼儿园啊,晚点去学...
    艾哲麻麻阅读 105评论 0 0