目录

任务描述

实现过程

基本思路

1. 数据集预览

2. 数据预处理

3. 特征工程

4. 模型选择

4.1 数据及划分及数据归一化

4.2 LR

4.3 SVM

4.4 决策树

4.5 Xgboost

4.6 LightGBM

5. 模型调参

6. 性能评估

7. 模型融合

遇到的问题

参考

More


任务描述

给定金融数据,预测贷款用户是否会逾期。(status是标签:0表示未逾期,1表示逾期。)

Misson1 - 构建逻辑回归模型进行预测
Misson2 - 构建SVM和决策树模型进行预测
Misson3 - 构建xgboost和lightgbm模型进行预测
Mission4 - 记录五个模型关于precision,rescore,f1,auc,roc的评分表格,画出auc和roc曲线图
Mission5 - 关于数据类型转换以及缺失值处理(尝试不同的填充看效果)以及你能借鉴的数据探索
Mission6 - 使用网格搜索对模型进行调优并采用五折交叉验证的方式进行模型评估
Mission7 - 用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分
Mission8 - 分别用IV值和随机森林挑选特征,再构建模型,进行模型评估

实现过程

基本思路

主要分为以下若干步骤:
1)数据集预览
2)数据预处理:切分X,y;删除无用特征;字符型特征编码;缺失值填充 等
3)特征工程
4)模型选择:lr,svm,dt,xgboost,lightgbm 等
5)模型调参
6)性能评估
7)最终结果

1. 数据集预览

# 因为数据并非utf-8编码,要使用gbk编码读入,否则出错
data = pd.read_csv('./data/data.csv', index_col=0, encoding='gbk')# 观察数据构成
# data.head()
print(data.shape)    # (4754, 89)

2. 数据预处理

X, y 划分

# 划分 X, y
y = data['status']
X = data.drop('status', axis=1)

特征处理

# 首先剔除一些明显无用的特征,如 id_name, custid, trade_no, bank_card_no,
# 这些优点类似一个人的唯一信息,如果加入模型训练且对最终模型生效的话,很可能就是出现了过拟合
X.drop(['id_name', 'custid', 'trade_no', 'bank_card_no'], axis=1, inplace=True)# 数值型变量
X_num = X.select_dtypes('number').copy()
# student_feature
X_num.fillna({'student_feature': 0}, inplace=True)
# 其他数值型变量使用均值代替
X_num.fillna(X_num.mean(), inplace=True)# 字符型变量
X_str = X.select_dtypes(exclude='number').copy()
X_str_dummy = pd.get_dummies(X_str['reg_preference_for_trad'])# 合并
X_cl = pd.concat([X_num, X_str_dummy], axis=1, sort=False)
X_cl.shape

3. 特征工程

由于特征工程比较浩大,所以新开一文章用以记录。
详见:https://blog.csdn.net/l75326747/article/details/84326897

4. 模型选择

4.1 数据及划分及数据归一化

# 数据划分
from sklearn.model_selection import train_test_split
random_state = 1115
X_train, X_test, y_train, y_test = train_test_split(X_cl, y, test_size=0.3, random_state=random_state)# 归一化
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train_std = ss.fit_transform(X_train)
X_test_std = ss.transform(X_test)

4.2 LR

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=0.05, penalty='l1')
lr.fit(X_train_std, y_train)

4.3 SVM

from sklearn.svm import SVC
# 线性 SVM
linear_svc = SVC(kernel='linear', probability=True)
linear_svc.fit(X_train_std, y_train)
# 多项式 SVM
poly_svc = SVC(kernel='poly', probability=True)
poly_svc.fit(X_train_std, y_train)

4.4 决策树

from sklearn.tree import DecisionTreeClassifier
# 决策树
dt = DecisionTreeClassifier(max_depth=8)
dt.fit(X_train_std, y_train)

4.5 Xgboost

from xgboost.sklearn import XGBClassifier
xgb_params = {'learning_rate': 0.1,'n_estimators': 42,'max_depth': 5,'min_child_weight': 1,'gamma': 0,'subsample': 0.8,'colsample_bytree': 0.8,'objective': 'binary:logistic','nthread': 4,'scale_pos_weight': 1,'seed': 112
}
xgb_model = XGBClassifier(**xgb_params)# 训练
xgb_model.fit(X_train_std, y_train)

4.6 LightGBM

