Kaggle比赛——Titanic: Machine Learning from Disaster

0 整体流程

  1. 了解问题 & 获取训练集和测试集
  2. 整理、准备、清洗数据
  3. 分析、识别模式并探索数据
  4. 建模、预测和解决问题
  5. 可视化、报告和呈现问题解决步骤和最终解决方案

数据处理流程:

  • Classifying 分类

    • 对样本进行分类;了解不同类与解决方案目标的含义或相关性
  • Correlating 特征相关性

    • 了解数据集中的哪些特征对解决方案目标有重大贡献;了解特征之间的相关性;关联某些特征可能有助于纠正特征或创建新特征
  • Converting 转换

    • 将所有需要的特征转换成数字形式,便于模型学习
  • Completing 数据补全

    • 将缺失值补全,完整的数据将有助于模型的学习
  • Correcting 矫正错误数据

    • 发现可能存在错误的数据,对错误数据进行校正,或删除那个样本;检测样本或特征中的异常值,若某个特征没有用处或产生反向的作用,也可以丢弃这个特征
  • Creating 创建新的特征

    • 将已有特征进行组合、重造等,创建新的特征
  • Charting 可视化

    • 根据数据的性质和解决方案目标选择正确的可视化图和图表

1 问题定义 & 训练集和测试集

通过泰坦尼克号灾难中包含乘客是否生存的训练样本集,设计一个模型用于预测测试数据集中的乘客是否幸存。

训练集包含信息:

| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |

测试集包含信息:

| PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |

Variable Definition Key
survival Survival 0 = No, 1 = Yes
pclass Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
sex Sex
Age Age in years
sibsp # of siblings / spouses aboard the Titanic
parch # of parents / children aboard the Titanic
ticket Ticket number
fare Passenger fare
cabin Cabin number
embarked Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton

2 整理、准备、清洗数据(特征分析)

2.1 导入数据

  • 导包
# data analysis and wrangling
import pandas as pd
import numpy as np
import random as rnd

# visualization
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# machine learning
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
  • 读取数据
train_df = pd.read_csv('../input/train.csv')
test_df = pd.read_csv('../input/test.csv')
combine = [train_df, test_df]

2.2 特征分析

  • 数据集中所包含的特征
print(train_df.columns.values)
#---------------------------------------------------------------
'''
['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch' 'Ticket' 'Fare' 'Cabin' 'Embarked']
'''
  • 特征类别
    • 分类特征
      • 分类:Survived, Sex, and Embarked
      • 序数:Pclass
    • 数值特征
      • 连续:Age, Fare
      • 离散:SibSp, Parch
    • 混合类型
      • Ticket,Cabin 包含字母和数字
train_df.head()
# train_df.tail()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th… female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
  • 可能存在错误的特征

    • 对大数据集来说,很难查找,一般从表中取出一小部分数据集进行检查
    • 如:姓名中可能包含错误和打字错误
  • 存在空值的特征(blank, null or empty)

    • 如:Cabin, Age, Embarked 存在空值
  • 各个特征的数据类型

    • 训练集:7个特征为正数或浮点数, 测试集:6个
    • 5个特征为字符串类型(object)
train_df.info()
print('_'*40)
test_df.info()

#-----------------------OUTPUT-----------------------------
'''
<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
________________________________________
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
'''
  • 数值特征分布
    • 「帮助在早期确定训练集的代表性」,从下表可知:
    • 总样本数为891,是泰坦尼克号(2,224)上实际乘客人数的40%
    • Survived是0或1的分类特征
    • 大约38%的样本存活,实际存活率为32%
    • 大多数乘客(> 75%)没有与父母或孩子一起旅行
    • 近30%的乘客有兄弟姐妹或配偶
    • 票价差异很大,有很少的 乘客(<1%)支付高达512美元
    • 年龄在65-80岁之间的老年乘客(<1%)很少
train_df.describe()
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 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
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
  • 分类特征分布
    • 姓名在整个数据集中是唯一的(count = unique = 891)
    • 性别变量为两个值,男性为65%(top=male, freq=577/count=891)
    • Cabin有一些重复的值(几个乘客共用一个小屋)
    • Embarked有三个值。 大多数乘客使用S口(top= S)
    • 船票有很多相同的价格(22%,unique=681)
# 参数include=['O'],表示对Object类型的特征进行统计
train_df.describe(include=['O'])
Name Sex Ticket Cabin Embarked
count 891 891 891 204 889
unique 891 2 681 147 3
top Panula, Master. Juha Niilo male 1601 C23 C25 C27 S
freq 1 577 7 4 644

2.3 基于特征分析的假设

  • Correlating
    • 每个特征与生存之间的联系
  • Completing
    • 填充Age特征,因为与是否存活关系紧密
    • 填充Embarked特征,因为也与存活或其他重要的特征关系紧密
  • Correcting
    • Ticket特征将会删除,包含高比例的重复项(22%),并且和存活之间可能没有关联
    • Cabin删除,因为含有很多空值
    • PassengerId删除,对是否存活的影响很小
    • Name可能会删除,因为信息不标准,且可能不会直接有助于生存
  • Creating
    • 创造新的特征Family,基于ParchSibSp特征,以得到家庭成员总数
    • Name特征中提取Title作为一个新特征
    • 创建年龄阶层特征Age bands,将数字特征转化为分类特征
    • 可能创建票价范围特征Fare range,用于帮助分析
  • Classifying
    • 女性更容易存活
    • 儿童(Age<?)更容易存活
    • 老人更容易存活

2.4 表格分析特征

用于快速分析特征相关性(目前只能对没有空值的特征进行此操作)

  • Pclass: Pclass=1和存活(分类#3)之间存在显著相关性(> 0.5)。因此决定在模型中包含这个特性
  • Sex: 证实了女性的存活率很高,为74%(分类#1)
  • SibSp and Parch: 这些特征相关性低。最好从这些单独的特征中导出一个或一组特征(创建#1)
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Pclass Survived
0 1 0.629630
1 2 0.472826
2 3 0.242363
train_df[["Sex", "Survived"]].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Sex Survived
0 female 0.742038
1 male 0.188908
train_df[["SibSp", "Survived"]].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
SibSp Survived
1 1 0.535885
2 2 0.464286
0 0 0.345395
3 3 0.250000
4 4 0.166667
5 5 0.000000
6 8 0.000000
train_df[["Parch", "Survived"]].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Parch Survived
3 3 0.600000
1 1 0.550847
2 2 0.500000
0 0 0.343658
5 5 0.200000
4 4 0.000000
6 6 0.000000

3 可视化数据

3.1 特征相关性

直方图可用于分析Age这样的连续数值变量,可以使用自动定义的区间或等距离范围来指示样本的分布。其中条带或范围将有助于识别有用的模式

g = sns.FacetGrid(train_df, col='Survived')
g.map(plt.hist, 'Age', bins=20)

在这里插入图片描述

  • Observations
    • 婴儿(年龄≤4岁)存活率高
    • 年龄最大的乘客(年龄= 80岁)幸存下来
    • <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值