39丨数据挖掘实战(1):信用卡违约率分析
39丨数据挖掘实战(1):信用卡违约率分析
讲述:陈旸
时长08:06大小7.42M
构建随机森林分类器
使用 GridSearchCV 工具对模型参数进行调优
使用 Pipeline 管道机制进行流水线作业
对信用卡违约率进行分析
总结
赞 9
提建议
精选留言(33)
- 柚子2019-03-13老师, 使用GridSearchCV 工具多次执行每次结果都不一样,是怎么判定最优分数就是0.9667,最优参数就是6呢?共 4 条评论31
- 西湖晨曦2019-09-03我是银行信用卡部的从业人员,也很喜欢数据分析。 但是看了这个案例,感觉这个案例能够给信用卡的数据分析带来什么呢?我的意思是,能够分析出什么问题吗?银行信用卡部应该在持卡人用卡的什么阶段开始开始要采取措施防止诈骗?什么类型的客户容易诈骗?---感觉这个案例就是从数字到数字,没有能够给真实业务带来什么帮助。 -----也想对从事数据分析的人员提个醒,数据分析不是从纯数字到纯数字的纯学术研究,应该是联系实际工作,能够给实际工作带来帮助的啊!联系到此案例,应该是能够给银行信用卡部的防欺诈工作带来提升的啊~分析了什么出来?银行的哪个环节应该提升以防止欺诈?展开
作者回复: 用数据分析做分类预测,也就是遇到了其他的用户数据,通过模型进行分类预测,我们有多少准确率可以预测出来他是否是欺诈用户。
共 8 条评论25 - vortual2019-03-13老师,实际工作中数据量大的话跑个模型应该要不少时间,应该不允许这么去试所有参数和那么多算法吧?还有一个疑问是数据量超过一定量是不是要用深度学习了?希望老师能解惑下
作者回复: 深度学习 是帮你发现一些不太明显(线性情况下不容易)发现的规律。有时候 你可以先用机器学习得到一个baseline,然后再考虑用 NN模型,毕竟深度模型计算量大,有时候还需要GPU
14 - CR772020-04-05在做的时候又如下问题,我觉得需要注意: 第一、PAY_0到PAY_6经典指标性的特征,但是具体什么意义不知道,个人认为不应该草草的归一化。 第二,每月账单金额体现的是客户的消费水平,每月的还款金额体现的是客户的实际经济情况(当然不排除那些,有钱但是不还款的情况),所以我想能不能将(每月的账单金额 - 每月的还款金额)设置为一个新的特征,可能能更加贴近用户的实际经济情况。 第三,是否需要采用下采样?因为毕竟正负样本的比例是有一定的差距的,我们模型训练出来的效果并不是很好是不是有关系 第四,问题的实际意义的分析,这是一个违约率的数据挖掘,更多的可以说是一种分析,我们得到的结果是什么,是一个新的客户在产生种种交易之后,他违约的可能,这是我能想到的意义,放到商业上的话我们实际上是要做出怎么样的决策呢?展开
作者回复: 1. 是否需要归一化,取决于所使用的模型。如果是树模型,只在意他们的相对大小不在意实际距离,其实可以不归一化。 2. 不错的想法,可以尝试下。 3. 下采样是解决样本极度不均衡的常用方法,有同学也确实得到了不错的效果,可以尝试下。 4. 在实际应用中,可以利用该模型对高风险客户的额度进行限制,也可以用来限制他们的贷款等等。
共 2 条评论5 - 王彬成2019-03-13GridSearch最优参数: {'n_estimators': 10} GridSearch最优分数: 0.8187 准确率 0.8129 -----代码------ # -*- coding: utf-8 -*- # 信用卡违约率分析 import pandas as pd from sklearn.model_selection import learning_curve, train_test_split,GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.metrics import accuracy_score from sklearn.ensemble import AdaBoostClassifier from matplotlib import pyplot as plt import seaborn as sns # 数据加载 data=data=pd.read_csv('./credit_default-master/UCI_Credit_Card.csv') # 数据探索 print(data.shape) # 查看数据集大小 print(data.describe()) # 数据集概览 # 查看下一个月违约率的情况 next_month = data['default.payment.next.month'].value_counts() print(next_month) df = pd.DataFrame({'default.payment.next.month': next_month.index,'values': next_month.values}) plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.figure(figsize = (6,6)) plt.title('信用卡违约率客户\n (违约:1,守约:0)') sns.set_color_codes("pastel") sns.barplot(x = 'default.payment.next.month', y="values", data=df) locs, labels = plt.xticks() plt.show() # 特征选择,去掉ID字段、最后一个结果字段即可 data.drop(['ID'], inplace=True, axis =1) #ID这个字段没有用 target = data['default.payment.next.month'].values columns = data.columns.tolist() columns.remove('default.payment.next.month') features = data[columns].values # 30%作为测试集,其余作为训练集 train_x, test_x, train_y, test_y = train_test_split(features, target, test_size=0.30, stratify = target, random_state = 1) #分类器 ada=AdaBoostClassifier( random_state=1) #需要调整的参数 parameters={'n_estimators':[10,50,100]} # 使用 GridSearchCV 进行参数调优 clf=GridSearchCV(estimator=ada,param_grid=parameters,scoring = 'accuracy') clf.fit(train_x,train_y) print("GridSearch最优参数:", clf.best_params_) print("GridSearch最优分数: %0.4lf" %clf.best_score_) predict_y=clf.predict(test_x) print("准确率 %0.4lf" %accuracy_score(test_y, predict_y))展开
作者回复: Good Job
共 2 条评论5 - 跳跳2019-03-131.对GridSearchCV的理解:就是在之前的经验的基础上选择了一些较好的取值备选,然后分别去试,得到一个好的性能。比直接选择参数多了一些保障,但是也增加一些计算负担。 2.在老师代码的基础上添加了adaboost分类,使用adaboost默认的分类器,结果是在n_estimators=10的时候取得最优性能,准确率是0.8187 GridSearch 最优参数: {'AdaBoostClassifier__n_estimators': 10} GridSearch 最优分数: 0.8187 准确率 0.8129展开
作者回复: 对的 给一个范围让GridSearchCV 利用穷举找到最优
5 - third2019-03-20提问:老是出现futureWarning,是什么情况 GridSearch最优参数: {'n_estimators': 10} GridSearch最优分数: 0.8187 准确率 0.8129
作者回复: 可以屏蔽 warning
共 2 条评论4 - 王彬成2019-03-13使用 Pipeline 管道机制的优势,参考资料: https://www.jianshu.com/p/9c2c8c8ef42d https://blog.csdn.net/qq_41598851/article/details/80957893 个人理解: Pipeline是将数据处理流程的共同部分提取出来,简化代码。 以本文最后的编程案例为例,共同部分是“数据规范化”和“使用数据分类算法”,将俩部分封装。 在每一次循环“算法”时,pipeline里头完成算法更新。GridSearchCV引用固定的pipeline,实则算法已经更新了。这样减少了多余代码的书写。展开
作者回复: 感谢分享
4 - 白夜2019-03-13三万条,25个字段就要运算几分钟了,数据上亿。。。 ''' GridSearch最优参数: {'svc__C': 1, 'svc__gamma': 0.01} GridSearch最优分数: 0.8174 准确率 0.8172 68.59484457969666 s GridSearch最优参数: {'decisiontreeclassifier__max_depth': 6} GridSearch最优分数: 0.8186 准确率 0.8113 1.8460278511047363 s GridSearch最优参数: {'randomforestclassifier__n_estimators': 6} GridSearch最优分数: 0.7998 准确率 0.7994 2.297856330871582 s GridSearch最优参数: {'kneighborsclassifier__n_neighbors': 8} GridSearch最优分数: 0.8040 准确率 0.8036 154.36387968063354 s GridSearch最优参数: {'adaboostclassifier__n_estimators': 10} GridSearch最优分数: 0.8187 准确率 0.8129 13.483576774597168 s '''展开
作者回复: Good Job
共 3 条评论3 - 王彬成2019-03-13‘GridSearch最优分数’和‘预测数据准确率’是怎么理解的。以下我的理解对吗 我理解是‘GridSearch最优分数’是从【训练数据】中得到的最优准确率。 而‘预测数据准确率’是利用最优模型,分析【测试数据】得到的准确率。2
- JingZ2019-03-13# 信用卡违约率分析 KNN相比较而言,跑得最慢了点 from sklearn.ensemble import AdaBoostClassifier # 构造各种分类器 AdaBoostClassifier(random_state=1) # 分类器名称 'adaboostclassifier' # 分类器参数 {'adaboostclassifier__n_estimators': [10, 50, 100]} 结果: GridSearch 最优分数:0.8187 GridSearch 最优参数: {'adaboostclassifier__n_estimators': 10} 准确率 0.8129展开2
- William~Zhang2020-03-18使用gridsearchcv的时候,比如算法模型有n个参数,那么param_grid这个字典是不是应该对应写上参数的名称,但是在文章中,老师好像在前面还加上了模型名称比如svc__gamma1
- 建强2020-03-10加入AdaBoost分类器后,输出的结果如下: GridSearch最优参数: {'svc__C': 1, 'svc__gamma': 0.01} GridSearch最优分数: 0.8174 准确率 0.8172 GridSearch最优参数: {'decisiontreeclassifier__max_depth': 6} GridSearch最优分数: 0.8186 准确率 0.8113 GridSearch最优参数: {'randomforestclassifier__n_estimators': 6} GridSearch最优分数: 0.7998 准确率 0.7994 GridSearch最优参数: {'kneighborsclassifier__n_neighbors': 8} GridSearch最优分数: 0.8040 准确率 0.8036 GridSearch最优参数: {'adaboostclassifier__n_estimators': 10} GridSearch最优分数: 0.8187 准确率 0.8129 AdaBoost的n_estimators最佳值是10,准确率较高,仅次于支持向量机(SVC)算法展开1
- 一纸书2019-11-22勉勉强强看懂,但心知若让我在一片空白的python文件中,完全独立完成这个项目;我做不到;
作者回复: 慢慢来啊~ 大家都是逐渐积累起来的,加油
1 - 滢2019-04-24旸老师,想请教几个问题:1.为何执行多次 最优分数是一定的 0.9667 但是最优参数,n_estimators 每次都不一样,这是什么原因?2.随机森林是不是正好与AdaBoost相反,都数据集成模式,一个是集成里的投票模式,一个是学习模式。这样理解正确吗?
作者回复: 很好的洞察,随机森林和AdaBoost都是集成学习方法, Random Forest是Bagging方式,AdaBoost是Boosting方法。Bagging就是投票模型
1 - Geek_dancer2019-03-30我发现:classifier_param_grid的keys必须严格按照'classifier_names'+'__'+'classifier_param_name'的格式来写1
- 方便面超人2022-11-04 来自北京完全看不懂是怎么回事
- 静心2021-12-07像'svc__C':[1]、decisiontreeclassifier__max_depth、randomforestclassifier__n_estimators、kneighborsclassifier__n_neighbors这样的格式的规律是什么?没搞明白。
- 小晨2021-03-15用32位的python在执行kneighborsclassifier分类器时,会报内存错误:numpy.core._exceptions.MemoryError: Unable to allocate 1.00 GiB for an array with shape (6391, 21000) and data type float64 老师有无办法将numpy数据类型float64改为float16或float32呢?或是其他办法解决 ///重装64位,全部库需要重装///
作者回复: arr.astype(np.float32) 可以将数组从float64修改为float32的数据类型,float16同理
共 2 条评论 - 赵宁2020-12-30请问“客户还款情况”字段里的值分别代表什么意思?
作者回复: 比如:PAY_0 代表2005年9月还款情况(-1=按期还款,1=拖欠一个月,2=拖欠两个月,…8=拖欠八个月,9=拖欠九个月及以上) PAY_0 至 PAY_6,分别代表2005年9月-2005年4月每个月的还款情况,具体特征值含义如上。