from lightgbm.sklearn import LGBMClassifier
lgb_params  = {'learning_rate': 0.1,'n_estimators': 42,'max_depth': 5,'min_child_weight': 1,'gamma': 0,'subsample': 0.8,'colsample_bytree': 0.8,'objective': 'binary', # 这里和 xgb 不一样'nthread': 4,'scale_pos_weight': 1,'seed': 112
}
lgb_model = LGBMClassifier(**lgb_params) # 迭代次数(n_estimators)已经是超参之一# 训练
lgb_model.fit(X_train_std, y_train)

5. 模型调参

针对以上各个模型进行调参。使用 5折交叉验证,评价标准使用 roc_auc。

# 设定评价标准
scoring = 'roc_auc'  # 评价标准
n_fold = 5  # n折交叉验证

以下针对各个模型进行网格调参:

# LR
lr_param = {'C': [0.05, 0.1, 0.5, 1],'penalty': ['l1', 'l2'],
}lr_grid = GridSearchCV(lr, lr_param, cv=n_fold, scoring=scoring, n_jobs=-1)
lr_grid.fit(X_train_std, y_train)
print(lr_grid.best_score_)  # 最优分数
print(lr_grid.best_params_)  # 最优参数
print(lr_grid.cv_results_)  # 结果# 把参数重新赋值给原模型
lr.set_params(**lr_grid.best_params_)
lr.fit(X_train_std, y_train)# 线性SVC 如果一次性设置的参数太多,可能会跑很长时间,这个时候,建议使用贪心的方法,在某个参数调到最优的时候再调另一个参数
linear_svc_param = {
#     'kernel': ['linear', 'poly']'C': [0.5, 1, 5],
#     'degree': [2, 3]
}linear_svc_grid = GridSearchCV(linear_svc, linear_svc_param, cv=n_fold, scoring=scoring, n_jobs=-1)
linear_svc_grid.fit(X_train_std, y_train)
print(linear_svc_grid.best_score_)  # 最优分数
print(linear_svc_grid.best_params_)  # 最优参数# 把参数重新赋值给原模型
linear_svc.set_params(**linear_svc_grid.best_params_)
linear_svc.fit(X_train_std, y_train)# 多项式SVC
poly_svc_param = {'C': [0.5, 1, 5],'degree': [2, 3]
}poly_svc_grid = GridSearchCV(poly_svc, poly_svc_param, cv=n_fold, scoring=scoring, n_jobs=-1)
poly_svc_grid.fit(X_train_std, y_train)
print(poly_svc_grid.best_score_)  # 最优分数
print(poly_svc_grid.best_params_)  # 最优参数# 把参数重新赋值给原模型
poly_svc.set_params(**svc_grid.best_params_)
poly_svc.fit(X_train_std, y_train)# 决策树  关于决策树参数较多,可参考:https://blog.csdn.net/qq_41577045/article/details/79844709
dt_param = {'max_depth': [3, 4, 5, 6, 7,],
}dt_grid = GridSearchCV(dt, dt_param, cv=n_fold, scoring=scoring, n_jobs=-1)
dt_grid.fit(X_train_std, y_train)
print(dt_grid.best_score_)  # 最优分数
print(dt_grid.best_params_)  # 最优参数# 把参数重新赋值给原模型
dt.set_params(**dt_grid.best_params_)
dt.fit(X_train_std, y_train)

PS:上面调整的均是比较常见的超参,其他参数请参考官方文档。决策树中涉及参数较多,对不同数据集调节参数不一,详细可参考 sklearn种决策树的算法参数。另外,XGBoost 与 LightGBM 模型比较复杂,调参过程中涉及的步骤较多,可参考另一篇博文:XGBoost 与 LightGBM 调参

6. 性能评估

评估函数代码:

from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, roc_curve
from matplotlib import pyplot as plt
# 定义评估函数
def model_metrics(clf, X_train, X_test, y_train, y_test):# 预测y_train_pred = clf.predict(X_train)y_test_pred = clf.predict(X_test)y_train_pred_proba = clf.predict_proba(X_train)[:, 1]y_test_pred_proba = clf.predict_proba(X_test)[:, 1]# 评估# 准确性print('准确性:')print('Train:{:.4f}'.format(accuracy_score(y_train, y_train_pred)))print('Test:{:.4f}'.format(accuracy_score(y_test, y_test_pred)))# 召回率print('召回率:')print('Train:{:.4f}'.format(recall_score(y_train, y_train_pred)))print('Test:{:.4f}'.format(recall_score(y_test, y_test_pred)))# f1_scoreprint('f1_score:')print('Train:{:.4f}'.format(f1_score(y_train, y_train_pred)))print('Test:{:.4f}'.format(f1_score(y_test, y_test_pred)))# roc_aucprint('roc_auc:')print('Train:{:.4f}'.format(roc_auc_score(y_train, y_train_pred_proba)))print('Test:{:.4f}'.format(roc_auc_score(y_test, y_test_pred_proba)))    # 描绘 ROC 曲线fpr_tr, tpr_tr, _ = roc_curve(y_train, y_train_pred_proba)fpr_te, tpr_te, _ = roc_curve(y_test, y_test_pred_proba)# KSprint('KS:')print('Train:{:.4f}'.format(max(abs((fpr_tr - tpr_tr)))))print('Test:{:.4f}'.format(max(abs((fpr_te - tpr_te)))))# 绘图plt.plot(fpr_tr, tpr_tr, 'r-',7label="Train:AUC: {:.3f} KS:{:.3f}".format(roc_auc_score(y_train, y_train_pred_proba), max(abs((fpr_tr - tpr_tr)))))plt.plot(fpr_te, tpr_te, 'g-',label="Test:AUC: {:.3f} KS:{:.3f}".format(roc_auc_score(y_test, y_test_pred_proba),max(abs((fpr_tr - tpr_tr)))))plt.plot([0, 1], [0, 1], 'd--')plt.legend(loc='best')plt.title("ROC curse")plt.show()

