<commit_before>---
layout: post
title:  "机器学习项目实战（一）： Kaggle Titanic"
date:  2018-10-20
desc: "从今天开始将会开始进行机器学习系列的学习之旅，首先发表一个简单的机器学习入门实战-Titanic，这是 Kaggle 上的一个机器学习挑战项目，是最简单的二分分类问题，适合新手上手。"
keywords: "Kaggle,机器学习,泰坦尼克,Titanic,Machine Learning,二分分类,Scikit-Learn"
categories: [Machine Learning]
tags: [Kaggle,ML,Classification]
---
# Kaggle Titanic（泰坦尼克号幸存预测）

做为第一次参加 Kaggle 竞赛，因此选择了一个入门级的“泰坦尼克号幸存预”。之前一直是看《机器学习实用指南》这本书，这个竞赛也是这本书中的一道课后题。本教程使用 Scikit-Learn 来进行，由于是我第一个机器学习项目，因此只适合于初学者，大神请留下珍贵的建议。

首先在开始之前得明确一下机器学习的简单步骤：

![ml-map](/assets/images/2018-10/11-ml-map.jpg)

接下来按照这个步骤来一步步的进行处理

## 一、提出问题

[Titanic](https://www.kaggle.com/c/titanic)是 Kaggle 上的一个竞赛。属于入门级比赛，在 Kaggle 提供的数据集中，共有1309名乘客数据，其中891是已知存活情况，剩下418则是需要进行分析预测的。

这项竞赛属于机器学习中的二元分类问题，为了获取到分析所需的数据，首先需要去 Kaggle 首页去创建一个账号，然后加入到[Titanic](https://www.kaggle.com/c/titanic)竞赛中，从 Data 中下载所需要的数据。

下载的数据包括：

- gender_submission.csv：提交结果案例（提交结果）
- test.csv：测试数据
- train.csv：训练数据

## 二、理解数据

说到数据挖掘，是把散乱数据转换成「有价值」信息的过程，数据是可以是数字或者文本内容甚至图像，而信息是有语义的、人脑可理解的报告、图表。

数据分析的结果，就是把数字转化成人类可理解的信息。

先将所需的数据导入进来

```python
train_set = pd.read_csv('./datasets/titanic/train.csv')
test_set = pd.read_csv('./datasets/titanic/test.csv')
```

接下来查看下数据：

```python
data_set.head()
```

![12](/assets/images/2018-10/12.png)

其中各列所代表的信息为：

- PassengerId：乘客的ID（对预测没有用处）
- survival：是否存活，0表示死亡，1表示存活
- pclass：船票的类别，可以用来表示乘客的经济情况，1 = 1st, 2 = 2nd, 3 = 3rd
- sex：乘客性别
- Age：乘客年龄
- sibsp：船上兄弟姐妹及配偶的个数
- parch：船上父母或子女的个数
- ticket：船票号
- fare：船票价格
- cabin：客舱号码
- embarked：登船口岸，C = Cherbourg, Q = Queenstown, S = Southampton

查看数据的基本信息：

```python
train_set.info()
```

可以看到，Age、Cabin、Embarked、Fare、Survived 这几个属性都具有缺失值，其中 Cabin 缺失的最严重，具有缺失值的都要在数据清洗中进行处理。

![13](/assets/images/2018-10/13.png)

再来看一下训练集中数字类型特征的统计信息

```python
train_set.describe()
```

![14](/assets/images/2018-10/14.png)

对数据进行简单的预览来了解数据，这为我们下一步数据清洗指明了方向，只有知道哪些数据缺失数据，哪些数据存在问题，我们才能有针对性的处理。

## 三、数据清洗

数据清洗操作包括 **数据预处理** 以及 **特征工程**两个部分，数据清洗是机器学习中最重要最耗时的部分，经常需要多次反复的进行，这里可以使用 Scikit-learn 中提供的 **pipeline 管道**来同时进行这两部操作。

### 1.数据预处理

对于具有缺失值的特征数据来说，一般的处理方式包括 **将缺失值填充** 或者 **删除具有缺失值的数据**。这里我们使用填充的方式来处理具有缺失值的数据。
<commit_msg>change blog content<commit_after>---
layout: post
title:  "机器学习项目实战（一）： Kaggle Titanic"
date:  2018-10-20
desc: "从今天开始将会开始进行机器学习系列的学习之旅，首先发表一个简单的机器学习入门实战-Titanic，这是 Kaggle 上的一个机器学习挑战项目，是最简单的二分分类问题，适合新手上手。"
keywords: "Kaggle,机器学习,泰坦尼克,Titanic,Machine Learning,二分分类,Scikit-Learn"
categories: [Machine Learning]
tags: [Kaggle,ML,Classification]
---
# Kaggle Titanic（泰坦尼克号幸存预测）

做为第一次参加 Kaggle 竞赛，因此选择了一个入门级的“泰坦尼克号幸存预”。之前一直是看《机器学习实用指南》这本书，这个竞赛也是这本书中的一道课后题。本教程使用 Scikit-Learn 来进行，由于是我第一个机器学习项目，因此只适合于初学者，大神请留下珍贵的建议。

首先在开始之前得明确一下机器学习的简单步骤：

![ml-map](/assets/images/2018-10/11-ml-map.jpg)

接下来按照这个步骤来一步步的进行处理

## 一、提出问题

[Titanic](https://www.kaggle.com/c/titanic)是 Kaggle 上的一个竞赛。属于入门级比赛，在 Kaggle 提供的数据集中，共有1309名乘客数据，其中891是已知存活情况，剩下418则是需要进行分析预测的。

这项竞赛属于机器学习中的二元分类问题，为了获取到分析所需的数据，首先需要去 Kaggle 首页去创建一个账号，然后加入到[Titanic](https://www.kaggle.com/c/titanic)竞赛中，从 Data 中下载所需要的数据。

下载的数据包括：

- gender_submission.csv：提交结果案例（提交结果）
- test.csv：测试数据
- train.csv：训练数据

## 二、理解数据

说到数据挖掘，是把散乱数据转换成「有价值」信息的过程，数据是可以是数字或者文本内容甚至图像，而信息是有语义的、人脑可理解的报告、图表。

数据分析的结果，就是把数字转化成人类可理解的信息。

先将所需的数据导入进来

```python
train_set = pd.read_csv('./datasets/titanic/train.csv')
test_set = pd.read_csv('./datasets/titanic/test.csv')
```

接下来查看下数据：

```python
train_set.head()
```

![12](/assets/images/2018-10/12.png)

其中各列所代表的信息为：

- PassengerId：乘客的ID（对预测没有用处）
- survival：是否存活，0表示死亡，1表示存活
- pclass：船票的类别，可以用来表示乘客的经济情况，1 = 1st, 2 = 2nd, 3 = 3rd
- sex：乘客性别
- Age：乘客年龄
- sibsp：船上兄弟姐妹及配偶的个数
- parch：船上父母或子女的个数
- ticket：船票号
- fare：船票价格
- cabin：客舱号码
- embarked：登船口岸，C = Cherbourg, Q = Queenstown, S = Southampton

查看数据的基本信息：

```python
train_set.info()
```

可以看到，Age、Cabin、Embarked 这几个属性都具有缺失值，其中 Cabin 缺失的最严重，具有缺失值的都要在数据清洗中进行处理。

![13](/assets/images/2018-10/13.png)

再来看一下训练集中数字类型特征的统计信息

```python
train_set.describe()
```

![14](/assets/images/2018-10/14.png)

对数据进行简单的预览来了解数据，这为我们下一步数据清洗指明了方向，只有知道哪些数据缺失数据，哪些数据存在问题，我们才能有针对性的处理。

## 三、数据清洗

数据清洗操作包括 **数据预处理** 以及 **特征工程**两个部分，数据清洗是机器学习中最重要最耗时的部分，经常需要多次反复的进行，这里可以使用 Scikit-learn 中提供的 **pipeline 管道**来同时进行这两部操作。

### 1.数据预处理

对于具有缺失值的特征数据来说，一般的处理方式包括 **将缺失值填充** 或者 **删除具有缺失值的数据**。这里我们使用填充的方式来处理具有缺失值的数据。

{'fraction_non_alphanumeric': 0.14911242603550295, 'fraction_numerical': 0.03076923076923077, 'mean_word_length': 7.174081237911025, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 4, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7056412', 'n_tokens_mistral': 3090, 'n_tokens_neox': 3371, 'n_words': 218}