找回密码
 立即注册
搜索

膜拜!来自Kaggle金牌大佬的 Python数据发掘框架



很多同窗在学习机器学习时往往掉进了不停看书、刷视频的,但短少实践项目训练的坑,有时想去练习却又找不到一个足够残缺的教程,本项目翻译自kaggle入门项目Titanic金牌获得者的Kernel,该篇文章经过大家并不生疏的泰坦尼克数据集详细的引见了如何分析成绩、数据预处理、建立模型、特征选择、模型评价与改进,是一份不可多得的优秀教程。

本文在翻译的同时删减了部分引见性文字,并对结构停止了调整方便大家阅读,由于篇幅缘由,本篇文章中并没有包含大段的代码,仅保留过程与结果。建议在文末获取Notebook版本与数据集残缺复现一遍,假如你正处于机器学习入门阶段置信一定会有所播种!

目录


    项目背景与分析

    数据读入与检查

    数据预处理

      数据校正

      缺失值填充

      数据创建

      数据转换

      数据清洗

      数据划分

    探求性分析

    建模分析

    模型评价与优化

      交叉验证

      超参数调整

      特征选择

    模型验证

    改进与总结


项目背景与分析

泰坦尼克号沉没是历史上有名的沉船事情之一。1912年4月15日,在泰坦尼克号的初次航行中,与冰山相撞后沉没,使2224名乘客和机组人员中的1502人丧生。这一耸人听闻的悲剧震惊了国际社会。

沉船事故导致人员丧生的缘由之一是没有足够的救生艇供乘客和船员运用。虽然在下沉中幸存有一定的运气,但某些群体比其他群体更能够生活,例如妇女,儿童和下层阶级。

在这个项目中,我们被要求完成对能够生活的人群的分析。并且需求运用机器学习工具来预测哪些乘客可以幸免于悲剧。

数据读取与检查

首先导入与数据处理相关的库,并检查版本与数据文件夹

#导入相关库

import sys

print("Python version: {}". format(sys.version))

import pandas as pd

print("pandas version: {}". format(pd.__version__))

import matplotlib

print("matplotlib version: {}". format(matplotlib.__version__))

import numpy as np

print("NumPy version: {}". format(np.__version__))

import scipy as sp

print("SciPy version: {}". format(sp.__version__))

import IPython

from IPython import display

print("IPython version: {}". format(IPython.__version__))

import sklearn

print("scikit-learn version: {}". format(sklearn.__version__))

import random

import time

#忽略警号

import warnings

warnings.filterwarnings('ignore')

print('-'*25)

# 将三个数据文件放入主目录下

from subprocess import check_output

print(check_output(["ls"]).decode("utf8"))


接上去导入与建模预测相关的库

#导入建模相关库

from sklearn import svm, tree, linear_model, neighbors, naive_bayes, ensemble, discriminant_analysis, gaussian_process

from xgboost import XGBClassifier

from sklearn.preprocessing import OneHotEncoder, LabelEncoder

from sklearn import feature_selection

from sklearn import model_selection

from sklearn import metrics

import matplotlib as mpl

import matplotlib.pyplot as plt

import matplotlib.pylab as pylab

import seaborn as sns

from pandas.tools.plotting import scatter_matrix

#可视化相关设置

%matplotlib inline

mpl.style.use('ggplot')

sns.set_style('white')

pylab.rcParams['figure.figsize'] = 12,8


如今来读取并对数据做一个初步的预览,我们运用info和sample函数来疾速概览变量数据类型。

data_raw = pd.read_csv('train.csv')

data_val = pd.read_csv('test.csv')

data1 = data_raw.copy(deep = True)

data_cleaner = [data1, data_val]

print (data_raw.info)

data_raw.sample(10)


<class 'pandas.core.frame.DataFrame'>

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

PassengerId 891 non- int64

Survived 891 non- int64

Pclass 891 non- int64

Name 891 non- object

Sex 891 non- object

Age 714 non- float64

SibSp 891 non- int64

