EDA To Prediction(DieTanic)

来源:互联网 发布:mac最下面的图标移上去 编辑:程序博客网 时间:2024/06/08 02:22

Contents of the Notebook

Part1:探索性数据分析(EDA)
1)分析特征
2)发现多个特征之间的关系

Part2:特征工程和数据清洗
1)加入少数特征
2)移除冗余特征
3)把特征转换为适合建模的格式

Part3:预测建模
1)运行基础算法
2)交叉验证
3)集成学习
4)重要特征抽取



详细介绍
Part1:探索性数据分析(EDA)
1)对train.csv中属性是否为空值检查,发现Age,Cabin和Embarked有空值
2)有多少人幸存?仅有38.4%训练集在灾难中存活。
我们需要从数据中发现更多信息从而知道哪类的乘客活下来而哪类没有活下来。这需要我们理解不同类型的特征
3)特征类型
分类变量(categorical features or nominal variables)
有:Sex Embarked
序变量(ordinal features)
和分类变量相似,区别是在有序别变量中我们可以排序值,说白了,就是排序有意义
eg:Height有Tall,Medium和Short
有:Height PClass
连续变量(continous feature)
有:Age
4)分析特征
Observations:

  • 随着Pclass的增加,children人数也会增加,同时10岁以下的幸存率和Pclass无关
  • 对20-50的乘客特别是女性来说,Pclass1的幸存率更高
  • 对男性来说,随着年纪的增加,生存机率会降低

因为age有177个空值,为了替换这些NaN值,我们可以用均值替换,但这不合适。
这时,我们可以查看Name特征。查看上述特征时,我们可以发现有譬如Mr和Mrs这一类的称谓。因此我们可以为不同的组别用它们所在的均值替代

SibSp –> Discrete Feature
这个特征表示一个人是独自旅行还是和家人一起

5)特征之间的联系(热点图)
这里写图片描述

positive correlation:如果特征A的增加引起特征B的增加,它们就是positively correlated。1代表很好的正相关。
negative correlation:如果特征A的增加引起特征B的减少,它们就是负相关。-1代表很好地负相关。

现在我们可以说两个特征有很高或完美的相关性,意味着它们两者包含很多相似性信息。
因此,建模时,我们应尝试删除一个冗余变量去减少训练时间。

从上面的热点图我们可以看到,这些特征不是高度相关。最高的一项是SibSp和Parch它们是0.41,因此我们可以采用所有的特征。

Part2:特征工程和数据清洗(Feature Engineering and Data Cleaning)

什么是特征工程?
无论何时,当我们得到包含很多特征的数据集,它不代表所有的特征都是重要的。数据集例可能有很多需要删除的冗余特征。当然,通过观察和从其它特征中提取信息,我们也可以添加新的特征。

Age_band
前面我们说过Age是一个连续特征,但在机器学习建模时用连续变量很困难。

我们需要通过Binning或Normalisation把连续值转换为分类值。我将会用binning。比如吧一组ages放到一个单独的bin中,或为它们制定一个单一的值。
例如:年龄最大的乘客是80岁,我将把它们分成5组,80/5=16

Family_Size and Alone
我们创造了一个新的特征Family_Size and Alone去分析它。这个特征是Parch和SibSp的总结。它给我们一个整合的数据从而我们可以检查幸存率和family size有无关系。Alone将会标记一个乘客是否是单独的。

Fare_Range
fare也是连续变量,我们需要把它转换成序变量,为此我们用了pandas.qcut。

Converting String Values into Numeric
因为我们不能拿string去训练模型,所以需要把它们转换成数值型的
有:Sex Embarked Initial

Drropping UnNeeded Features
Name:
Age:有Age_band替代
Ticket:有很多随机字符串无法分类
Fare:有Fare_cat替代
Cabin:无效
Fare_Range:有Fare_cat
PassengerId:无法分类

Part3:预测建模(Predictive Modeling)
我们已经从EDA部分找到了很多信息。但是仅有它们,我们还不能准确预测一个乘客会存活还是死亡。所以,现在我们将会用一些分类算法预测一个乘客是存活还是死亡。下面就是一些我将用到的建模算法:
1)Logistic Regression
2)Support Vector Machines(Linear and radial)
3)Random Forest
4)K-Nearest Neighbours
5)Naive Bayes
6)Decision Tree
7)Logistic Regression
简单说一下都是sklearn的包,直接调用即可

模型的准确性并不是决定分类器稳健性的唯一因素。我们说分类是由训练数据和测试数据来训练同时获得了90%的准确性。

现在看来这个分类器有很好的准确性,但是我们能确保对一个新测试集来说,它也是90%的准确性吗?答案是否,因为我们不能确保分类器是否会将所有实例都用来训练自己。随着训练数据和测试数据改变,准确性也会发生变化,它会提升也会降低。这就是所谓的模型方差。
为了克服这一点去获得一个通用的模型,我们用Cross Validation。

Cross Validation
很多时候,数据时不均衡的。比如,数据集中可能包含大量的class1实例,但只有很少的其他class实例。因此用数据集中的每个实例去训练和测试我们的算法。从而我们可以得到在整体数据集上很好地准确性。
1)K-Fold交叉验证第一步是把数据集分为k个子集
2)例如我们把数据集分为5份,我们会保留一份用来测试而用其他4份用来训练
3)通过在每一次循环中改变测试集和用其余部分训练算法。准确率和错误率取它们的平均
4)对一些训练数据来说一个算法可能会被underfit(欠拟合),而对于另一些训练集,它会overfit(过拟合)。
因此,通过交叉验证,我们会得到一个通用的模型。

from sklearn.model_selection import KFold #for K-fold cross validationfrom sklearn.model_selection import cross_val_score #score evaluationfrom sklearn.model_selection import cross_val_predict #prediction

因为不均衡,分类的准确性可能会被misleading。
我们可以用confusion matrix去得到一个综合结果。Confusion matrix显示模型哪儿错了或哪个类别模型预测错了。
这里写图片描述
Confusion Matrix解释:
左对角线显示的是正确的预测,右对角线显示的是错误的预测。以第一幅图rbf-SVM为例:
1)正确的预测是491(dead)+247(survived)CV准确性的均值是(491+247)/891=82.8%
2)把58个dead错误划分为survived,把95个survived错误划分成dead
通过观察所有的矩阵,我们可以说rbf-SVM在预测dead passenger时有很高的准确性,NaiveBayes在预测survived passenger时有很高的准确性

Hyper-Parameters Tuning
机器学习模型就像黑盒子。对这个黑盒子来说,有很多默认的参数,我们可以调整它们去得到一个更好的模型。就像SVM模型中的C和gamma还有不同分类器的被称为超参数的similarity different parameters。对于这些超参数,我们可以调整去改变算法的学习率从而获得更好的模型。这就是所谓的超参数调整。

from sklearn.model_selection import GridSearchCV

Ensembling
它是提高模型准确性的一个很好的方式。简单来说,它把很多简单模型整合去创建一个有效的模型。
Ensembling有以下几种方式:
1)Voting Classifier
2)Bagging
3)Boosting

接下来我会对上面三种做一个详细介绍:
1)Voting Classifier
它基于所有子模型的prediction给出一个average prediction。子模型和基模型都是不同类型。
2)Bagging
不像Voting Classifier,Bagging使用相同的分类器
3)Boosting
AdaBoost(Adaptive Boosting)
在本案例中,弱学习器是Decision Tree

Feature Importance
model.feature_importances_

参考链接:Kaggle DieTanic

原创粉丝点击