Kaggle入门教程

  1:竞赛

  我们将学习如何为 Kaggle 竞赛生成一个提交答案( submisson )。Kaggle是一个你通过完成算法和全世界机器学习从业者进行竞赛的网站。如果你的算法精度是给出数据集中最高的,你将赢得比赛。Kaggle也是一个实践你机器学习技能的非常有趣的方式。

  Kaggle网站有几种不同类型的比赛。其中的预测一个就是预测在泰坦尼克号沉没的时候哪个乘客会成为幸存者。 在这个任务和下一个任务我们将学习如何提交我们的答案。

  我们的数据是 csv 格式。你可以在 这里 下载数据开始比赛。

  每一行重现了一个在泰坦尼克的乘客以及和他们有关的一些信息。让我们来看一下各列:

  PassengerId:一个用以标记每个乘客的数字id

  Survived:标记乘客是否幸存——幸存(1)、死亡(0)。我们将预测这一列。

  Pclass:标记乘客所属船层——第一层(1),第二层(2),第三层(3)。

  Name:乘客名字。

  Sex:乘客性别——男male、女female

  Age:乘客年龄。部分。

  SibSp:船上兄弟姐妹和配偶的数量。

  Parch:船上父母和孩子的数量。

  Ticket:乘客的船票号码。

  Fare:乘客为船票付了多少钱。

  Cabin:乘客住在哪个船舱。

  Embarked:乘客从哪个地方登上泰坦尼克号。

  一个好的开始就是有条理的思考各个列和我们的预测之间的逻辑关系。

  我们都知道妇女和儿童更可能被救。因此, 年龄 和 性别 很可能更好的帮助我们预测。认为乘客的船层可能会影响结果也是符合逻辑的,因为第一层的船舱更靠近船的甲板。 Fare 票价和乘客所住船层相关,而且可能是高度相关的,但是也可能会增加一些额外的信息。 SibSp、Parch 兄弟姐妹、配偶、父母/孩子的数量很可能关系到是否被某一个或很多个人救,会有很多人去帮助你或者有很多人想到你尝试去救你。

  像 Embarked 登船(也许有一些信息和怎么靠近船的顶部的人的船舱有关), Ticket票号和 Name 名字。

  这一步通常是习得相关的领域知识[要对业务比较深入],这对于绝大多数机器学习任务来说非常非常非常的重要。

  我们非常细致的处理特征以便我们能从我们现有的数据中获得最有用的信息来帮助我们进行预测。

  2:观察数据

  我们将使用Python3,pandas库和scikit-learn库来分析我们的数据并且生成一个提交答案 submisson 。我们将使用代码框进行交互式编程,就和你看到的下面那个一样。如果你对Python还不熟悉,你可能想看一看我们的 课程 。

  一个好的第二步就是仔细观察数据中的高级描述。在这种情况下,我们使用pandas的 .describe() 方法来查看每一列数值的特性的不同之处。

  # We can use the pandas library in python to read in the csv file.

  # This creates a pandas dataframe and assigns it to the titanic variable.

  titanic = pandas.read_csv("titanic_train.csv")

  # Print the first 5 rows of the dataframe.

  print(titanic.describe())

  3:缺失数据

  在上一节你使用 .describe() 方法查看 titanic 数据框的时候,你可能注意到年龄列只有714个计数,而其他列都有891个计数。这表明在 年龄 列有一些缺失值——空值(null,NA,非数字)。

  这就意味着数据并不是完全的干净,我们必须自己清洗数据。我们不希望不得不删除有缺失数据的行,因为更多的数据能帮助我们训练出一个更好的算法。当然,我们也不想删除整列,因为age年龄很可能对我们的分析非常重要。

  有很多种策略来处理缺失数据,但是一种简单的方法就是将那一列的缺失值用中位数填充。

  我们可以像字典一样通过数据框索引选取一个单列。这样会给我们一个pandas Series(序列):

  titanic['Age']

  我们可以使用 .fillna 方法替换序列中的任何缺失值。 .fillna 可以传入一个参数用参数的值来替换缺失值。

  在我们的例子中,我们打算用列的中位数来填充:

  titanic['Age'].fillna(titanic['Age'].median())

  之后我们必须将替换后的结果赋值回原来的列:

  titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())

  4:非数值列

  前两节我们使用过 .describe() ,你也许也主要到并不是所有的列都显示出来了。只有数值列显示了。我们的列中有几个是非数值的,当你开始做预测的时候这将是一个问题——我们不能将非数值列传入机器学习算法中并且期望机器学习算法能理解他们。