从Kaggle入门级比赛总结数据挖掘流程

文章目录

  • 一、资料来源
  • 二、比赛介绍
    • 2.1 关于 Kaggle
    • 2.2 关于泰坦尼克之灾
  • 三、初步流程
    • 3.1 数据初探
    • 3.2 数据初步分析
    • 3.3 简单数据预处理
      • 3.3.1 信息缺失的属性
      • 3.3.2 对类目型的特征做因子化
      • 3.3.3 对变化幅度大的特征归一化
    • 3.4 建立 Baseline Model
  • 四、系统优化
    • 4.1 模型系数关联分析
    • 4.2 交叉验证
    • 4.3 学习曲线
    • 4.4 模型融合(model ensemble)
  • 五、总结

一、资料来源

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
作者:寒小阳

Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾
作者:EvanLi

二、比赛介绍

2.1 关于 Kaggle

Kaggle是一个数据分析建模的应用竞赛平台,企业或者研究者可以将问题背景、数据、期望指标等发布到Kaggle上,以竞赛的形式征集解决方案。参赛者可以下载/分析数据,使用统计/机器学习/数据挖掘等知识,建立算法模型,得出结果并提交。

2.2 关于泰坦尼克之灾

Kaggle页面:Titanic: Machine Learning from Disaster

泰坦尼克号问题之背景

  • 豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,是否获救其实并非随机,而是基于一些背景有rank先后的。
  • 训练和测试数据是一些乘客的个人信息以及存活状况,要尝试根据它生成合适的模型并预测其他人的存活状况。
  • 这是一个二分类问题,是logistic regression能处理的范畴。

三、初步流程

结合实例 Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾 阅读本部分。

3.1 数据初探

对数据进行总体上的初步了解。

一般用到pandasnumpy两个库。数据集如果是csv文件:

1)用pd.read_csv()读取并用data_train.head()查看

——dataframe格式,显示部分示例(行),但能看到全部种类属性(列)

2)让dataframe自己告诉我们一些信息:data_train.info()

——包括数据共有多少条,各个属性有多少条(少于数据条数说明不全),属性格式(int,float,str等)

3)获取数值型属性的一些分布:data_train.describe()

——该数值型属性的条数,均值,标准差,最值等。文本型属性不显示。

3.2 数据初步分析

仅仅通过上面的总体了解,依旧无法给我们提供想法和思路。

接下来用matplotlib做可视化就很有必要了。

1)单个属性分析value_counts()

  • 离散值,柱状图bar,横坐标为该属性各个类,纵坐标为属于一类的数量。

2)按x属性看y属性分布scatter()

3)x属性各个类的y属性分布[data.x==...]

  • y是连续值,用曲线图kde

4)多个属性联合分析

横坐标为属性x各类,纵坐标为属于x属性一类且y属性一类的数量,
并把y属性各类用不同色叠在一起stacked=True

有时需要联合分析三个及以上属性,可分成几个表格并排观测。

data.A[data.B==..][data.C==..]

5)类别很多的属性

可以不做可视化,总体上分析,用data.groupby()data.count()

6)信息缺失的属性

可用pandas的函数pd.notnull()pd.isnull()按照是否缺失分类。

3.3 简单数据预处理

这里说的数据预处理,其实就包括了很多Kaggler津津乐道的feature engineering过程,灰常灰常有必要!

3.3.1 信息缺失的属性

处理方式:

1)按有无数据将这个属性处理成Yes和No两种类型;

2)如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果;

3)如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中;

4)如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中;

5)有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。

拟合补全方法举例:用scikit-learn中的RandomForest拟合缺失数据。
(注:RandomForest是一个用在原始数据中做不同采样,建立多棵DecisionTree,再进行average等等来降低过拟合现象,提高结果的机器学习算法)

3.3.2 对类目型的特征做因子化

因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征做因子化。

我们使用pandasget_dummies来完成这个工作。

3.3.3 对变化幅度大的特征归一化

sklearn.preprocessing.StandardScaler()

3.4 建立 Baseline Model

例如,使用scikit-learn中的LogisticRegression建模。

正则取出我们要的属性值,然后调用

sklearn.linear_model.LogisticRegression()

得到一个model,接下来对测试集做和训练集同样的预处理,再丢进model。

将结果按需要整理后保存为csv文件。

四、系统优化