Parch 891 non- int64

Ticket 891 non- object

Fare 891 non- float64

Cabin 204 non- object

Embarked 889 non- object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.6+ KB

None


    存活变量是我们的结果或因变量。这是一个二进制标称数据类型的1幸存,0没有生活。一切其他变量都是潜在的预测变量或独立变量。重要的是要留意,更多的预测变量并并不会构成更好的模型,而是正确的变量才会。

    乘客ID和票证变量被假定为随机独一标识符,对结果变量没有影响。因此,他们将被扫除在分析之外。

    Pclass变量是票券类的序数数据,是社会经济地位(SES)的代表,代表1 =下层,2=中产阶级,3 =下层。

    Name变量是一个标称数据类型。用于提取特征中,可以从标题、家庭大小、姓氏中获得性别,如SES可以从医生或硕士来判别。由于这些变量曾经存在,我们将应用它来查看title(如master)能否会产生影响。

    性别和装载变量是一种名义数据类型。它们将被转换为数学计算的哑变量。

    年龄和费用变量是延续的定量数据类型。

    SIBSP代表相关上船的兄弟姐妹/配偶的数量,而PARCH代表上传的父母/子女的数量。两者都是团圆的定量数据类型。这可以特征工程创建一个关于家庭大小的变量。

    舱室变量是一个标称数据类型,可用于特征工程中描画事故发生时船舶上的大致地位和从甲板上的船位。但是,由于有许多空值,它不添加值,因此被扫除在分析之外。


数据预处理

在本节我们将经过数据清洗4c准绳停止处理

    校正(Correcting)

    填充(Completing)

    创建(Creating)

    转换(Converting)


数据校正


检查数据,似乎没有任何异常或不可接受的数据输入。此外,我们发现我们在年龄和票价上能够存在潜在异常值。但是,由于它们是合理的值,我们将等到完成探求性分析后再确定能否应从数据集中包括或扫除。应该留意的是,假如它们是不合理的值,例如age = 800而不是80,那么如今修复是一个安全的决议。但是,从原始值修正数据时,我们要格外小心,由于能够需求创建准确的模型。

缺失值填充


年龄,机舱和出发区域中存在空值或缺多数据。短少值能够是不好的,由于某些算法不知道如何处理空值,并且会失败。而其他决策树等可以处理空值。因此,在末尾建模之行停止修复很重要,由于我们将比较和对比多个模型。有两种常用方法,即删除记录或运用合理的输入填充缺失值。不建议删除该记录,尤其是大部分记录,除非它的确代表不残缺的记录。相反,最好估算缺失的值。定性数据的基本方法是估算运用形式。定量数据的基本方法是运用均值,中位数或均值+随机标准差估算。中间方法是根据特定标准运用基本方法。例如按舱位划分的平均年龄,或按票价和SES出发前往港口。有更复杂的方法,但是在部署之前,应将其与基本模型停止比较,以确定复杂功能否真正添加了价值。对于此数据集,年龄将用中位数来估算,机舱属性将被删除,而登船将以mode停止估算。随后的模型迭代能够会修正此决策,以确定它能否会提高模型的准确性。

数据创建


特征工程是当我们运用现有特征来创建新特征以确定它们能否提供新信号来预测我们的结果时。对于此数据集,我们将创建标题功能以确定其能否在生活中发挥作用。

数据转换


最后但异样重要的是,我们将对数据格式停止转换。对于此数据集,我们将对象数据类型转换为分类虚拟变量。

print('Train columns with values:\n', data1.is.sum)

print("-"*10)

print('Test/Validation columns with values:\n', data_val.is.sum)

print("-"*10)

data_raw.describe(include = 'all')



末尾清洗


完成这个步骤你需求对下面的Pandas功能有一定的了解

    pandas.DataFrame

    pandas.DataFrame.info

    pandas.DataFrame.describe

    Indexing and Selecting Data

    pandas.is

    pandas.DataFrame.sum

    pandas.DataFrame.mode

    pandas.DataFrame.copy

    pandas.DataFrame.fillna

    pandas.DataFrame.drop

    pandas.Series.value_counts

    pandas.DataFrame.loc

