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
分享到:
没有账号? 忘记密码?