Titanic: Machine Learning from Disaster
RMS泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。 1912年4月15日,泰坦尼亚号在首次航行中,与冰山相撞后沉没,在2224名乘客和船员中造成1502人死亡。 这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。
造成这样的生命损失的原因之一是乘客和船员没有足够的救生艇。 虽然在沉船事件幸存有一些运气,但有些群体比其他人更有可能生存,如妇女,儿童和上层阶级。
在这个挑战中,我们要求完成对可能生存的人的分析。 特别是,我们要求你应用机器学习的工具来预测哪些乘客幸存下来的悲剧。
Practice Skills
Binary classification
Python basics
1. Introduction
该笔记是总结了组合基础学习模型的方法,特别是称为Stacking的集合的变体。 简而言之,堆叠基本分类器用作第一级预测,然后在第二级使用另一个模型对第一级的输出来进行预测。
'''
加载调用数据库
'''
%matplotlib inline
import pandas as pd
import numpy as np
import re
import sklearn
import xgboost as xgb
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls
import warnings
warnings.filterwarnings('ignore')
'''
#得到5个基本模型作为stacking进行预测
'''
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier
from sklearn.svm import SVC
from sklearn.cross_validation import KFold;
2. Feature Exploration, Engineering and Cleaning
现在我们将进行一般的工作, 首先是分析手头的数据,进行特征工程以及数字编码任何分类特征。
'''
加载训练和测试数据集
'''
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
'''
存储乘客的ID号
'''
PassengerId = test['PassengerId']
train.head(3)
2.1 Feature Engineering
特征工程的目的是清除相近特征和分类标签属性,将所有的特征转化为数字形式,然后可以直接输入机器学习模型,接下来在开始训练模型之前,我们需要对特征相关性做可视化分析.
full_data = [train, test]
'''
(1)加入我们自己的特征
(2)给出名字的长度
'''
train['Name_length'] = train['Name'].apply(len)
test['Name_length'] = test['Name'].apply(len)
'''
特征表示乘客在Titanic是否有救生艇
'''
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
test['Has_Cabin'] = test["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
'''
创造新的家庭成员特征作为SibSp和Parch的组合
'''
for dataset in full_data:
dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
'''
从新的特征FamilySize,创造新特征(是否一个人)
'''
for dataset in full_data:
dataset['IsAlone'] = 0
dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1
'''
消除登船地点缺失的数据,并用频率高的代替
'''
for dataset in full_data:
dataset['Embarked'] = dataset['Embarked'].fillna('S')
'''
去除费用特征缺失数据,并且以他们中位数代替,创建新的特征(费用类别)
'''
for dataset in full_data:
dataset['Fare'] = dataset['Fare'].fillna(train['Fare'].median())
train['CategoricalFare'] = pd.qcut(train['Fare'], 4)
'''
创建新的年龄分类特征
'''
for dataset in full_data:
age_avg = dataset['Age'].mean()
age_std = dataset['Age'].std()
age_null_count = dataset['Age'].isnull().sum()
age_null_random_list = np.random.randint(age_avg - age_std, age_avg + age_std, size=age_null_count)
dataset['Age'][np.isnan(dataset['Age'])] = age_null_random_list
dataset['Age'] = dataset['Age'].astype(int)
train['CategoricalAge'] = pd.cut(train['Age'], 5)
'''
定义消除乘客名字中的特殊字符
'''
def get_title(name):
title_search = re.search(' ([A-Za-z]+)\.', name)
# If the title exists, extract and return it.
if title_search:
return title_search.group(1)
return ""
'''
创建新的名字特征,包含乘客名字主要信息
'''
for dataset in full_data:
dataset['Title'] = dataset['Name'].apply(get_title)
'''
将所有非常见的标题分组成一个单独的“稀有”组
'''
for dataset in full_data:
dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
dataset['Title'] = dataset['Title'].replac