亲,你以为结果提交上了,就完事了? 我不会告诉你,这只是万里长征第一步啊(泪牛满面)!!!这才刚撸完baseline model啊!!!还得优化啊!!!

看过Andrew Ng老师的machine Learning课程的同学们,知道,我们应该分析分析模型现在的状态了,是过/欠拟合?,以确定我们需要更多的特征还是更多数据,或者其他操作。我们有一条很著名的learning curves对吧。

4.1 模型系数关联分析

把得到的model系数和feature关联起来看看。

pd.DataFrame({"columns":list(train_df.columns)[1:], "coef":list(clf.coef_.T)})

表格生成了,先关注那些权重绝对值非常大的feature,获取思路。

『每做一次调整就make a submission,然后根据结果来判定这次调整的好坏』其实是行不通的…

重点来了:『要做交叉验证(cross validation)!』

4.2 交叉验证

我们通常情况下,这么做cross validation:把train.csv分成两部分,一部分用于训练我们需要的模型,另外一部分数据上看我们预测算法的效果。

from sklearn.model_selection import cross_val_score, train_test_split

把交叉验证里面的bad case拿出来看看,看看人眼审核,是否能发现什么蛛丝马迹,是我们忽略了哪些信息,使得这些乘客被判定错了。再把bad case上得到的想法和前头系数分析的合在一起,然后逐个试试。

# 分割数据,按照 训练数据:cv数据 = 7:3的比例
split_train, split_cv = train_test_split(df, test_size=0.3, random_state=42)
isin(split_cv[predictions != cv_df.values[:,0]]

拿到bad cases之后,仔细看看。也会有一些猜测和想法。其中会有一部分可能会印证在系数分析部分的猜测,那这些优化的想法优先级可以放高一些。

我们随便列一些可能可以做的优化操作,然后我们可以使用手头上的”train_df”和”cv_df”开始试验这些feature engineering的tricks是否有效了。

试验的过程比较漫长,也需要有耐心,而且我们经常会面临很尴尬的状况,就是我们灵光一闪,想到一个feature,然后坚信它一定有效,结果试验下来,效果还不如试验之前的结果。恩,需要坚持和耐心,以及不断的挖掘。

4.3 学习曲线

著名的learning curve可以帮我们判定我们的模型现在所处的状态。我们以样本数为横坐标,训练和交叉验证集上的错误率作为纵坐标,两种状态分别如下两张图所示:过拟合(overfitting/high variace),欠拟合(underfitting/high bias)
从Kaggle入门级比赛总结数据挖掘流程_第1张图片
从Kaggle入门级比赛总结数据挖掘流程_第2张图片
我们用scikit-learn里面的learning_curve来帮我们分辨我们模型的状态。

from sklearn.model_selection import learning_curve

根据模型过拟合/欠拟合/符合预期来继续调整,做特征工程工作/添加新特征或组合特征。

4.4 模型融合(model ensemble)

模型融合可以比较好地缓解,训练过程中产生的过拟合问题,从而对于结果的准确度提升有一定的帮助。

如果只用一种模型也想运用融合思想,就在数据上动手脚。

每次取训练集的一个subset做训练,这样,我们虽然用的是同一个机器学习算法,但是得到的模型却是不一样的;同时,因为我们没有任何一份子数据集是全的,因此即使出现过拟合,也是在子训练集上出现过拟合,而不是全体数据上,这样做一个融合,可能对最后的结果有一定的帮助。对,这就是常用的Bagging。

from sklearn.ensemble import BaggingRegressor

五、总结

对于任何的机器学习问题,不要一上来就追求尽善尽美,先用自己会的算法撸一个baseline的model出来,再进行后续的分析步骤,一步步提高。

在问题的解决过程中:

  • 『对数据的认识太重要了!』
  • 『数据中的特殊点/离群点的分析和处理太重要了!』
  • 『特征工程(feature engineering)太重要了!』
  • 『要做交叉验证(cross validation)!』
  • 『模型融合(model ensemble)太重要了!』

本文中用机器学习解决问题的过程大概如下图所示:
从Kaggle入门级比赛总结数据挖掘流程_第3张图片


【资料来源】

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
作者:寒小阳

Kaggle入门:逻辑回归应用之Kaggle泰坦尼克之灾
作者:EvanLi

你可能感兴趣的:(DL)