Kaggle实战:随机森林预测泰坦尼克生存率
一、项目背景和分析需求的提出
泰坦尼克号出事后,收集了乘客的各项数据,包括:
PassengerId、Survived、Pclass、Name、Sex、Age、SibSp、Parch、Ticket、Fare、Cabin、Embarked。
要求用这些数据训练一个能够判断乘客是否生还的二分类器。
二、数据预处理
1.导入数据,熟悉数据
这是进行分析的第一步,我们需要大概了解数据集都有哪些字段,都是什么类型的变量,记录是否完整等。
import pandas as pd #用pandas库的read_csv()来读取文件,其中('')中的内容如果不在同一个环境下,用绝对路径。
titanic = pd.read_csv('train.csv')#不包括列名显示前5行,系统从0开始计数
print(titanic.head())#显示数据的各项基本数字特征:计数、均值、方差等等
print(titanic.describe())
得到结果:
PassengerId Survived Pclass \ 0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \ 0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S 4 0 373450 8.0500 NaN S
PassengerId Survived Pclass Age SibSp \ count 891.000000 891.000000 891.000000 714.000000 891.000000 mean 446.000000 0.383838 2.308642 29.699118 0.523008 std 257.353842 0.486592 0.836071 14.526497 1.102743 min 1.000000 0.000000 1.000000 0.420000 0.000000 25% 223.500000 0.000000 2.000000 20.125000 0.000000 50% 446.000000 0.000000 3.000000 28.000000 0.000000 75% 668.500000 1.000000 3.000000 38.000000 1.000000 max 891.000000 1.000000 3.000000 80.000000 8.000000 Parch Fare count 891.000000 891.000000 mean 0.381594 32.204208 std 0.806057 49.693429 min 0.000000 0.000000 25% 0.000000 7.910400 50% 0.000000 14.454200 75% 0.000000 31.000000 max 6.000000 512.329200
2.缺失值的处理。
查看每一个变量的是否有缺失:
titanic.count()
得到结果:
PassengerId 891 Survived 891 Pclass 891 Name 891 Sex 891 Age 714 SibSp 891 Parch 891 Ticket 891 Fare 891 Cabin 204 Embarked 889 dtype: int64
可知,除了Age、Cabin、Embarked三个变量外,其他变量均有891个记录,所以需要对这三个有缺失值的变量进行处理。
2.1 缺失比例过高的变量处理
Cabin只有204条记录,缺失值占比太高,直接舍弃。
2.2 数值型变量缺失值补全
数值型变量可选择该变量的各统计特征补全,如:平均值、众数、最大值、最小值等。
这里选择用平均值补全Age缺失的部分。
#数据预处理:1.将有缺失值的列补全。
titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
#Age列有很多的缺失值,用.fillna(xxx)用xxx填充Age列,并将结果赋给Age列
print(titanic["Age"].count())
得到结果:
891
2.3 字符型变量缺失值补全
变量Embarked的类型为字符型,我们可以用数量最多的值补全缺失值。先看一下Embarked的各个取值的数量。
#看一下,哪个值的数量最多
titanic.Embarked.value_counts()
得到结果:
S 644 C 168 Q 77 Name: Embarked, dtype: int64
可知,'S'的值最多,我们用'S'来补全缺失的部分。
#统计得出S值最多,所以拿S填充缺失的部分
titanic["Embarked"] = titanic["Embarked"].fillna('S')
print(titanic["Age"].count())
得到结果:
891
3.字符型变量转换为数值型变量。
字符型变量不利于计算机处理,我们需要把字符型变量转换成数值型变量。
3.1 处理变量Sex
对于变量Sex,先观察它有哪些可能值。
#打印Sex列一共有几种可能的值
print (titanic["Sex"].unique())
得到结果:
['male' 'female']
将0赋给male,1赋给female。
titanic.loc[titanic["Sex"] == "male", "Sex"] = 0
titanic.loc[titanic["Sex"] == "female", "Sex"] = 1
3.2 处理变量Embarked
观察可能值。
print(titanic["Embarked"].unique())
得到结果:
['S' 'C' 'Q' nan]
令'S'= 0 ,'C'= 1, 'Q'= 2
titanic.loc[titanic["Embarked"] == "S", "Embarked"] = 0
titanic.loc[titanic["Embarked"] == "C", "Embarked"] = 1
titanic.loc[titanic["Embarked"] == "Q", "Embarked"] = 2
4.准备训练数据集
4.1 挑选变量
选择"Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"七个变量作为训练分类器的数据集。
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]
X = titanic[predictors]
y = titanic["Survived"]
4.2 数据标准化
from sklearn import preprocessing
X = preprocessing.scale(X)
至此,数据集准备完毕,(X,y)。
三、随机森林求解。
1.引入交叉验证
将数据集分为4份做交叉验证。
from sklearn import cross_validation
kf = cross_validation.KFold(titanic.shape[0], n_folds=4, random_state=3)
2.随机森林
从sklearn中导入随机森林分类器,计算分类得分。
from sklearn.ensemble import RandomForestClassifier
RFC = RandomForestClassifier(n_estimators=80, min_samples_split=6, min_samples_leaf=1)
RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)
print(RFCscores.mean())
得到结果:
0.8305508423221427
3.随机森林改进
随机森林分类器中的树的个数,最小样本数及最小子叶数都是可以修改的。我们可以通过循环尝试找出最佳参数。这里以树的个数为例。
from sklearn.ensemble import RandomForestClassifier
a = []
b = []
for i in range(1,100):RFC = RandomForestClassifier(n_estimators=i, min_samples_split=6, min_samples_leaf=1)RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)a.append(RFCscores.mean())b.append(i)
print(max(a))
print(a.index(max(a))+1)
得到结果:
0.8406455783137398 34
作折线图看一下树的个数与得分之间的关系。
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(b,a)
plt.show()
得到结果:
可以看到,当树的数量为34时,得分最高达到84%。
四、特征工程:提炼特征,重构数据集
1.尝试构造可能与生还有关的特征(自由发挥想象力,一个充满玄学的过程)。
1.1 家庭规模大小
原始数据集中给出了兄弟姐妹SibSp和父母小孩Parch的数量,将这俩个数据加总在一起,可以得出每个乘客的家庭规模大小。
titanic["FamilySize"] = titanic["SibSp"] + titanic["Parch"]
1.2 名字的长度
原始数据中给出了每个乘客的名字,如何利用这一变量?可能名字的长度和生还率有关。
titanic["NameLength"] = titanic["Name"].apply(lambda x: len(x))
1.3 名字的称谓
外国人对于称谓比较严格,或许称谓和生还率也有关系。
#用re.search来匹配称谓
import re
def get_title(name):title_search = re.search(' ([A-Za-z]+)\.', name)if title_search:return title_search.group(1)return ""#将称谓保存在titles中
titles = titanic["Name"].apply(get_title)#将字符型的称谓转换为数值型
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 8, "Mme": 8, "Don": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}
for k,v in title_mapping.items():titles[titles == k] = v#将转换后的称谓添加到原始数据集中
titanic["Title"] = titles
1.4 欣赏一下新构建的数据集都有啥
titanic.head()
得到结果:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked FamilySize NameLength Title
0 1 0 3 Braund, Mr. Owen Harris 0 22.0 1 0 A/5 21171 7.2500 NaN 0 1 23 1
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 1 38.0 1 0 PC 17599 71.2833 C85 1 1 51 3
2 3 1 3 Heikkinen, Miss. Laina 1 26.0 0 0 STON/O2.3101282 7.9250 NaN 0 0 22 2
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) 1 35.0 1 0 113803 53.1000 C123 0 1 44 3
4 5 0 3 Allen, Mr. William Henry 0 35.0 0 0 373450 8.0500 NaN 0 0 24 1
2.用添加了3个特征的数据集重新训练随机森林分类器
#创建数据集
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked","FamilySize", "Title", "NameLength"]
X = titanic[predictors]
y = titanic["Survived"]#数据标准化
from sklearn import preprocessing
import numpy as np
X = preprocessing.minmax_scale(X,feature_range=(0,1))#引入交叉验证
from sklearn import cross_validation
kf = cross_validation.KFold(titanic.shape[0], n_folds=4, random_state=3)#随机森林求解
from sklearn.ensemble import RandomForestClassifier
RFC = RandomForestClassifier(n_estimators=56, min_samples_split=6, min_samples_leaf=1)
RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)
print(RFCscores.mean())
得到结果:
0.8327929947885104
#随机森林改进
from sklearn.ensemble import RandomForestClassifier
a = []
b = []
for i in range(1,100):RFC = RandomForestClassifier(n_estimators=i, min_samples_split=6, min_samples_leaf=1)RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)a.append(RFCscores.mean())b.append(i)
print(max(a))
print(a.index(max(a))+1)#改进效果图
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(b,a)
plt.show()
得到结果:
0.8462560093726013 54
可以看出结果比构造特征之前的结果要提升了0.6%。
3.特征重要性
有时候并不是每一个特征都对分类结果产生一个好的影响,可能去掉一些变量反而能得到更好的结果。这就需要筛选比较重要的特征。
from sklearn.feature_selection import SelectKBest, f_classif
#选择特种中最好的k个
selector = SelectKBest(f_classif, k=6)
selector.fit(X, y)
#将结果映射为容易观察的区间
scores = -np.log10(selector.pvalues_)
#画条形图
plt.bar(range(len(predictors)), scores)
plt.xticks(range(len(predictors)), predictors, rotation='vertical')
plt.show()
得到结果:
可以看出Age、SibSp、Parch、FamilySize对生还的影响不大。用前6个变量训练随机森林分类器,看一下会不会有更好的结果。
#创建数据集
predictors = ["Pclass", "Sex", "Fare", "Embarked", "Title", "NameLength"]
X = titanic[predictors]
y = titanic["Survived"]#数据标准化
from sklearn import preprocessing
import numpy as np
X = preprocessing.minmax_scale(X,feature_range=(0,1))#引入交叉验证
from sklearn import cross_validation
kf = cross_validation.KFold(titanic.shape[0], n_folds=4, random_state=3)#随机森林求解
from sklearn.ensemble import RandomForestClassifier
RFC = RandomForestClassifier(n_estimators=56, min_samples_split=6, min_samples_leaf=1)
RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)
print(RFCscores.mean())
得到结果:
0.8237991354583283
好像结果并没有变好,看一下改进后的。
#随机森林改进from sklearn.ensemble import RandomForestClassifier
a = []
b = []
for i in range(1,100):RFC = RandomForestClassifier(n_estimators=i, min_samples_split=6, min_samples_leaf=1)RFCscores = cross_validation.cross_val_score(RFC, X, y, cv=kf)a.append(RFCscores.mean())b.append(i)
print(max(a))
print(a.index(max(a))+1)
#print(RFCscores.mean())
#改进效果图
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(b,a)
plt.show()
得到结果:
0.8350250474689936 44
好吧,说明有时候变量太少,结果也不会很好。
五、还想提高准确率怎么办
做到这一步,随机森林的分类器真的已经尽力了。如果还嫌分不高,想要再往上走一走有什么办法呢?
第一,可以改变分类器,随机森林做不到的事儿,其算法可以做到,其他算法做不到,还有集成算法在后面等着,再不行还有深度学习的算法。
第二,重新构造特征,多尝试几种可能性,特种工程做得好,准确率绝对低不了,低 不 了~。
Kaggle实战:随机森林预测泰坦尼克生存率相关推荐
- 在jupytor中运行随机森林预测泰坦尼克旅客生存情况
在jupytor中运行随机森林预测泰坦尼克旅客生存情况 数据集链接链接: link. 百度网盘:链接: https://pan.baidu.com/s/1_pQ-3iG4dr0hrvU_5hYUtg ...
- 大数据预测实战-随机森林预测实战(四)-模型微调
接下来介绍下一位参赛选手--GridSearchCV(),它要做的事情就跟其名字一样,进行网络搜索,也就是一个一个地遍历,不能放过任何一个可能的参数组合.就像之前说的组合有多少种,就全部走一遍,使用方 ...
- 大数据预测实战-随机森林预测实战(一)-数据预处理
数据读取 气温预测的任务目标就是使用一份天气相关数据来预测某一天的最高温度,属于回归任务,首先观察一下数据集∶ # 数据读取 import pandas as pdfeatures = pd.read ...
- 大数据预测实战-随机森林预测实战(四)-模型调参
之前对比分析的主要是数据和特征层面,还有另一部分非常重要的工作等着大家去做,就是模型调参问题,在实验的最后,看一下对于树模型来说,应当如何进行参数调节. 调参是机器学习必经的一步,很多方法和经验并不是 ...
- 大数据预测实战-随机森林预测实战(三)-数据与特征对模型的影响
数据与特征对随机森林的影响 带着上节提出的问题,重新读取规模更大的数据,任务还是保持不变,需要分别观察数据量和特征的选寸结果的影响. 导入工具包 import pandas as pd 读取数据 fe ...
- 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
下面对比一下特征数量对结果的影响,之前两次比较没有加入新的天气特征,这次把降水.风速.积雪 3 项特征加入数据集中,看看效果怎样∶ # 准备加入新的特征 from sklearn.ensemble i ...
- 机器学习sklearn实战-----随机森林调参乳腺癌分类预测
机器学习sklearn随机森林乳腺癌分类预测 机器学习中调参的基本思想: 1)非常正确的调参思路和方法 2)对模型评估指标有深入理解 3)对数据的感觉和经验 文章目录 机器学习sklearn随机森林乳 ...
- Python使用随机森林预测泰坦尼克号生存
tags: 随机森林 kaggle 数据挖掘 categories: 数据挖掘 mathjax: true 文章目录 前言: 1 数据预处理 1.1 读入数据 1.2 训练集与数据集 1.2.1 查看 ...
- RandomForest:随机森林预测生物标记biomarker——回归
关于随机森林的简介和应用理论,请阅读之前分享的文章: 一文读懂随机森林在微生态中的应用 关于随机森林进行分类的入门实战,请阅读 之前分享的 - <RandomForest:随机森林预测生物标记b ...
最新文章
- 【青少年编程】【一级】小镇一日游
- 转 让开发自动化: 使用自动化加速部署
- Xiotech任命新CEO EMC又少一员大将
- nginx 路由配置
- java解析vue对象数组,Java数组
- Docker Windows 安装
- 20190915:(leetcode习题)对称二叉树
- 五大步骤快速搭建个人网站
- 豆瓣top250电影数据分析
- sql 给字段设置默认值,
- linux时间转excel,linux时间戳转换【操作模式】
- Java无法加载主类
- 句子反转(小米2016年笔试题)
- 交流纯电容电路中电容的容抗、容量和频率以及电压与电流的关系
- 实现小程序与SSM后台数据交互
- css3 动画还原,CSS3animation动画-案例人物走路动画:(三)
- 你考软考的心路历程是什么?
- InvalidArgumentError: slice index xxx of dimension xxx out of bounds
- ubuntu下如何控制风扇速度?
- 信息学奥赛/CSP/NOIP是什么?怎么规划?
热门文章
- declare命令,export命令
- 添加 “Microsoft Word 97 - 2003 文档” 右键功能菜单
- 小米手机运行linux,小米6成功刷入UOS国产操作系统,可开机运行
- (超详细)JAVA SE开发工具包(JDK)在Windows系统中的下载、安装和配置的方法
- 前台EasyUI哪些事一
- ce能修改服务器数据吗,ce修改游戏服务器数据库
- Firefox常用扩展(extension)推荐
- K-Means聚类 和 高斯混合模型(GMM)
- html5+php视频播放器,整理5款html5网页播放器,总有一款适合你吧
- 关机提示错误(已解决) 0x0074006e指令引用的0x0074006e内存不为read