本文旨在通过一个完整的实战例子, 演示从源数据清洗到特征工程建立, 再到模型训练, 以及模型验证和评估的一个机器学习的完整流程由于初识机器学习, 会比较多的困惑, 希望通过借助这个实战的例子, 可以帮助大家对机器学习了一个初步的认识
数据来源
本文的数据来源于 Lending Club 网站的公开数据, 数据集为自 LendingClub 平台发放的 2016 年 Q3 的总计 99122 条贷款记录
Lending Club 是美国最大的 P2P 网贷交易平台, 利用网络技术直接连接了个人投资者和个人借贷者, 缩短资金流通的细节, 绕过传统的大银行等金融机构, 使得投资者和借贷者都能得到更多实惠对于投资者来说, 可以获得更好的回报; 对于借贷者来说, 则可以获得相对较低的贷款利率
在借贷行业中, 投资者向借贷者提供贷款以获取利息如果借贷者顺利偿还贷款, 投资者则获得利息收益如果借贷者无法偿还贷款, 投资者则损失贷款本金因此, 对于投资者来说, 需要预测借贷者无法偿还贷款的风险, 最大程度地避免投资损失, 最大程度地实现投资回报
实施步骤
一 总体流程说明
数据分析的开始是从了解你要分析的数据以及了解你本次机器学习的目标开始的需要分清是分类问题, 还是回归问题, 同时需要了解数据的构造, 哪些是自变量 (特征), 哪个是因变量 (目标变量) 就本次目标来看, 因为目标变量是 loan_statas(还款状态), 它是一个标称值, 因此本次是一个分类问题
进入数据清洗阶段, 主要是去除一些缺失严重的样式或者特征, 同时去除一些跟业务无关的特征, 以及方差比较小的特征建立特征工程时, 主要是对里面字符特征进行处理, 将其转成数值型, 以及对一些数据值特征进行归一化等处理; 模型训练时, 主要是选择合适的算法以及选择合适的超参数; 模型评估就是将在训练集上运行好的模型, 在测试集上进行验证评估
二了解数据集
使用 pandas 读取数据集, 然后查看数据信息
可以看出一共包含了 99122 条记录, 一共有 121 个特征和一个目标变量, 这些列的类型分布: float64 有 97 个, 字符型有 25 个
三 数据清洗
取出特征 X 以及目标变量 y
其中 load_data 是自己封装的一个函数, 用于根据 targetCol 来分割原来的 df
根据业务去掉不需要的列
目前主要包含: 无关的标识字段以及贷后字段
调用自定义函数进行清理
主要包含的以下操作:
去除所有行以及所有的列均为 nan 的数据
去除缺失率高的特征, 这里超过 0.9 则不考虑
去除特征中包含实例类别太多的特征, 默认包含 1000 个实例则不考虑
对于数值型, 如果标准差太小的, 则不考虑该特征
可以从打印出的日志上看出, 经过上一步的清洗步骤, 已经从原来的 121 个特征变量, 降成 75 个特征变量
再看一下清洗完后, 目前的特征中样本缺失度情况:
由图可以目前缺失最高的 mths_since_last_record 在 80% 左右, 在预设范围内, 整体情况还相对理想
查看特征的相关程度
如果特征之间相关度比较高的话, 那就会影响分析结果, 这里对这些特征的相关度进行排序:
从上述的相关系数的关联情况可以看出: funded_amnt,loan_amnt,funded_amnt_inv 这几个特征的关联比较强, 仅保留 funded_amnt, 去除其它两个特征, 经过清洗后只剩下了 73 个特征
四特征工程
对目标变量的处理
查看目标变量 y 的值的分布情况
根据业务来理解, Current 和 Fully Paid 用户是属于信用良好的样本, 用 1 表示, Late (31-120 days) 和 Late (16-30 days) 逾期的用户就归于信用不好的样本, 用 0 表示, 其它的几类就暂时用 np.nan 来代替, 本次暂时不分析, 先删除这些空的 3912 个样本
处理完后, 目标变量的分布如下:
对字符型特征的处理
查看当前特征中字符型的特征主要包含:
通过数据的分布可以看出特征 pymnt_plan,application_type 分布很不均衡, 暂时不考虑这两个特征
同时将 init_rate 转成 float 类型, 将 emp_length 处理成 int 类型, 对剩下的三个 home_ownership,verification_status,initial_list_status 类型变量做独热编码, 使用 pd.get_dummies 函数, 同时去除原始的那三个字段
经过如上的处理, 将其全部字符型的特征转成了数值型
对整体数值型特征的处理
这里主要对缺失值处理, 使用每个特征的中位数进行缺失值填充
到此已全部完成了特征工程的建立, 最终特征工程包含 95210 个样本以及 77 特征, 建好的特征工程进入下一阶段的模型训练
五 模型训练
因为考虑到样本的不均衡性, 交叉验证的方法使用 StratifiedShuffleSplit 方式来划分样本, 同时学习器使用 GBRT 算法, 同时 RandomizedSearchCV 进行最优参数选择目前只是设置了基本的参数:
通过训练集的充分训练后, 得到目前 GBRT 最优的参数如下:
然后使用这个最优的模型来对测试集进行预测:
这样我们就得到了测试集在这个模型中跑出来的结果 y_predicted 数组, 然后将它与 y_test 进行比对就可以对该模型进行评估, 具体的可以查看 2.6 小结的结果
六模型评估
查看分类报告
可以看出整体平均的精确度和召回率和 F1 值还是可以的, 不过对于样本 0 的召回率和 F1 值为 0, 可能需要进一步优化
查看学习曲线
学习曲线是一条关于样本个数和经验损失函数之间的曲线, 通过学习曲线可以看到关于偏差方差用于改善机器学习算法的决策提供依据; 从目前的曲线可以看出, 训练得分和测试得分基本稳定在 0.972 这个点, 相对来说比较理想
结论与展望
本文只是简单的演示了一个完整的机器学习的流程, 重点在于突出机器学习的各个实施步骤, 对于整体的模型可能还有以下几点可以优化与完善:
如何更好的处理样本的不平衡性
是否考虑其它的算法进行比对效果, 比如 xgboost
算法的超参数调优可以增加几个变量调优
特征工程的建立还是稍微粗糙了些, 还是可以再细化 (比如特征的组合, 特征的重要性排序, 数值型特征的归一化处理等)
由于机器学习涉及面较广, 要得到一个最优的结果, 需要不断的优化与完善模型文中的纰漏可能在所难免, 如果有什么建议或者意见, 也欢迎可以与我交流, 谢谢!
来源: http://rdc.hundsun.com/portal/article/859.html