欢迎大家,上一篇博客【信用卡评分模型(R语言)】详细的讲解了如何开发评分卡,这片博客就不再详细介绍,为方便开发评分卡,本人根据自己经验写了一个python包,导入此包后仅需一行代码即可成功制作评分卡,默认参数已经设置好,如有疑问以及使用中出现BUG,可随时与我联系。
联系方式QQ:990020186
数据和实例已上传在我的github,如果觉得实用就star我的github,欢迎大家一起学习交流进步。
安装说明
包已上传至PYPI官网,详见CreditScoreModel包
首次使用可以直接使用以下代码安装
pip install CreditScoreModel
模型训练
from CreditScoreModel.LogisticScoreCard import *
data=pd.read_csv('C:\\Users\\HP\\Desktop\\give me some credit\\data\\cs-training.csv')
data_predict=pd.read_csv('C:\\Users\\HP\\Desktop\\give me some credit\\data\\cs-test.csv')
del data['Unnamed: 0']
data.columns=['y','RevolvingUtilizationOfUnsecuredLines', 'age','NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'MonthlyIncome','NumberOfOpenCreditLinesAndLoans', 'NumberOfTimes90DaysLate','NumberRealEstateLoansOrLines', 'NumberOfTime60-89DaysPastDueNotWorse','NumberOfDependents']
del data_predict['Unnamed: 0']
ls=logistic_score_card()
data_train, data_test = ls.get_data_train_test(data,test_size=0.25,random_state=1234)
ls.fit(data_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\fixes.py:313: FutureWarning: numpy not_equal will not check object identity in the future. The comparison did not return the same result as suggested by the identity (`is`)) and will change.
_nan_object_mask = _nan_object_array != _nan_object_array
2019 16:15:06 INFO 任务开始。。。
2019 16:15:06 INFO 连续和离散变量划分中。。。
2019 16:15:06 INFO 连续和离散变量划分完成!
2019 16:15:06 INFO 连续变量最优分组进行中。。。
100%|██████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 23.53it/s]
2019 16:15:06 INFO 连续变量最优分组完成!
2019 16:15:06 INFO 根据cut离散化连续变量进行中。。。
100%|██████████████████████████████████████████████████████████████████████████████████| 10/10 [00:04<00:00, 2.38it/s]
2019 16:15:11 INFO 根据cut离散化连续变量完成!
2019 16:15:11 INFO IV值计算中。。。
100%|██████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 37.45it/s]
2019 16:15:11 INFO IV值计算完成!
2019 16:15:11 INFO WOE转换中。。。
100%|██████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 11.36it/s]
2019 16:15:12 INFO WOE转换完成!
2019 16:15:12 INFO 根据IV值大于 0.1 且 相关性小于 0.6 ,以及l1正则选取变量进行中。。。
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
2019 16:15:12 INFO 变量选取完成,总共 10 个变量,最终筛选出 5 个变量
2019 16:15:12 INFO 评分卡制作中。。。
2019 16:15:12 INFO 连续和离散变量划分中。。。
2019 16:15:12 INFO 连续和离散变量划分完成!
2019 16:15:12 INFO 根据cut离散化连续变量进行中。。。
100%|████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:02<00:00, 2.36it/s]
2019 16:15:14 INFO 根据cut离散化连续变量完成!
2019 16:15:14 INFO WOE转换中。。。
100%|████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 11.81it/s]
2019 16:15:15 INFO WOE转换完成!
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
2019 16:15:18 INFO 评分卡制作完成!
2019 16:15:18 INFO 任务完成!
模型结果
评分卡
对应的变量中文名
[‘变量名’, ‘变量类型’, ‘切分点’, ‘切分分组’, ‘y为1的数量’, ‘y为0的数量’, ‘总数’, ‘y为1的数量占比’, ‘y为0的数量占比’, ‘总数占比’,‘y为1占总数比例’, ‘woe’, ‘各分组iv’, ‘变量iv值’, ‘logistic参数col_coef’, ‘logistic参数lr_intercept’, ‘分组分数’]
ls.score_card
col | type | cuts | cut_points | 1_num | 0_num | total_num | 1_pct | 0_pct | total_pct | 1_rate | woe | iv | total_iv | col_coef | lr_intercept | score | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NumberOfTime30-59DaysPastDueNotWorse | continuous | [-inf, 0.0, 1.0, inf] | (-inf, 0.0] | 3803 | 90648 | 94451 | 0.503509 | 0.863750 | 0.839564 | 0.040264 | -0.539683 | 0.194416 | 0.737079 | 0.538172 | -2.598254 | 20.950981 |
1 | NumberOfTime30-59DaysPastDueNotWorse | continuous | [-inf, 0.0, 1.0, inf] | (0.0, 1.0] | 1801 | 10249 | 12050 | 0.238448 | 0.097659 | 0.107111 | 0.149461 | 0.892673 | 0.125679 | 0.737079 | 0.538172 | -2.598254 | -34.654352 |
2 | NumberOfTime30-59DaysPastDueNotWorse | continuous | [-inf, 0.0, 1.0, inf] | (1.0, inf] | 1949 | 4050 | 5999 | 0.258043 | 0.038591 | 0.053324 | 0.324887 | 1.900110 | 0.416983 | 0.737079 | 0.538172 | -2.598254 | -73.763987 |
3 | NumberOfTime60-89DaysPastDueNotWorse | continuous | [-inf, 0.0, inf] | (-inf, 0.0] | 5469 | 101314 | 106783 | 0.724083 | 0.965383 | 0.949182 | 0.051216 | -0.287618 | 0.069402 | 0.570277 | 0.403517 | -2.598254 | 8.371879 |
4 | NumberOfTime60-89DaysPastDueNotWorse | continuous | [-inf, 0.0, inf] | (0.0, inf] | 2084 | 3633 | 5717 | 0.275917 | 0.034617 | 0.050818 | 0.364527 | 2.075741 | 0.500875 | 0.570277 | 0.403517 | -2.598254 | -60.419867 |
5 | NumberOfTimes90DaysLate |