###缺失值处理

for dataset in data_cleaner:

#用中位数填充

dataset['Age'].fillna(dataset['Age'].median, inplace = True)

dataset['Embarked'].fillna(dataset['Embarked'].mode[0], inplace = True)

dataset['Fare'].fillna(dataset['Fare'].median, inplace = True)

#删除部分数据

drop_column = ['PassengerId','Cabin', 'Ticket']

data1.drop(drop_column, axis=1, inplace = True)

print(data1.is.sum)

print("-"*10)

print(data_val.is.sum)


接上去我们将把分类数据转换成用于数学分析的哑变量。有多种方法来对分类变量停止编码,在这个步骤中,我们还将定义X(独立/特征/解释/预测器/等)和Y(依赖/目的/结果/呼应/等)变量用于数据建模。

label = LabelEncoder

for dataset in data_cleaner:

dataset['Sex_Code'] = label.fit_transform(dataset['Sex'])

dataset['Embarked_Code'] = label.fit_transform(dataset['Embarked'])

dataset['Title_Code'] = label.fit_transform(dataset['Title'])

dataset['AgeBin_Code'] = label.fit_transform(dataset['AgeBin'])

dataset['FareBin_Code'] = label.fit_transform(dataset['FareBin'])

Target = ['Survived']

data1_x = ['Sex','Pclass', 'Embarked', 'Title','SibSp', 'Parch', 'Age', 'Fare', 'FamilySize', 'IsAlone'] #pretty name/values for charts

data1_x_calc = ['Sex_Code','Pclass', 'Embarked_Code', 'Title_Code','SibSp', 'Parch', 'Age', 'Fare'] #coded for algorithm calculation

data1_xy = Target + data1_x

print('Original X Y: ', data1_xy, '\n')

#为原始特征定义x变量以删除延续变量

data1_x_bin = ['Sex_Code','Pclass', 'Embarked_Code', 'Title_Code', 'FamilySize', 'AgeBin_Code', 'FareBin_Code']

data1_xy_bin = Target + data1_x_bin

print('Bin X Y: ', data1_xy_bin, '\n')

data1_dummy = pd.get_dummies(data1[data1_x])

data1_x_dummy = data1_dummy.columns.tolist

data1_xy_dummy = Target + data1_x_dummy

print('Dummy X Y: ', data1_xy_dummy, '\n')

data1_dummy.head


如今我们曾经基本完成了数据的清洗,让我们再次停止检查

print('Train columns with values: \n', data1.is.sum)

print("-"*10)

print (data1.info)

print("-"*10)

print('Test/Validation columns with values: \n', data_val.is.sum)

print("-"*10)

print (data_val.info)

print("-"*10)

data_raw.describe(include = 'all')



划分测试集与训练集


如前所述,提供的测试文件实践上是比赛提交的验证数据。因此,我们将运用sklearn函数将训练数据分为两个数据集,这不会过度拟合我们的模型。

train1_x, test1_x, train1_y, test1_y = model_selection.train_test_split(data1[data1_x_calc], data1[Target], random_state = 0)

train1_x_bin, test1_x_bin, train1_y_bin, test1_y_bin = model_selection.train_test_split(data1[data1_x_bin], data1[Target] , random_state = 0)

train1_x_dummy, test1_x_dummy, train1_y_dummy, test1_y_dummy = model_selection.train_test_split(data1_dummy[data1_x_dummy], data1[Target], random_state = 0)

print("Data1 Shape: {}".format(data1.shape))

print("Train1 Shape: {}".format(train1_x.shape))

print("Test1 Shape: {}".format(test1_x.shape))

train1_x_bin.head



探求性分析

如今,我们的数据已清算终了,我们将运用描画性和图形统计数据探求数据,以描画和总结变量。在此阶段,你将发现本人对特征停止了分类,并确定了它们与目的变量的互相关系。

