andy注:每个Kaggle竞赛中都遵守着一个基本的模版,本文基于https://www.kaggle.com/willkoehrsen/start-here-a-gentle-introduction所写
1.了解问题和数据
2.数据清理和格式化
3.探索性数据分析
4.基准模型
5.改进的模型
6.模型解释
1.了解问题和数据
列出竞赛数据并了解
竞赛的基本数据出来,对这些数据进行理解,在本次竞赛中,有7个基本数据
数据:
application_train/application_test:家庭信贷中关于每个贷款申请的主要训练和测试数据。每个贷款都有自己的行,由“SK_ID_CURR”特性标识。训练申请数据带有“目标”,表示0:贷款已偿还或1:贷款未偿还。
bureau:客户以前在其他金融机构的信用数据。每个以前的信贷在局里有自己的行,但是申请数据中的一个贷款可以有多个以前的信贷。
bureau_balance:关于以前在bureau的学分的月度数据。每行是前一个信用记录的一个月,一个前一个信用记录可以有多个行,每个月一个信用记录的长度。
previous_application:在申请数据中有贷款的客户之前的家庭信贷贷款申请。应用程序数据中的每个当前贷款都可以有多个以前的贷款。以前的每个应用程序都有一行,由“SK_ID_PREV”特性标识。
POS_CASH_BALANCE:每月的数据,关于以前的销售点或现金贷款客户有住房信贷。每行是前一个销售点或现金贷款的一个月,而前一个贷款可以有许多行。
credit_card_balance:每月关于以前信用卡客户使用家庭信用的数据。每行是信用卡余额的一个月,而一张信用卡可以有很多行。
installments_payment:先前在Home Credit的贷款付款历史。每一笔已付款都有一行,每一笔未付款都有一行。
以下这个图片是解释这些数据的相关:
数据相关
2.数据清理和格式化
在比赛中,我们无可避免的总会遇到一些缺失值,那我们该如何处理这些缺失值呢?
在这个比赛中,我们用XGBoost等模型来处理缺失值。另一个选择是删除具有高百分比缺失值的列,可能这些列对我们的模型有帮助,但我们无法提前知道。因此,我们暂时保留所有列。
决策树、RF、xgboost如何处理缺失值?:https://blog.csdn.net/qq_19446965/article/details/81637199
(1)判断提交数据的评估标准
在will Koehrsen的文章中,他使用了ROC 和 AUC曲线,在他的解释中,认为这两个曲线可以更加直观并比较出各个学习器的基本性能,他认为ROC AUC是模型性能的较好表征。
ROC在上图中,图上的一条直线表示单个模型的曲线,沿直线移动表示改变用于划分正实例的阈值。
阈值从右上端的0开始到左下端的1。
左边的曲线和另一条曲线上方的曲线表明了更好的模型。
例如,蓝色模型优于红色模型,红色模型优于黑色对角线,黑色对角线表示幼稚的随机猜测模型。而AUC表示的是在ROC曲线下的面积,在这个指标中,更加细化比较了各个学习器的得分。
(2)对数据进行读取操作,然后训练基本数据,探查这些数据的异常值
3.探索性数据分析(EDA)
我个人理解,探究性数据分析第一步将数据可视化,然后从图中理解数据的趋势,数据异常等问题,再对数据进行处理,例如数据清洗等操作。
在will Koehsen的操作中
第一步:检查各个数据的异常值:
检查目标的分布->检查缺失值->检查列类型->结果可视化
结果可视化后,我们可以从中了解到,我们需要对哪些异常问题进行处理。
第二步:对数据进行编码操作(处理分类变量)
因为机器学习模型不能处理分类变量(除了LightGBM等一些模型)。因此,在将这些变量传递给模型之前,我们必须找到一种方法将这些变量编码(表示)为数字。这个过程主要有两种方式:标签编码和独热编码(使用独热编码后需要进行降维操作)
对于具有2个唯一类别的任何类别变量(dtype == object),我们将使用标签编码,对于具有2个以上唯一类别的任何类别变量,我们将使用one-hot编码。
第三步:对异常值处理
处理异常取决于确切的情况,没有固定的规则。最安全的方法之一就是将异常值设置为缺失值,然后在机器学习之前将其填充(使用赋值)。在本例中,由于所有的异常值都完全相同,我们希望用相同的值来填充它们,以防所有这些贷款都有共同之处。异常值似乎有一定的重要性,所以我们想告诉机器学习模型如果我们真的填了这些值。作为解决方案,我们将使用非数字填充异常值(np.nan),然后创建一个新的布尔列,指示该值是否为异常。
在做EDA时我们总是希望注意的一个问题是数据中的异常。这些可能是由于错误输入的数字,测量设备的错误,或者它们可能是有效的,但极端的测量。
在这个比赛中,异常的违约率较低。如下图所示:
如何处理异常?
处理异常取决于具体情况,没有设定规则。最安全的方法之一就是将异常设置为缺失值,然后在机器学习之前填充它们(使用Imputation)。在这种情况下,由于所有异常都具有完全相同的值,我们希望用相同的值填充它们,以防所有这些贷款共享一些共同点。
接下来,我们我们要查找一下要素与目标之间的相关性。
从图中可以看出DAYS_BIRTH是最正相关的。(TARGET除外,因为变量与其自身的相关性始终为1!)
第四步:相关性
现在我们已经处理了分类变量和离群值,让我们继续处理EDA。一种尝试和理解数据的方法是在特征和目标之间寻找相关性。我们可以使用。校正 dafaframe法计算每个变量与目标之间的[Pearson相关系数]
第五步:建立特征工程
特征工程的好处::特征工程比模型构建和超参数调优有更大的投资回报。
在在will koehrsen的文章中只尝试了两种简单的多项式特征和添加特定的领域知识
添加的领域知识他使用的是由Aguiar的这个脚本启发的5个特性:
CREDIT_INCOME_PERCENT:信用金额相对于客户的收入的百分比
ANNUITY_INCOME_PERCENT:贷款年金相对于客户收入的百分比
CREDIT_TERM:以月份为单位的付款期限(因为年金是每月应付金额
DAYS_EMPLOYED_PERCENT:相对于客户的年龄,被雇佣的天数的百分比
4.基准模型
为了获得基线,我们将在编码分类变量之后使用所有的特性。
我们将通过填充缺失值(赋值)和规范化特征的范围(特征缩放)对数据进行预处理。
对于基准模型,先可以考虑使用逻辑回归,这个比较直观的学习模型
【知识点】什么是基线模型?为什么从基线模型开始?
答案:https://baijiahao.baidu.com/s?id=1600230352380900553&wfr=spider&for=pc
5.改进模型:随机森林
为什么使用随机森林,而不使用GBDT等呢?
Bagging与Boosting的区别:二者的主要区别是取样方式不同。Bagging采用均匀取样,而Boosting根据错误率来取样,因此Boosting的分类精度要优于Bagging。
Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关;Bagging的各个预测函数没有权重,而Boosting是有权重的;Bagging的各个预测函数可以并行生成,而Boosting的各个预测函数只能顺序生成。对于象神经网络这样极为耗时的学习方法。Bagging可通过并行训练节省大量时间开销。
而随机森林属于bagging类比较出色的,所以在当前这种我个人认为在这种数据多的情况下可以选用随机森林。