下面是各个模型的评估函数结果:

  accuracy recall f1_score ROC_AUC KS ROC曲线

逻辑回归

Train:0.7986
Test:0.8031
Train:0.3198
Test:0.3324
Train:0.4444
Test:0.4565
Train:0.4444
Test:0.4565
Train:0.4564
Test:0.4576
线性SVM Train:0.7944
Test:0.7975
Train:0.2542
Test:0.2676
Train:0.3838
Test:0.3967
Train:0.8082
Test:0.7894
Train:0.4796
Test:0.4575
多项式SVM Train:0.8245
Test:0.7687
Train:0.3079
Test:0.1577
Train:0.4691
Test:0.2534
Train:0.9511
Test:0.7172
Train:0.8093
Test:0.3552
决策树 Train:0.8777
Test:0.7526
Train:0.6539
Test:0.4085
Train:0.7292
Test:0.4510
Train:0.9016
Test:0.6573
Train:0.6550
Test:0.3018
Xgboost Train:0.8798
Test:0.7940
Train:0.5644
Test:0.3690
Train:0.7028
Test:0.4712
Train:0.9525
Test:0.7932
Train:0.7644
Test:0.4342
LightGBM Train:0.8843
Test:0.7996
Train:0.5776
Test:0.3634
Train:0.7154
Test:0.4743
Train:0.9571
Test:0.7991
Train:0.7776
Test:0.4548

7. 模型融合

关于 Stacking 的原理这里就不细说了,具体参考 stacking 模型融合

为了贯彻调包侠的理念,这里直接调用 mlxtend 库里面的 StackingCVClassifier 进行建模,这个库可以很好地完成对 sklearn 的 stacking。

from mlxtend.classifier import StackingCVClassifier, StackingClassifier# 构建 Stacking 模型,因为 dt 评分太低了,所以抛弃掉,使用 lr 作为最后的融合模型
s_clf = StackingClassifier(classifiers=[linear_svc, xgb_model, lgb_model], meta_classifier=lr, use_probas=True, verbose=3)s_clf.fit(X_train_std, y_train)

下面我们调用上面定义好的函数,看一下模型融合之后的结果:

# 评估 Stacking 模型
model_metrics(s_clf, X_train_std, X_test_std, y_train, y_test)

可以看到,进行模型融合之后,结果并不比原来的 xgb 和 lgb 好,也许模型融合对当前题目并不是一个很好的解决方案。

遇到的问题

1. SVM 使用 rbf 核时,分类结果只有一类
2. 进行模型融合后的结果并没有比原来好

参考

1. XGBoost使用教程(纯xgboost方法):https://blog.csdn.net/u011630575/article/details/79418138
2. 【集成学习】lightgbm使用案例:https://www.cnblogs.com/wanglei5205/p/8654041.html
3. sklearn种决策树的算法参数:https://blog.csdn.net/qq_41577045/article/details/79844709
4. StackingClassifier:https://blog.csdn.net/github_35965351/article/details/60763606

More

代码参见 Github:https://github.com/LongJH/ALittleTarget/tree/master/Mission1

ML实操 - 贷款用户逾期情况分析相关推荐

  1. ML - 贷款用户逾期情况分析5 - 特征工程2(特征选择)

    文章目录 特征选择 (判定贷款用户是否逾期) 1. IV值进行特征选择 1.1 基本介绍 1.2 计算公式 2. 随机森林进行特征选择 2.1 平均不纯度减少 mean decrease impuri ...

  2. ML - 贷款用户逾期情况分析2 - 特征工程1(数据预处理)

    文章目录 数据预处理 (判定贷款用户是否逾期) 1. 删除无用特征 2. 数据格式化 - X_date 3. 数据处理 - 类别特征 X_cate 4. 数据处理 - 其他非数值型特征 5. 数据处理 ...

  3. ML - 贷款用户逾期情况分析6 - Final

    文章目录 思路 1. 导入数据 2. 性能评估函数 3. 模型优化 3.1 LR模型 3.2 SVM模型 3.3 决策树模型 3.4 XGBoost模型 3.5 LightGBM模型 3.6 模型融合 ...

  4. 【机器学习-贷款用户逾期情况分析2】3.stacking模型融合

    3.0 任务说明 用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分果. 3.1 stacking模型融合 Stacking(有时候也称之为stacked ge ...

  5. Linux笔记总结 - linux实操篇 - 用户管理

    Linux笔记总结 - linux实操篇 - 用户管理 1 基本介绍 Linux系统是一个多用户多任务的操作系统,任何一个要使用的系统资源的用户,都首先向系统管理员申请一个账号,然后以这个账号身份进入 ...

  6. 贷款用户逾期问题Task4

    贷款用户逾期问题Task4 任务4 - 模型评估(2天) 评估 任务4 - 模型评估(2天) 任务4:记录5个模型(逻辑回归.SVM.决策树.随机森林.XGBoost)关于accuracy.preci ...

  7. 贷款用户逾期问题Task3

    贷款用户逾期问题Task3 任务3 - 建模(2天) 逻辑回归LR 支持向量机SVM 决策树 任务3 - 建模(2天) 用逻辑回归.svm和决策树:随机森林和XGBoost进行模型构建,评分方式任意, ...

  8. 实操|特征变量多重共线性的分析与检验(含代码)

    对于Linear回归.Logistic回归等线性模型来讲,特征变量的多重共线性是衡量模型性能的一个重要维度.因此,如何有效识别并解决模型特征的多重共线性问题,是实际业务场景建立线性模型过程的必要环节. ...

  9. 医疗器械系统测试用例编写实操(二)流程图分析法

    一.流程分析法设计用例步骤 画出业务流程图 设置功能路径优先级 确定测试路径 选取测试数据 构造测试用例 二.图解业务流程图分析法 三.流程分析法例子 四.流程分析实操 功能背景:CT器械用于医院设备 ...

最新文章

  1. Cisco 2950 忘记密码如何重设
  2. Java并发编程71道面试题及答案 1
  3. 如何自动填充网页表单_iCab for Mac(web网页浏览器)
  4. 搜索和在线阅读 Github 代码的插件推荐
  5. 数据结构链表实验c语言程序,数据结构实验练习(—):链表实现100位数的加减法...
  6. layui结合mybatis的pagehelper插件的分页通用的方法
  7. 微型计算机基本原理与应用pdf,微型计算机原理和应用.PDF
  8. 第二个网站成长经历,http://www.chaomagou.com/ 潮妈购
  9. MyBatis3_[tp_41-42-43]-_动态sql_trim_自定义字符串截取_choose分支选择_update的set与if-trim 结合的动态更新...
  10. CF1151FSonya and Informatics
  11. IDEA中Terminal窗口中无法使用maven命令
  12. scrapy---下载中国大学慕课课程视频及文件
  13. latch mysql_关于MySQL latch争用深入分析与判断
  14. [高等数学]解析一道关于函数极限的概念考察题(001)
  15. 守护游戏安全,保障开发权益丨客户案例
  16. Vue前端报错及原因分析集合
  17. ES 创建索引设置(setting)基础
  18. mysql数据库备份与导入
  19. 计算机配置高低怎么看,电脑配置的高低怎么查看
  20. 【深度学习基础知识 - 25】提升模型泛化能力的方法

热门文章

  1. 如何给对话框添加背景图片
  2. 牛顿法求解1-100的平方根python_使用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)...
  3. 计算机学院毕业条幅,欢送毕业生条幅标语大全
  4. 基于GPU 和场景分页的森林可视化模拟
  5. 地铁供电系统原理图_策划|5分钟读懂地铁运行原理
  6. 计算机cmd复制粘贴指令,Win7在命令提示符(cmd.exe)中如何进行复制、粘贴工作
  7. 三角测量计算点的三维坐标
  8. w806(基于Arduino)——点亮LED灯
  9. 【Pygame实战】星战领衔,修仙种田,四月我们能玩到什么游戏?这款《星际大战》不容错过啦~
  10. Oracle EBS R12 财务总账模块设置相关问题