for x in data1_x:

if data1[x].dtype != 'float64' :

print('Survival Correlation by:', x)

print(data1[[x, Target[0]]].groupby(x, as_index=False).mean)

print('-'*10, '\n')

print(pd.crosstab(data1['Title'],data1[Target[0]]))


接上去是一些可视化的分析,首先探求各个标签的不同特征值的生活结果对比




我们知道阶级对生活很重要,如今让我们比较不同阶级的特征



由图可看出:1)船舱等级越高,票价越贵。2)船舱等级高的人的年龄相对较大。3)船舱等级越高,家庭出游人数越少。死亡比例与船舱等级关系不大,另外我们知道性别对生活很重要,如今我们来比较一下性别和第二个特征



可以看到女性的存活比例大于男性,且C甲板、独自出行的女士存活率较高,接着观察更多比较




接上去绘制幸存或未幸存乘客的年龄分布



绘制幸存者性别年龄等直方图



最后对整个数据集停止可视化




建模分析

首先,我们必须了解机器学习的目的是处理人类成绩。机器学习可分为:监督学习,无监督学习和强化学习。在监督学习中,您可以经过向模型提供包含正确答案的训练数据集来训练模型。在无监督学习中,您可以运用未包含正确答案的训练数据集来训练模型。强化学习是前两种方法的混合,在这种状况下,模型不会立刻得到正确答案,而是在一系列事情之后才得到强化学习。我们正在停止有监督的机器学习,由于我们正在经过向算法展现一组功能及其对应的目的来训练我们的算法。然后,我们希望从相反的数据集中为它提供一个新的子集,并且在预测准确性方面具有相似的结果。

机器学习算法有很多,但是根据目的变量和数据建模目的的不同,它们可以分为四类:分类,回归,聚类或降维。我们将重点放在分类和回归上。可以概括地说,延续目的变量需求回归算法,而团圆目的变量则需求分类算法。;另外逻辑回归虽然称号上具有回归,但实践上是一种分类算法。由于我们的成绩是预测乘客能否幸存上去,因此这是一个团圆的目的变量。我们将运用sklearn库中的分类算法来末尾我们的分析。并运用交叉验证和评分目的(在后面的部分中停止讨论)来对算法的功能停止排名和比较。

常见的机器学习分类算法有

    EM方法

    广义线性模型(GLM)

    朴素贝叶斯

    K近邻

    支持向量机(SVM)

    决策树

下面,我们将运用不同的方法停止比较(因代码过长,详细代码请在后台回复kaggle获得源码查看)



模型评价

让我们回顾一下,经过一些基本的数据清算,分析和机器学习算法(MLA),我们可以以约82%的准确度预测乘客的存活率。几行代码还不错。但是,我们一直提出的成绩是,我们可以做得更好,更重要的是,我们可以为所投资的工夫获得应有的投资报答率吗?例如,假如我们仅将精度提高1%,那么真的值得停止3个月的开发?因此,在改进模型时请牢记这一点。

在决议如何改善模型之前,让我们确定我们的模型能否值得保留。为此,我们必须前往到数据迷信101的基础知识。我们知道这是一个二元成绩,由于只要两种能够的结果。乘客幸存或死亡。将其视为硬币翻转成绩。假如有一个硬币,并且猜到了正面或反面,那么您就有50-50的机会猜对了。所让我们将50%设为最差的模型功能。

好了,没有关于数据集的信息,我们总是可以得到50%的二进制成绩。但是我们有关于数据集的信息,所以我们应该可以做得更好。我们知道有1502/2224或67.5%的人死亡。因此,假如我们预测最高的概率,100%的人死亡,那么我们的预测的67.5%的工夫是正确的。所以,让我们把68%作为坏的模型功能,任何低于这个的模型都没有意义,我可以预测对象全部死亡。

接上去我们将运用交叉验证法来对模型停止评价。

