Kaggle教程:EDA和机器学习

本文概述

本月初, 我做了一个Facebook Live Code With Session, 在其中, 我(以及每个进行编码的人)构建了几种算法, 这些算法的复杂性不断提高, 它们根据给定的数据(例如票价)来预测泰坦尼克号上任何给定的乘客是否幸免于难。有偿, 他们出发的地点和年龄。

在本文中, 你将介绍本节中我们讨论的一些内容。如果你想重新观看或跟随此帖子以及视频, 可以在这里观看:

特别是, 你可能还记得我们建立了监督学习模型。

监督学习是机器学习(ML)的一个分支, 它涉及预测标签, 例如”生存”或”未”。这样的模型从标记的数据中学习, 标记的数据是包括乘客是否幸存的数据(称为”模型训练”), 然后根据未标记的数据进行预测。

在Kaggle(预测性建模和分析竞赛的平台)上, 这些被称为训练和测试集, 因为

  • 你想要建立一个模型来学习训练集中的模式, 并且
  • 然后, 你可以使用模型对测试集进行预测。

然后Kaggle告诉你你正确的百分比:这就是你模型的准确性。

如何从监督学习开始

你可能已经知道, 进行监督学习的一种好方法是:

  • 对数据集执行探索性数据分析(EDA);
  • 建立一个快速而肮脏的模型或基线模型, 可以与你将要建立的以后的模型进行比较;
  • 重复此过程。你将进行更多的EDA并建立另一个模型;
  • 工程师功能:利用你已经拥有的功能并将其组合或从中提取更多信息, 最终达到最后一点
  • 获得性能更好的模型。

在会话中的这段代码中, 你已经或将完成所有这些步骤!

请注意, 我们还开设了一些课程, 帮助你开始使用Python和R中的Titanic数据集进行机器学习。

导入数据并签出

第一步始终是导入数据, 以快速签出将要使用的数据。在这种情况下, 你将导入pandas包, 并利用read_csv()函数读取数据:

请注意, 在下面的代码块中, 已经导入了其他软件包和软件包模块, 如matplotlib, sklearn和seaborn。稍后, 你将在(统计)数据可视化和机器学习目的中更广泛地使用它们!

你还可以内联使用IPython魔术命令%matplotlib, 以使绘图在笔记本中内联显示。你还可以将sns.set()添加到代码块中, 以将可视化样式更改为基本的Seaborn样式:

# Import modules
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.metrics import accuracy_score

# Figures inline and set visualization style
%matplotlib inline
sns.set()

事不宜迟, 让我们导入数据并已开始检查数据的第一步:

# Import test and train datasets
df_train = pd.read_csv('../data/train.csv')
df_test = pd.read_csv('../data/test.csv')

