泰坦尼克号生存预测入门

文章目录

    • 1. 数据预览
    • 2. 特征初步选择
    • 3. 增加特征`Sex`和`Embarked`
    • 4. 选择随机森林调参
    • 5. 实践总结

本文作为学习记录,参考 此处,如有侵权,联系删除。

1. 数据预览

  • 数据集下载
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
data_train = pd.read_csv("titanic_train.csv")
data_test = pd.read_csv("titanic_test.csv")
# 读取前10行
data_train.head(10)

在这里插入图片描述

data_train.info()
--------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object	# 有的原始信息缺失
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
data_test.describe() # 可见一些统计信息

在这里插入图片描述

2. 特征初步选择

  • 由于Cabin客舱号大部分都缺失,进行填补,可能会造成较大误差,不选
  • 乘客id,是个连续数据,跟是否存活应该无关,不选
  • 年龄Age,是个比较重要的特征,对缺失的部分用中位数进行填充
data_train["Age"] = data_train["Age"].fillna(data_train["Age"].median())
  • 初步调用一些模型(默认参数)进行预测:
  • algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(), LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]
from sklearn.linear_model import Perceptron
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier # boost
from sklearn.model_selection import KFold # 交叉验证
features = ["Pclass","Age","SibSp","Parch","Fare"]
algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(),LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]
for alg in algs:kf = KFold(n_splits=5,shuffle=True,random_state=1)predictions = []for train, test in kf.split(data_train):train_features = (data_train[features].iloc[train,:])train_label = data_train["Survived"].iloc[train]alg.fit(train_features,train_label)test_predictions = alg.predict(data_train[features].iloc[test,:])predictions.append(test_predictions)predictions = np.concatenate(predictions,axis=0) # 合并3组数据predictions[predictions>0.5] = 1predictions[predictions<=0.5] = 0accuracy = sum(predictions == data_train["Survived"])/len(predictions)print("模型准确率:", accuracy)

交叉验证的参数 shuffle = True,打乱数据

模型准确率: 0.531986531986532
模型准确率: 0.5488215488215489
模型准确率: 0.5566778900112234
模型准确率: 0.5353535353535354
模型准确率: 0.5712682379349046
模型准确率: 0.569023569023569
模型准确率: 0.5712682379349046
模型准确率: 0.5364758698092031

交叉验证参数 shuffle = False,正确率就提高了,why ???求解答

模型准确率: 0.5679012345679012
模型准确率: 0.6644219977553311
模型准确率: 0.6745230078563412
模型准确率: 0.632996632996633
模型准确率: 0.6947250280583613
模型准确率: 0.6980920314253648
模型准确率: 0.6644219977553311
模型准确率: 0.6846240179573513

3. 增加特征SexEmbarked

  • 上面效果不好,增加一些特征
  • 增加特征SexEmbarked,查看对预测的影响
  • 这两个特征为字符串,需要转成数字
print(pd.value_counts(data_train.loc[:,"Embarked"]))
----------------------
S    644
C    168
Q     77
Name: Embarked, dtype: int64
# sex转成数字
data_train.loc[data_train["Sex"]=="male","Sex"] = 0
data_train.loc[data_train["Sex"]=="female","Sex"] = 1
# 登船地点,缺失的用最多的S进行填充
data_train["Embarked"] = data_train["Embarked"].fillna('S') 
data_train.loc[data_train["Embarked"]=="S", "Embarked"]=0
data_train.loc[data_train["Embarked"]=="C", "Embarked"]=1
data_train.loc[data_train["Embarked"]=="Q", "Embarked"]=2
features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]

交叉验证的参数 shuffle = True,正确率依然很低,再次提问,why ???

模型准确率: 0.5521885521885522
模型准确率: 0.5432098765432098
模型准确率: 0.5185185185185185
模型准确率: 0.5286195286195287
模型准确率: 0.5230078563411896
模型准确率: 0.5252525252525253
模型准确率: 0.5723905723905723
模型准确率: 0.5196408529741863

交叉验证参数 shuffle = False,正确率相比于上面缺少特征SexEmbarked时,提高了不少,好的特征对预测结果提升很有帮助

模型准确率: 0.675645342312009
模型准确率: 0.691358024691358
模型准确率: 0.7856341189674523
模型准确率: 0.7822671156004489
模型准确率: 0.7878787878787878
模型准确率: 0.792368125701459
模型准确率: 0.6655443322109988
模型准确率: 0.8058361391694725

4. 选择随机森林调参

从上面可以看出随机森林模型的预测效果最好,使用该模型,进行调参

features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]
estimator_num = [5,10,15,20,25,30]
splits_num = [3,5,10,15]
for e_n in estimator_num:for sp_n in splits_num:alg = RandomForestClassifier(n_estimators=e_n)kf = KFold(n_splits=sp_n,shuffle=False,random_state=1)predictions_train = []for train, test in kf.split(data_train):train_features = (data_train[features].iloc[train,:])train_label = data_train["Survived"].iloc[train]alg.fit(train_features,train_label)train_pred = alg.predict(data_train[features].iloc[test,:])predictions_train.append(train_pred)predictions_train = np.concatenate(predictions_train,axis=0) # 合并3组数据predictions_train[predictions_train>0.5] = 1predictions_train[predictions_train<=0.5] = 0accuracy = sum(predictions_train == data_train["Survived"])/len(predictions_train)print("%d折数据集,%d棵决策树,模型准确率:%.4f" %(sp_n,e_n,accuracy))
3折数据集,5棵决策树,模型准确率:0.7890
5折数据集,5棵决策树,模型准确率:0.7901
10折数据集,5棵决策树,模型准确率:0.7935
15折数据集,5棵决策树,模型准确率:0.8092
3折数据集,10棵决策树,模型准确率:0.7890
5折数据集,10棵决策树,模型准确率:0.8047
10折数据集,10棵决策树,模型准确率:0.8137
15折数据集,10棵决策树,模型准确率:0.8092
3折数据集,15棵决策树,模型准确率:0.7868
5折数据集,15棵决策树,模型准确率:0.8002
10折数据集,15棵决策树,模型准确率:0.8092
15折数据集,15棵决策树,模型准确率:0.8047
3折数据集,20棵决策树,模型准确率:0.7969
5折数据集,20棵决策树,模型准确率:0.8092
10折数据集,20棵决策树,模型准确率:0.8114
15折数据集,20棵决策树,模型准确率:0.8092
3折数据集,25棵决策树,模型准确率:0.7924
5折数据集,25棵决策树,模型准确率:0.8070
10折数据集,25棵决策树,模型准确率:0.8103
15折数据集,25棵决策树,模型准确率:0.8025
3折数据集,30棵决策树,模型准确率:0.7890
5折数据集,30棵决策树,模型准确率:0.8013
10折数据集,30棵决策树,模型准确率:0.8081
15折数据集,30棵决策树,模型准确率:0.8193

最后一种参数下,随机森林模型的预测效果最好

5. 实践总结

熟悉了机器学习的基本流程

  • 导入工具包 numpy, pandas, sklearn等
  • 数据读取,pandas.read_csv(file)
  • pandas的一些数据处理
    data.head(n) 读取前n行展示
    data.info() 获取数据的信息
    data.describe() 获取统计信息(均值、方差等)
    data["Age"] = data["Age"].fillna(data["Age"].median()) 缺失数据填补(均值、最大值、根据别的特征分段填充等)
    性别等字符串特征数字化
  • 选取特征,初步预测
  • 不断的加入新的特征预测
  • 选定较好的模型,再调整这些模型的参数,选出最好的模型参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel去重_数据处理之EXCEL的高效技巧分享

这是一个技巧贴&#xff0c;直接上干货&#xff1a;1、你想在excel中看到函数值是如何计算出来的&#xff1f;Ctrl~&#xff1a;进入函数视图2、去除重复值方式有哪些?a、数据—数据工具—删除重复值(以当前选定区域排序&#xff1a;只对选中区域去重&#xff1b;扩展选定区域…

泄露了 5.33 亿 Facebook 用户的个人资料后,Meta 被罚款 2.75 亿美元

文 | 兔子酱编 | 王思若大家好&#xff0c;我是兔子酱。多年前&#xff0c;Facebook曾被曝出一个大瓜——2018 年 5 月至 2019 年 9 月期间&#xff0c;不法分子利用 Facebook 的安全漏洞从 5.33 亿人的个人资料中窃取个人信息&#xff0c;包括电话号码、位置、电子邮件地址、生…

10月24日 多云

10月24号 多云 最近不知怎么了 突然很没有食欲 不到半夜不知道饿。 中午下楼吃饭&#xff0c;走了半天也不知道想吃什么&#xff0c;索性走进了一个菜市场&#xff0c;买了一个鸡架&#xff0c;打道回府。哦对了&#xff0c;路上还买了几个苹果&#xff0c;牙总出血&#xff0c…

程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**

1. 题目 从左向右遍历一个数组&#xff0c;通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉树&#xff0c;输出所有可能生成此树的数组。 示例: 给定如下二叉树2/ \1 3 返回:[[2,1,3],[2,3,1] ]来源&#xff1a;力扣&#xff08…

在央企做程序员是种什么体验?

源 | 程序厨今天在秀哥那里看到了这篇文章&#xff0c;个人感觉对一些想要进入央企的同学&#xff0c;有一些帮助&#xff0c;大家可以看一下&#xff0c;以下为正文。朋友校招加入了某垄断央企&#xff0c;在里面从事研发工程师的工作&#xff0c;下面将分享一些入职后的一些心…

pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

编 程 的 朝 圣 之 路----------------------------------------当程序中包含多个线程时&#xff0c;CPU 不是一直被特定的线程霸占&#xff0c;而是轮流执行各个线程。那么&#xff0c;CPU 在轮换执行线程的过程中&#xff0c;即从创建到消亡的整个过程&#xff0c;可能会历经…

ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

在ASP.NET AJAX中&#xff0c;由于一个ASPX页面上只能有一个ScriptManager控件&#xff0c;所以在有母版页的情况下&#xff0c;如果需要在Master-Page和Content-Page中需要引入不同的脚本时&#xff0c;这就需要在Content-page中使用ScriptManagerProxy&#xff0c;而不是Scri…

程序员面试金典 - 面试题 16.04. 井字游戏(计数)

1. 题目 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#xff1a; 玩家轮流将字符放入空…

pygame render怎么显示中文_Pygame游戏——贪吃蛇(完结)

我们的贪吃蛇游戏基本功能已经实现&#xff0c;可以完成吃食物&#xff0c;吃到食物变长&#xff0c;得分增加&#xff0c;食物再次随机出现。但是我们有发现贪吃蛇可以穿到屏幕外面去&#xff0c;这显然是不合适的。这一次我们需要完善的是&#xff1a;游戏结束游戏结束后重新…

程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

1. 题目 假设你有两个数组&#xff0c;一个长一个短&#xff0c;短的元素均不相同。 找到长数组中包含短数组所有的元素的最短子数组&#xff0c;其出现顺序无关紧要。 返回最短子数组的左端点和右端点&#xff0c;如有多个满足条件的子数组&#xff0c;返回左端点最小的一个…

Symbian中不能跨越线程(RThread)使用的对象/组件(RSocket/Memery Heap,etc)

在Symbian C的编程中&#xff0c;出现一很多与Windows/linux用法与概念不同的东西。 首先&#xff0c;在Symbian中不建议多线程&#xff0c;因为线程的开销&#xff0c;也因为线程之间有很多东西不能传递与共享&#xff08;虽然同一进程中不同线程也是在同一个地址空间中&#…

Diffusion卷向视频,谷歌CEO劈柴亲自“带货”

源&#xff5c;机器之心编&#xff5c;张倩、杜伟谷歌、Meta 等科技巨头又挖了一个新坑。在文本转图像上卷了大半年之后&#xff0c;Meta、谷歌等科技巨头又将目光投向了一个新的战场&#xff1a;文本转视频。上周&#xff0c;Meta 公布了一个能够生成高质量短视频的工具——Ma…

pmp知识点详解-项目大牛整理_PMP核心知识点—第四章:项目整合管理(一)

文章来源&#xff1a;科科过PMP作者&#xff1a;科科过PMP由知乎号“慧翔天地PMP”推荐如有侵权请联系小编看到后第一时间处理一、制定项目章程1Inputs⑴商业文件→商业论证&#xff1a;①记录项目目标以及项目对目标的贡献②决定项目的期望结果是否值得所需投资③包含商业需求…

程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)

1. 题目 给定一组单词words&#xff0c;编写一个程序&#xff0c;找出其中的最长单词&#xff0c;且该单词由这组单词中的其他单词组合而成。 若有多个长度相同的结果&#xff0c;返回其中字典序最小的一项&#xff0c;若没有符合要求的单词则返回空字符串。 示例&#xff1a…

.net 2.0 制作 柱状图

最近项目需要用到图表,饼图,柱状图&#xff0c;这些都很常用&#xff0c;在网上找了下&#xff0c;不是自已要的&#xff0c;只好自已动手做个,先做了个柱状图,先看下效果图代码有详解下载代码 此代码在winform环境下编译通过,要用在web环境也简单&#xff0c;只需将Graphics对…

不卷大厂了,78位高校青年教师晒出工资

源&#xff5c;青塔人才综合自知乎、小红书今天&#xff0c;小编给大家搜罗了江苏、浙江、上海、广东、山东、北京、福建、广西、云南、陕西、川渝、中部、东北地区78位高校教师的薪资待遇&#xff0c;欢迎转发分享&#xff5e;江苏常四荒&#xff1a;普通高校&#xff0c;讲师…

牛客练习赛61 - A - 打怪

题目描述 你是一个勇士&#xff0c;现在你准备去森林刷毛球怪&#xff0c;你有两个属性&#xff08;血量&#xff0c;攻击力&#xff09;&#xff0c;毛球怪也有这两个属性。 当你遭遇一只毛球怪时你们会进入战斗&#xff0c;然后你和毛球怪轮流攻击&#xff08;你先手&#x…

javascript 的参数有长度限制吗?一个细节引起的误区

一个普通的javascrip函数&#xff0c;只有一个入口参数 function test(info) ... { alert(info); } 页面用是aspx代码生成&#xff0c;调用test函数的入口参数可能是一个很长的字符串&#xff0c;同时页面上根据一个数据集构造很多如下所示的标签。 < a href " jav…

CCF列表更新引热议:ICLR未上榜,NAACL等级上升

编 | 卖萌酱2021年1月&#xff0c;CCF决定启动新一轮中国计算机学会推荐国际学术会议和期刊目录&#xff08;一下简称《目录》&#xff09;调整工作并委托CCF学术工作委员会组织实施。经过前期的充分讨论和论证后&#xff0c;于2021年9月开始正式向各专委会征集调整建议。期间由…

centos mysql jar 驱动包_JDBC连接MySQL的数据库

JDBC连接MySQL的数据库开发工具&#xff1a;eclipes数据库&#xff1a;mysql 5.6jdk&#xff1a;1.8目的&#xff1a;通过简单示例&#xff0c;教会大家如何通过java的代码实现的MySQL的数据库访问。访问数据库&#xff1a;首先要加载数据库的驱动程序(只需要在第一次访问数据库…