这是一个纯手工制造的模型,仅用于学习目的。无需花哨的算法就可以创建本人的预测模型。1表示存活,0表示死亡

Coin Flip Model Accuracy: 49.49%

Coin Flip Model Accuracy w/SciKit: 49.49%


对结果停止汇总

Survival Decision Tree w/Female Node:

Sex Pclass Embarked FareBin

female 1 C (14.454, 31.0] 0.666667

(31.0, 512.329] 1.000000

Q (31.0, 512.329] 1.000000

S (14.454, 31.0] 1.000000

(31.0, 512.329] 0.955556

2 C (7.91, 14.454] 1.000000

(14.454, 31.0] 1.000000

(31.0, 512.329] 1.000000

Q (7.91, 14.454] 1.000000

S (7.91, 14.454] 0.875000

(14.454, 31.0] 0.916667

(31.0, 512.329] 1.000000

3 C (-0.001, 7.91] 1.000000

(7.91, 14.454] 0.428571

(14.454, 31.0] 0.666667

Q (-0.001, 7.91] 0.750000

(7.91, 14.454] 0.500000

(14.454, 31.0] 0.714286

S (-0.001, 7.91] 0.533333

(7.91, 14.454] 0.448276

(14.454, 31.0] 0.357143

(31.0, 512.329] 0.125000


如今运用决策树停止建模并查看相关目的

Decision Tree Model Accuracy/Precision Score: 82.04%

precision recall f1-score support

0 0.82 0.91 0.86 549

1 0.82 0.68 0.75 342

accuracy 0.82 891

macro avg 0.82 0.79 0.80 891

weighted avg 0.82 0.82 0.82 891


可以看到准确率为82%,下面对结果停止可视化




交叉验证


接上去是交叉验证,但是重要的是我们运用不同的子集来训练数据来构建模型,并运用测试数据来评价模型。否则,我们的模型将过拟合。这意味着在“预测”曾经看到的数据方面很棒,但是在预测尚未看到的数据方面很蹩脚;这根本不是预测。这就像在学校测验中作弊以获得100%的成绩,但是然后当您去参加考试时,就会失败,

CV本质上是多次拆分和评分模型的捷径,因此我们可以了解它在看不见的数据上的表现如何。它在计算机处理上要贵一些,但是这很重要,因此我们不会产生虚伪的决计。这在Kaggle竞赛或任何避免分歧性和不测的用例中很有用。

超参数调整


当我们运用sklearn决策树(DT)分类器时,我们接受了一切功能默许值。这使我们无机会了解各种超参数设置将如何改变模型的准确性。(单击此处以了解有关参数与超参数的更多信息。)

但是,为了调整模型,我们需务实践了解它。这就是为什么我在前几节中花工夫向您展现预测的原理,因此你需求详细了处理策树算法的优点与不足在哪!

下面是运用ParameterGrid,GridSearchCV和customizedsklearn scoring评分来调整我们的模型结果

BEFORE DT Parameters: {'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': None, 'max_leaf_nodes': None, 'min_impurity_decrease': 0.0, 'min_impurity_split': None, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'presort': 'deprecated', 'random_state': 0, 'splitter': 'best'}

BEFORE DT Training w/bin score mean: 82.09

BEFORE DT Test w/bin score mean: 82.09

BEFORE DT Test w/bin score 3*std: +/- 5.57

----------

AFTER DT Parameters: {'criterion': 'gini', 'max_depth': 4, 'random_state': 0}

AFTER DT Training w/bin score mean: 87.40

AFTER DT Test w/bin score mean: 87.40

AFTER DT Test w/bin score 3*std: +/- 5.00



特征选择


正如一末尾所说的,不是说预测变量越多模型就越好,而正确的预测因子可以提高模型的准确率。因此,数据建模的另一个步骤是特征选择。在Sklearn中我们将运用recursive feature elimination(RFE)与cross validation(CV)

下面是一些结果

BEFORE DT RFE Training Shape Old: (891, 7)