# View first lines of training data
df_train.head(n=4)
旅客编号 幸存下来 P类 名称 性别 年龄 锡卜 版本号 票 做 舱 出发
0 1 0 3 布朗德, 欧文·哈里斯先生 男 22.0 1 0 A / 5 21171 7.2500 NaN 小号
1 2 1 1 卡明斯, 约翰·布拉德利夫人(佛罗伦萨·布里格斯 女 38.0 1 0 电脑17599 71.2833 C85 C
2 3 1 3 海基宁小姐贷款 女 26.0 0 0 STON / O2。 3101282 7.9250 NaN 小号
3 4 1 1 Futrelle, Jacques Heath夫人(莉莉·梅·皮尔) 女 35.0 1 0 113803 53.1000 C123 小号

如果你想查看所有这些功能, 请在此处查看Kaggle数据文档。

在继续之前, 最好考虑以下术语:

  • 目标变量是你要预测的变量;
  • 其他变量称为”功能”(或”预测变量”, 即用于预测目标变量的功能)。

考虑到这一点, 你可以继续使用例如head()函数检出数据, 该函数可用于提取数据集的前五行:

# View first lines of test data
df_test.head()
旅客编号 P类 名称 性别 年龄 锡卜 版本号 票 做 舱 出发
0 892 3 凯利·詹姆斯先生 男 34.5 0 0 330911 7.8292 NaN q
1 893 3 威尔克斯, 詹姆斯夫人(艾伦·尼德斯) 女 47.0 1 0 363272 7.0000 NaN 小号
2 894 2 迈尔斯, 托马斯·弗朗西斯先生 男 62.0 0 0 240276 9.6875 NaN q
3 895 3 维尔茨, 阿尔伯特先生 男 27.0 0 0 315154 8.6625 NaN 小号
4 896 3 赫沃宁, 亚历山大夫人(Helga E Lindqvist) 女 22.0 1 1 3101298 12.2875 NaN 小号

请注意, df_test DataFrame没有” Survived”列, 因为这是你将要预测的结果!

  • 你还可以使用DataFrame .info()方法签出数据类型, 缺少的值以及更多(df_train的)。
df_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.6+ KB

在这种情况下, 你看到具有891行的DataFrame中的”年龄”列只有714个非空值。这意味着有177个空值或缺失值。

  • 另外, 请使用DataFrame .describe()方法签出(df_train)数字列的摘要统计信息。
df_train.describe()
旅客编号 幸存下来 P类 年龄 锡卜 版本号 做
计数 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
意思 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
小时 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
我 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
最大值 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200

可视探索性数据分析(EDA)和你的第一个模型

现在你已经了解了数据的样子并检查了一些统计数据, 现在该借助seaborn软件包来可视化数据了:

  • 例如, 使用seaborn构建泰坦尼克号生存的条形图, 这是你的目标变量。
sns.countplot(x='Survived', data=df_train);
Kaggle教程:EDA和机器学习1

要点:在培训中, 幸存的人少于没有幸存的人。然后, 让我们建立第一个模型, 该模型可以预测没有人幸存。

你知道人们幸存下来, 这是一个糟糕的模型。但这为我们提供了一个基准:我们以后建立的任何模型都需要做得更好。

你可以按照以下步骤进行操作:

  • 为df_test创建一列”生存”, 为所有行编码”不生存”;
  • 将df_test的’PassengerId’和’Survived’列保存到.csv并提交给Kaggle。
df_test['Survived'] = 0
df_test[['PassengerId', 'Survived']].to_csv('data/predictions/no_survivors.csv', index=False)

这给你带来了什么精度? Kaggle的准确度是62.7。

Kaggle教程:EDA和机器学习2

还不错!

重要说明!你还将希望使用准确性以外的指标!

有关特征变量的EDA

现在, 你已经建立了一个快速而又肮脏的模型, 现在该重申一下:让我们做更多的探索性数据分析并尽快建立另一个模型!

  • 你可以使用seaborn构建Titanic数据集功能”性”(df_train的)的条形图。
sns.countplot(x='Sex', data=df_train);
Kaggle教程:EDA和机器学习3
  • 此外, 还可以使用seaborn在特征”性别”上构建”泰坦尼克号”数据集特征”生存”分割(多面)的条形图。
sns.factorplot(x='Survived', col='Sex', kind='count', data=df_train);
Kaggle教程:EDA和机器学习4

要点:女人比男人更有可能生存。

  • 通过此小菜一碟, 你可以使用熊猫来算出有多少女性和多少男性得以幸存:
df_train.groupby(['Sex']).Survived.sum()
Sex
female    233
male      109
Name: Survived, dtype: int64
  • 用熊猫算出存活下来的女性比例和男性比例:
print(df_train[df_train.Sex == 'female'].Survived.sum()/df_train[df_train.Sex == 'female'].Survived.count())
print(df_train[df_train.Sex == 'male'].Survived.sum()/df_train[df_train.Sex == 'male'].Survived.count())
0.742038216561
0.188908145581

74%的女性得以幸存, 而19%的男性得以幸存。

现在让我们建立第二个模型, 并预测所有女性都可以幸存下来, 而所有男性都没有。再一次, 这是一个不切实际的模型, 但是它将提供一个基准以与将来的模型进行比较。

  • 为df_test创建一列” Survived”, 以对上述预测进行编码。
  • 将df_test的’PassengerId’和’Survived’列保存到.csv并提交给Kaggle。
df_test['Survived'] = df_test.Sex == 'female'
df_test['Survived'] = df_test.Survived.apply(lambda x: int(x))
df_test.head()
旅客编号 P类 名称 性别 年龄 锡卜 版本号 票 做 舱 出发 幸存下来
0 892 3 凯利·詹姆斯先生 男 34.5 0 0 330911 7.8292 NaN q 0
1 893 3 威尔克斯, 詹姆斯夫人(艾伦·尼德斯) 女 47.0 1 0 363272 7.0000 NaN 小号 1
2 894 2 迈尔斯, 托马斯·弗朗西斯先生 男 62.0 0 0 240276 9.6875 NaN q 0
3 895 3 维尔茨, 阿尔伯特先生 男 27.0 0 0 315154 8.6625 NaN 小号 0
4 896 3 赫沃宁, 亚历山大夫人(Helga E Lindqvist) 女 22.0 1 1 3101298 12.2875 NaN 小号 1
df_test[['PassengerId', 'Survived']].to_csv('../data/predictions/women_survive.csv', index=False)

现在, 当你将模型提交给Kaggle时, 该模型为你提供了什么精度?

Kaggle的准确度是76.6%:

Kaggle教程:EDA和机器学习5

通过此提交, 你在排行榜中上升了约2, 000个位置!此外, 你还提高了分数, 因此做得很好!

进一步探索你的数据!

  • 使用seaborn在特征” Pclass”上构建”泰坦尼克号”数据集特征” Survived”的条形图(刻面)。
sns.factorplot(x='Survived', col='Pclass', kind='count', data=df_train);
Kaggle教程:EDA和机器学习6

要点:头等舱旅行的乘客更有可能幸存。另一方面, 乘坐三等舱的旅客很难幸免。

  • 使用seaborn来构建泰坦尼克号数据集特征”生存”的条形图(在特征上”分割”(刻面))。
sns.factorplot(x='Survived', col='Embarked', kind='count', data=df_train);
Kaggle教程:EDA和机器学习7

要点:登上南安普敦的乘客存活的可能性较小。

具有数字变量的EDA

  • 使用seaborn绘制df_train的”票价”列的直方图。
sns.distplot(df_train.Fare, kde=False);
Kaggle教程:EDA和机器学习8

外卖:大多数乘客乘坐泰坦尼克号旅行的费用不到100美元。

  • 使用熊猫绘图方法在同一绘图上为”生存”的每个值绘制”票价”列。
df_train.groupby('Survived').Fare.hist(alpha=0.6);
Kaggle教程:EDA和机器学习9

要点:似乎那些付更多钱的人生存的机会更高。

  • 使用seaborn绘制df_train的”年龄”列的直方图。你需要先删除空值。
df_train_drop = df_train.dropna()
sns.distplot(df_train_drop.Age, kde=False);
Kaggle教程:EDA和机器学习10
  • 在x轴上绘制带”幸存者”的地带图和群体图。
sns.stripplot(x='Survived', y='Fare', data=df_train, alpha=0.3, jitter=True);
Kaggle教程:EDA和机器学习11
sns.swarmplot(x='Survived', y='Fare', data=df_train);
Kaggle教程:EDA和机器学习12

要点:票价显然与铁达尼号的生存息息相关。

  • 使用DataFrame方法.describe()来检查”票价”作为生存函数的摘要统计信息。
df_train.groupby('Survived').Fare.describe()
计数 意思 小时 我 25% 50% 75% 最大值
幸存下来
0 549.0 22.117887 31.388207 0.0 7.8542 10.5 26.0 263.0000
1 342.0 48.395408 66.596998 0.0 12.4750 26.0 57.0 512.3292
  • 使用seaborn绘制”年龄”对”票价”的散点图, 并用”生存”着色。
sns.lmplot(x='Age', y='Fare', hue='Survived', data=df_train, fit_reg=False, scatter_kws={'alpha':0.5});
Kaggle教程:EDA和机器学习13

要点:似乎那些幸存者要么花了很多钱买票, 要么还年轻。

  • 使用seaborn创建df_train的对图, 并用” Survived”着色。对图是一种在单个图网格中显示你已经发现的大多数信息的好方法。
sns.pairplot(df_train_drop, hue='Survived');
Kaggle教程:EDA和机器学习14

从EDA到机器学习模型

在本教程中, 你已成功:

  • 加载我们的数据并进行了查看。
  • 直观地探索了我们的目标变量, 并做出了第一个预测。
  • 可视化地探索了我们的一些特征变量, 并根据我们的EDA做出了更好的预测。
  • 对分类和数字特征变量进行了认真的EDA处理。

在下一篇文章中, 你将花时间根据在这里从EDA中学到的知识来构建一些机器学习模型。我们将在该项目的下一篇文章(将于12月27日发布)中进行此操作。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?