背景

关于 Kaggle

这是一个为你提供完美数据,为你提供实际应用场景,可以与小伙伴在数据挖掘领域 high 的不要不要的的地方啊!!!

Kaggle 是一个用来学习、分享和竞赛的线上数据实验平台,有点类似 KDD—CUP(国际知识发现和数据挖掘竞赛),企业或者研究者可以将背景、数据、期望指标等发布在 kaggle 上,用竞赛的方式向全世界的数据科学家和爱好者寻求解决方案。热爱数(dong)据(shou)挖(zhe)掘(teng)的小伙伴们可以下载/分析数据,使用统计/机器学习/数据挖掘等方面的知识,建立算法模型,得出结果并提交,排名靠前可能还会有奖励哦!

关于泰坦尼克号之灾

问题背景页

下载 Data 的页面

泰坦尼克号问题背景

就是大家从小到大被洗脑的“u jump I jump”的「jack 和 rose」的故事了。游艇在撞击了一个冰山后沉没了。乘客们都惊慌失措,副船长「lady and kid first」,所以模型不会向抛硬币那样看脸决定你是否获救。而是有着一定背景的,至于出了女士和孩子优先,还有哪些值得我们考虑,这就是稍后我们在特征工程中解决的问题了。

训练和测试数据是一些乘客的个人信息以及存活情况,尝试应用这些数据来建立一个合适的模型进行预测。

这是一个二分类问题(survived 或者 not),本文尝试用 logistic regression 来处理问题

说明

「没有所谓的算法优劣,也没有绝对高性能的机器学习算法,只有在特定的场景、数据和特征下更合适的机器学习的算法。」由于还只是在学习阶段,对于 XGBC、随机森林、SVC 还不了解,本文所用的算法只是 logistic regression。

初识数据

在 Data 下我们会看到官方给的 train.csv 和 test.csv 两个文件,分别是训练和测试数据。我们可以使用 virtualenv 来创建一个“隔离”的 python 应用环境(虚拟环境)。在这里,你不需要考虑系统原有库的版本,只需要 pip 来管理你需要用到的一切。

import pandas as pd

import numpy as np

from pandas import Series,DataFrame

data_train = pd.read_csv("./train.csv")

pd.DataFrame(data_train)

pandas 是常用的 python 数据处理包,把 csv 文件读入成 dataframe 格式,在 jupyter notebook 中,可以看到我们的数据长什么样:

我们就可以把它看作一张 excel 表格,共有 12 列,891 行(代表在 train_csv 中共有 891 个乘客)。Survived 字段代表该乘客是否获救(1 代表获救,0 代表没有获救),其余是一些个人信息

passengerId => 乘客的 ID

Pclass => 乘客所在舱位的等级(1、2、3 等舱)

Name => 姓名

Sex => 性别

Age => 年龄

SibSp => 兄弟姐妹个数

Parch => 父母与小孩个数

Ticket => 船票信息

Fare => 票价

Cabin => 客舱信息

Embarked => 登船所在港口

data_train.info()

这里告诉了我么一些关于 data_train 的基本信息,比如共有 891 个乘客,但是有些字段的数据不全。比如 Age(年龄)、Cabin(客舱信息)。

data_train.describe()

在这里我们看到了什么信息呢?从 mean 行中约有 0.38 的人最后获救了,乘客的平均年龄为 29.7 岁,平均票价为 32.20

数据初步分析

每个乘客大概有 12 种属性提供给我们,仅仅对于上面两行操作对于数据的了解还无法为我们提供想法和思路,我们现在不知道哪些有用哪些对于模型没有用,所以到了最关键的特征工程环节。我们知道最终的 output 是 Suvived,现在需要寻找最后的 Survived 与各个属性之间有着什么样的内在关系。从大副的口中已经得知「要首先考虑妇女和儿童」。

for x in data1_x:

if data1[x].dtype != 'float64' :

print('Survival Correlation by:', x)

print(data1[[x, Target[0]]].groupby(x, as_index=False).mean())

print('-'*10, '\n')

print(pd.crosstab(data1['Title'],data1[Target[0]]))

在本图中,我们发现女性有 0.74 活下来,而男性只有 0.18。歪果盆友果然很尊重 lady,lady first 践行得不错。性别无疑要作为重要特征加入最后的模型之中。在 Pclass 中,客舱为等级 1 的乘客获救的概率高很多,嗯这个一定也影响最后获救的结果(等级高的乘客一定也更有钱)。

fig = plt.figure()

fig.set(alpha=0.2)

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()

Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()

df=pd.DataFrame({'Survived':Survived_1, 'unSurvived':Survived_0})

df.plot(kind='bar', stacked=True)

plt.title("Survived status of all passenger classes")

plt.xlabel("passanger's level")

plt.ylabel("number")

plt.show()

从本图中我们可以看到,明显如果你是等级为 1 的乘客,你的获救概率就会很高。对了,这也是会最终影响输出的获救结果的一个特征。

data_train.Age[data_train.Pclass == 1].plot(kind='kde')

data_train.Age[data_train.Pclass == 2].plot(kind='kde')

data_train.Age[data_train.Pclass == 3].plot(kind='kde')

plt.xlabel("age")# plots an axis lable

plt.ylabel("dendity")

plt.title("Age distribution of passengers levels")

plt.legend(('first level', 'second level','third level'),loc='best')

从各等级乘客的年龄分布中,我们可以看到「不同舱位/乘客等级可能和财富/地位有关系,最后获救概率可能会不一样」,所以年龄也会是影响我们最终结果的原因之一。

简单数据预处理

我们对大体数据已经看过一遍了,对于感兴趣的属性也有了大概的了解。现在我们需要 简单处理一下这些数据,为机器学习建模做点准备了。先从最突出的数据属性开始吧,Cabin 和 Age,因为这两项有些乘客的信息不包含它们,有丢失的数据对于下一步的工作影响太大。

先说 Cabin,暂时我们就按照刚才说的,按 Cabin 有无数据,将这个属性处理成 Yes 和 No 两种类型吧。

再说 Age:

通常遇到缺值的情况,我们会有几种常见的处理方式

如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入 noise,影响最后的结果了

如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把 NaN 作为一个新类别,加到类别特征中

如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个 step(比如这里的 age,我们可以考虑每隔 2/3 岁为一个步长),然后把它离散化,之后把 NaN 作为一个 type 加到属性类目中。

有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。

本例中,因为 Cabin 不是影响最终结果的特征之一。所以直接考虑别的需要用到的特征(性别,等级,等级),并将其中的类目型转化为数值型特征,我们可以使用 pandas 的“get_dummies”来完成这个工作,并接在原来的“data_train”上

dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')

dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex')

dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')

df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)

df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Embarked'], axis=1, inplace=True)

df

na!我们将这些类目属性成功转化为 0,1 的数值属性了。这样看来,好像差不多都完成了,可是如果再看看 Age 和 Fare 两个属性,乘客关于这两个属性的数值变化幅度也太大了!!如果大家了解逻辑回归与梯度下降的话,会知道各属性之间的 scale 差距太大,将对收敛速度造成很大的伤害(甚至不收敛)... 所以我们先用 scikit-learn 里面的 preprocessing 模块对这两个属性做一个处理(就是将变化幅度较大的特征化到 [-1,1] 内)

import sklearn.preprocessing as preprocessing

scaler = preprocessing.StandardScaler()

age_scale_param = scaler.fit(df['Age'])

df['Age_scaled'] = scaler.fit_transform(df['Age'], age_scale_param)

fare_scale_param = scaler.fit(df['Fare'])

df['Fare_scaled'] = scaler.fit_transform(df['Fare'], fare_scale_param)

df

嗯,这样初级的数据处理就完成的差不多了

建模

我么把需要的 feature 字段提取出来,转成 numpy 格式,使用 scikit-learn 中的 LogisticRegression 建模。

from sklearn import linear_model

# 用正则取出我们要的属性值

train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')

train_np = train_df.as_matrix()

# y 即 Survival 结果

y = train_np[:, 0]

# X 即特征属性值

X = train_np[:, 1:]

# fit 到 RandomForestRegressor 之中

clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)

clf.fit(X, y)

clf

OK!!!通过这样建模后,我们得到一个 model,然后再把 test.csv 通过同样的数据简单处理后,就可以得到预测结果了。

系统优化

等等,你以为这样就完了么。这其实只完成了刚刚开始的一步,我们只是做了一个 baseline model,一切都还是基础的,我们还需要优化。

不过在现在的场景下,先不着急做这个事情,我们这个 baseline 系统还有些粗糙,先再挖掘挖掘。

首先,Name 和 Ticket 两个属性被我们完整舍弃了 (好吧,其实是因为这俩属性,几乎每一条记录都是一个完全不同的值,我们并没有找到很直接的处理方式)。

然后,我们想想,年龄的拟合本身也未必是一件非常靠谱的事情,我们依据其余属性,其实并不能很好地拟合预测出未知的年龄。再一个,以我们的日常经验,小盆友和老人可能得到的照顾会多一些,这样看的话,年龄作为一个连续值,给一个固定的系数,应该和年龄是一个正相关或者负相关,似乎体现不出两头受照顾的实际情况,所以,说不定我们把年龄离散化,按区段分作类别属性会更合适一些。(大家去 kaggle 上可以看看大神的 kernels)

文 / joeCDC

数学爱好者

编 / 荧声

本文已由作者授权发布,版权属于创宇前端。欢迎注明出处转载本文。本文链接:https://knownsec-fed.com/2018...

想要订阅更多来自知道创宇开发一线的分享,请搜索关注我们的微信公众号:创宇前端(KnownsecFED)。欢迎留言讨论,我们会尽可能回复。

欢迎点赞、收藏、留言评论、转发分享和打赏支持我们。打赏将被完全转交给文章作者。

感谢您的阅读。

Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号相关推荐

  1. 人工智障也刷题!Kaggle 入门之实战泰坦尼克号

    背景 关于 Kaggle www.kaggle.com/ 这是一个为你提供完美数据,为你提供实际应用场景,可以与小伙伴在数据挖掘领域 high 的不要不要的的地方啊!!! Kaggle 是一个用来学习 ...

  2. 软通动力华为java机考题库_华为机考笔试刷题-java-1

    题库来源 计算字符个数 写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. public static void main(String[ ...

  3. 2021新年算法小专题—2.股票买卖利润刷题(Java)

    本篇是股票买卖问题的更多题解,在上一篇文章中我们已经介绍了这一题型,实际上是一类dp问题,我们用自动机的思想去解决,在上一篇中我们以一道限定只买卖一次股票的题目为例进行了讲解,文章链接.下面我们继续完 ...

  4. 人工蜂群算法python_人工蜂群算法简介与程序分析

    目前人工蜂群算法主要分为基于婚配行为与基于釆蜜行为两大类,本文研究的是基于釆蜜行为的人工蜂群算法. 蜜蜂采蜜 自然界中的蜜蜂总能在任何环境下以极高的效率找到优质蜜源,且能适应环境的改变.蜜蜂群的采蜜系 ...

  5. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  6. 算法记录 牛客网 leetcode刷题记录

    算法记录 & 牛客网 & leetcode刷题记录 解题思路 STL容器 常用算法模板 堆排序 插入排序 快速排序 BFS层序遍历 二叉树 JZ55 二叉树的深度 BST(binary ...

  7. 人工蜂群算法_如果你的团队能够像人工蜂群一样战斗

    无人机航迹规划那些事儿-人工蜂群算法 无人机航迹规划问题有机器人路径规划问题延伸而来.三维环境下无人机航迹规划问题相较于二维环境规划较为复杂.航迹规划通常按一下流程:先对航迹规划空间进行数学建模,预先 ...

  8. python智能优化算法_人工蜂群(ABC)算法的群体智能优化问题方法(Python完整实现)...

    这些算法已被证明在解决实际问题方面非常有效.一些可以使用SI算法解决的任务是聚类,行星映射,控制纳米机器人和数据挖掘中的各种问题,如特征选择和分类. 在数学上讲,要使用计算智能算法解决现实世界中的优化 ...

  9. 擦地机器人修理_不要智障机器人,擦地机器人就选iRobot,干湿两擦用了就知道...

    笔者的工作单位离家稍远,所以家庭的清洁任务一直是老婆大人承担,在有了孩子之后时间就变得更加紧张,也是看在眼里疼在心里,而父母年纪大了更不想麻烦两位老人,所以一直就想着能有一款懒人机器人给老婆大人当一个 ...

  10. 人工鱼群算法python_人工鱼群算法简介及应用

    简介 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到启发而阐述的仿生学优化方案.在一片水域中,鱼往往能自行或尾随其他鱼找到营养物质多的地方,因而鱼生 ...

最新文章

  1. きゃらコレ! -ALICESOFT- 汉化补丁
  2. 永远不要去依赖别人_读书心得马琴:永远不要依靠别人来保证你的安全读后感...
  3. 怎样用python自动化办公_会python基础,如何学习自动化办公?
  4. 手机无法配置exchange客户端的解决方法
  5. 相机开发:海康板卡相机开发
  6. centos7安装docker安装rabbitmq(2021)亲测有效!!!
  7. centos 卸载软件_Linux系统配置及服务管理_第09章_软件管理
  8. Web服务器的配置与管理(2) 虚拟主机技术
  9. mysql 关联更新_跳出初学MySQL知识的原理整理(一)
  10. python小工具(一)
  11. underscore源码剖析之整体架构
  12. android真实项目教程(二)——漫画App初构_by_CJJ
  13. Python3常用正则表达式
  14. Ubuntu解压文件的方法
  15. 分享一个在线生成接口文档工具
  16. 警惕!这5种“脸色”在暗示你这些健康问题!
  17. 踩坑合集(1)——虚拟机桥接模式下的连网问题
  18. 网狐6603服务器文档,【整理发布】网狐 6603 棋牌平台搭建图文详解(二)
  19. Twaver-HTML5基础学习(11)形状节点(ShapeNode)
  20. OpenBSD安装(转)

热门文章

  1. Nextflow patterns
  2. Java游戏项目之黄金矿工
  3. Java开发从零开始!java游戏服务器开发教程
  4. [Pytorch系列-25]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 2
  5. tensorflow2.X tf.data.Dataset详解
  6. 如何在Pidgin中为您的域帐户设置Google Talk
  7. dnf超时空漩涡副本路线流程图_DNF超时空漩涡副本怎么过_DNF超时空漩涡副本快速达成图文攻略...
  8. linux php muma,php实现Linux服务器木马排查及加固功能
  9. 【本周最新】qlv转mp4格式转换器 工具 软件
  10. 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)