BEFORE DT RFE Training Columns Old: ['Sex_Code' 'Pclass' 'Embarked_Code' 'Title_Code' 'FamilySize'

'AgeBin_Code' 'FareBin_Code']

BEFORE DT RFE Training w/bin score mean: 82.09

BEFORE DT RFE Test w/bin score mean: 82.09

BEFORE DT RFE Test w/bin score 3*std: +/- 5.57

----------

AFTER DT RFE Training Shape New: (891, 6)

AFTER DT RFE Training Columns New: ['Sex_Code' 'Pclass' 'Title_Code' 'FamilySize' 'AgeBin_Code'

'FareBin_Code']

AFTER DT RFE Training w/bin score mean: 83.06

AFTER DT RFE Test w/bin score mean: 83.06

AFTER DT RFE Test w/bin score 3*std: +/- 6.22

----------

AFTER DT RFE Tuned Parameters: {'criterion': 'gini', 'max_depth': 4, 'random_state': 0}

AFTER DT RFE Tuned Training w/bin score mean: 87.34

AFTER DT RFE Tuned Test w/bin score mean: 87.34

AFTER DT RFE Tuned Test w/bin score 3*std: +/- 6.21

----------



模型验证

先对不同算法停止比较



接上去是经过投票选择模型

Hard Voting Training w/bin score mean: 86.59

Hard Voting Test w/bin score mean: 82.39

Hard Voting Test w/bin score 3*std: +/- 4.95

----------

Soft Voting Training w/bin score mean: 87.15

Soft Voting Test w/bin score mean: 82.35

Soft Voting Test w/bin score 3*std: +/- 4.85

----------


再停止相反的操作后,最终保留的变量与结果如下

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 418 entries, 0 to 417

Data columns (total 21 columns):

PassengerId 418 non- int64

Pclass 418 non- int64

Name 418 non- object

Sex 418 non- object

Age 418 non- float64

SibSp 418 non- int64

Parch 418 non- int64

Ticket 418 non- object

Fare 418 non- float64

Cabin 91 non- object

Embarked 418 non- object

FamilySize 418 non- int64

IsAlone 418 non- int64

Title 418 non- object

FareBin 418 non- category

AgeBin 418 non- category

Sex_Code 418 non- int64

Embarked_Code 418 non- int64

Title_Code 418 non- int64

AgeBin_Code 418 non- int64

FareBin_Code 418 non- int64

dtypes: category(2), float64(2), int64(11), object(6)

memory usage: 63.1+ KB

None

----------

Validation Data Distribution:

0 0.633971

1 0.366029

Name: Survived, dtype: float64



总结

最终我们得到了0.77990精度的模型。运用相反的数据集和不同的决策树完成(adaboost、random forest、梯度boost、xgboost等)并停止调优不会超过0.77990提交精度。对于这个数据集来说,风趣的是,简单的决策树算法拥有最好的默许提交分数,并且经过调优获得了异样最好的准确性分数。

并且虽然在单一数据集上测试多数算法不能得出相反的结果,但在提到的数据集上有一些观察结果。同时训练数据集与测试/验证数据集和填充数据集的分布不同。这使得交叉验证(CV)的准确性得分和Kaggle提交的准确性得分之间有很大的差距。对于相反的数据集,基于决策树的算法,似乎在适当调整后收敛于相反的精度分数。

为了更好的对齐CV评分和Kaggle评分,提高全体准确率,之后可以在预处理和特性工程上做更多的处理,这些就交给感兴味的读者完成!

Python学习交流群

为了让大家愈加即时地沟通学习,我们建了一个Python学习交流群,有想入群的同窗,可以添加下面小助手微信,他会拉大家入群哈~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

捣蛋小猪 2020-9-27 16:21:21 显示全部楼层
前排支持下
回复

使用道具 举报

狼在野 2020-9-28 13:32:54 显示全部楼层
我觉得不错,太厉害了
回复

使用道具 举报

启和户外 2020-9-29 13:18:00 显示全部楼层
占位编辑
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies