首页 > 编程知识 正文

利用python创建申请评分卡,评分卡模型python

时间:2023-12-29 13:16:26 阅读:329520 作者:INML

本文目录一览:

python评分卡之LR及混淆矩阵、ROC

import pandas as pd

import numpy as np

from sklearn import linear_model

# 读取数据

sports = pd.read_csv(r'C:UsersAdministratorDesktopRun or Walk.csv')

# 提取出所有自变量名称

predictors = sports.columns[4:]

# 构建自变量矩阵

X = sports.ix[:,predictors]

# 提取y变量值

y = sports.activity

# 将数据集拆分为训练集和测试集

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)

# 利用训练集建模

sklearn_logistic = linear_model.LogisticRegression()

sklearn_logistic.fit(X_train, y_train)

# 返回模型的各个参数

print(sklearn_logistic.intercept_, sklearn_logistic.coef_)

# 模型预测

sklearn_predict = sklearn_logistic.predict(X_test)

# 预测结果统计

pd.Series(sklearn_predict).value_counts()

-------------------------------------------------------------------------------------------------------------------------------------------

# 导入第三方模块

from sklearn import metrics

# 混淆矩阵

cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0,1])

cm

Accuracy = metrics.scorer.accuracy_score(y_test, sklearn_predict)

Sensitivity = metrics.scorer.recall_score(y_test, sklearn_predict)

Specificity = metrics.scorer.recall_score(y_test, sklearn_predict, pos_label=0)

print('模型准确率为%.2f%%:' %(Accuracy*100))

print('正例覆盖率为%.2f%%' %(Sensitivity*100))

print('负例覆盖率为%.2f%%' %(Specificity*100))

-------------------------------------------------------------------------------------------------------------------------------------------

# 混淆矩阵的可视化

# 导入第三方模块

import seaborn as sns

import matplotlib.pyplot as plt

# 绘制热力图

sns.heatmap(cm, annot = True, fmt = '.2e',cmap = 'GnBu')

plt.show()

------------------------------------------------------------------------------------------------------------------------------------------

# 绘制ROC曲线

# 计算真正率和假正率

fpr,tpr,threshold = metrics.roc_curve(y_test, sm_y_probability)

# 计算auc的值 

roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图

plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')

# 添加边际线

plt.plot(fpr, tpr, color='black', lw = 1)

# 添加对角线

plt.plot([0,1],[0,1], color = 'red', linestyle = '--')

# 添加文本信息

plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)

# 添加x轴与y轴标签

plt.xlabel('1-Specificity')

plt.ylabel('Sensitivity')

plt.show()

-------------------------------------------------------------------------------------------------------------------------------------------

#ks曲线   链接:  风控数据分析学习笔记(二)Python建立信用评分卡 -

fig, ax = plt.subplots()

ax.plot(1 - threshold, tpr, label='tpr')# ks曲线要按照预测概率降序排列,所以需要1-threshold镜像

ax.plot(1 - threshold, fpr, label='fpr')

ax.plot(1 - threshold, tpr-fpr,label='KS')

plt.xlabel('score')

plt.title('KS Curve')

plt.ylim([0.0, 1.0])

plt.figure(figsize=(20,20))

legend = ax.legend(loc='upper left')

plt.show()

python怎样创建具有一定长度和初始值的列表

1、首先,我们需要打开Python的shell工具,在shell当中新建一个对象member,对member进行赋值。

2、这里我们所创建的列表当中的元素均属于字符串类型,同时我们也可以在列表当中创建数字以及混合类型的元素。

3、先来使用append函数对已经创建的列表添加元素,具体如下图所示,会自动在列表的最后的位置添加一个元素。

4、再来使用extend对来添加列表元素,如果是添加多个元素,需要使用列表的形式。

5、使用insert函数添加列表元素,insert中有两个参数,第一个参数即为插入的位置,第二个参数即为插入的元素。

Python十个评委打分,去掉最大最小值,求平均值

思路:分别将格子的成绩用列表表示,然后各自排序,利用切片将最大与最小排除

分别利用sum函数求和并除以8,然后比较两个值的大小就可以

银行数据仓库体系实践(18)--数据应用之信用风险建模

信用风险

        银行的经营风险的机构,那在第15节也提到了巴塞尔新资本协议对于银行风险的计量和监管要求,其中信用风险是银行经营的主要风险之一,它的管理好坏直接影响到银行的经营利润和稳定经营。信用风险是指交易对手未能履行约定契约中的义务而给银行造成经济损失的风险。典型的表现形式包括借款人发生违约或信用等级下降。借款人因各种原因未能及时、足额偿还债务/银行贷款、未能履行合同义务而发生违约时,债权人或银行必将因为未能得到预期的收益而承担财务上的损失。

        那如何来表示某个交易对手的信用情况呢,一般使用信用等级或信用评分来来表示,等级越低或评分越低,发生违约的概率会增加。这个信用评分主要应用在客户的贷前和贷后管理中,贷前是指客户贷款申请阶段,银行受理客户贷款申请时会根据客户提交的信息、人行征信、其它数据源按一定的规则计算出一个违约概率和风险评分或信用等级。再根据这个评分或评级来确定客户的授信额度和利率。计算出的评分或评级越高,违约概率越低,比如在进行个人贷前评分时主要关注以下5方面:

        (1)People:贷款人状况,包括历史还款表现、当前负债情况、资金饥渴度等;

        (2)Payment:还款来源,如基本收入、资产水平、月收支负债比、无担保总负债等;       

        (3)Purpose:资金用途,如消费、买房,需要规避贷款资金用于投资或投机性质较高领域,如股票和数字货币;

        (4)Protection:债权确保,主要是看是否有抵押物或担保,需要看抵押物用途、质量、价格等关键要素;

        (5)Perspective:借款户展望,从地域、行业、人生阶段等考察稳定性及潜力;

        贷后是指客户借款后银行持续跟进客户的信用情况,如果发现信用评分降低或者某些指标达到风险预警指标的阈值,说明风险升高,则会进行冻结额度甚至提前进行贷款收回。特别是对于逾期客户。

风险建模步骤

       在进行信用评估时如何选择客户属性、如何确定评分或评级规则呢?这就需要进行风险建模,通过分析历史数据来确定哪些特征或指标对客户的违约相关性大,可以了解客户的还款能力以及还款意愿。并通过一定方法来建立评分和评级的规则。那风险建模主要分为以下步骤:

        (1)业务理解:主要评估当前现状、确定业务目标,选择建模方法,比如需要进行XX贷款产品的贷前评分模型并确定准入规则,建模方式比如为评分卡,评分应用为基于评分确定贷款准入规则以及额度和利率规则,同时需要确定分析数据的好客户和坏客户标准,如逾期90天以上为坏客户;

        (2)数据理解:首先需要准备建模的样本数据,如抽取近2年的获得类似产品的客户相关信息以及根据好客户和坏客户标准确定的结果。并针对业务数据进行业务含义理解、对数据进行收集、探索,了解每个变量的数据质量、缺失情况,数据分布等。比如对于客户在人行的征信数据、客户在银行的存款、理财等信息、以及客户申请填写的家庭、房产信息、外部获得的客户教育、司法等相关信息进行业务理解和数据分布、质量的探索,对缺失值比例过大的变量或准确性不高的变量进行剔除,同时也要确定对于样本数据中哪些数据进行建模,哪些数据进行验证。

        (3)数据准备:主要对数据进行预处理和指标加工,指标加工指基于基础数据进行指标加工,如最近1个月的征信查询次数,最近1年的逾期次数等,数据预处理主要工作包括对每一个变量进行数据清洗、缺失值处理、异常值处理、数据标准化等,主要目的是将获取的原始数据转变成可用于建模的结构化数据。

        比如对于连续变量,就是要寻找合适的切割点把变量分为几个区间段以使其具有最强的预测能力,也称为“分箱”。例如客户年龄就是连续变量,在这一步就是要研究分成几组、每组切割点在哪里预测能力是最强的。分箱的方法有等宽、等频、聚类(k-means)、卡方分箱法、单变量决策树算法(ID3、C4.5、CART)、IV最大化分箱法、best-ks分箱法等。如果是离散变量,每个变量值都有一定的预测能力,但是考虑到可能几个变量值有相近的预测能力,因此也需要进行分组。

        通过对变量的分割、分组和合并转换,分析每个变量对于结果的相关性,剔除掉预测能力较弱的变量,筛选出符合实际业务需求、具有较强预测能力的变量。检测变量预测能力的方法有:WOE(weight of Evidence) 、IV(informationvalue)等。

        (4)分析建模:即对于筛选出来的变量以及完成好坏定义的样本结果。放入模型进行拟合。如评分卡一般采用常见的逻辑回归的模型,PYTHON、SAS、R都有相关的函数实现模型拟合。以下是生成的评分卡的例子。

        (5)评估及报告:即通过验证样本对模型的预测进行校验。评估模型的准确性和稳健性,并得出分析报告。常用的方法有ROC曲线、lift提升指数、KS(Kolmogorov-Smirnov)曲线、GINI系数等。

        (6)应用:对模型进行实际部署和应用,如基于评分进行客户准入和产生额度,并在贷款系统进行模型部署,自动对申请客户进行评分。

        (7)监测:建立多种报表对模型的有效性、稳定性进行监测,如稳定性监控报表来比较新申请客户与开发样本客户的分值分布,不良贷款分析报表来评估不同分数段的不良贷款,并且与开发时的预测进行比较,监控客户信贷质量。随着时间的推移和环境变化,评分模型的预测力会减弱,所以需要持续监控并进行适当调整或重建。

        在信用风险建模中,目前评分卡建模还是主要的方式,除了申请评分(A卡(Application score card))还有B卡(Behavior score card)行为评分卡、C卡(Collection score card)催收评分卡。B卡主要进行客户贷后管理,如何进行风险预警,C卡进行催收管理,确定如何催收以及催收方式和时间点。信用风险模型中还有一个是反欺诈模型,它主要是识别假冒身份、虚假信息、批量薅羊毛等欺诈行为。随着机器学习和大数据的发展,其它的一些建模方式如决策树、深度神经网络也越来越多的应用到了风险建模中。

        信用风险模型是数据仓库支持的重要数据应用之一,在风险建模分析阶段,数据仓库是建模样本数据以及衍生指标加工的主要提供者,业务人员一般在自助分析平台进行数据分析和建模,模型建立完成并部署后,会基于数据仓库数据进行模型效果的监控。在贷后管理中,风险集市也会进行贷后指标的加工。另外风险模型以及预警中会经常使用到外部数据,这部分数据也是通过数据仓库进行对接、加工和存储。

Python创建简单登录界面

创建一个简单的登录窗口,假设用户名为TestName,密码为Python。

依据之前提到的创建方式,grid布局设计UI,设计登录用户名和密码检查函数。

from tkinterimport *

def LoginCheck():

        name = txtName.get()

        password = txtPassword.get()

        name_len =len(name)

        password_len =len(password)

        if name =="TestName" and password =="Python":

            msgLabel['text'] ='登录成功'

        elif  name =="TestName" and password !="Python":

            msgLabel['text'] ='密码错误'

            txtPassword.delete(0,password_len)

        else:

                msgLabel['text'] ='用户名错误'

                txtName.delete(0,name_len)

              txtPassword.delete(0, password_len)

wnd = Tk()

lblName = Label(wnd, text='User Name:')

lblName.grid(row=0, column=0, sticky=W)

txtName = Entry(wnd)

txtName.grid(row=0, column=1, sticky=E)

lblPs = Label(wnd, text='密码:')

lblPs.grid(row=1, column=0, sticky=W)

txtPassword = Entry(wnd)

txtPassword["show"] ='*'

txtPassword.grid(row=1, column=1, sticky=E)

btn = Button(wnd, text='登录', command=LoginCheck)

btn.grid(row=2, column=1, sticky=E)

# Message

msgLabel = Label(wnd, text='')

msgLabel.grid(row=3)

wnd.mainloop()

运行效果如下:

可输入不同的用户名和密码检测逻辑上设计是否正确。

用户名错误:

密码错误:

登录成功:

利用Python进行数据分析笔记:3.1数据结构

元组是一种固定长度、不可变的Python对象序列。创建元组最简单的办法是用逗号分隔序列值:

tuple 函数将任意序列或迭代器转换为元组:

中括号 [] 可以获取元组的元素, Python中序列索引从0开始 :

元组一旦创建,各个位置上的对象是无法被修改的,如果元组的一个对象是可变的,例如列表,你可以在它内部进行修改:

可以使用 + 号连接元组来生成更长的元组:

元组乘以整数,则会和列表一样,生成含有多份拷贝的元组:

将元组型的表达式赋值给变量,Python会对等号右边的值进行拆包:

拆包的一个常用场景就是遍历元组或列表组成的序列:

*rest 用于在函数调用时获取任意长度的位置参数列表:

count 用于计量某个数值在元组中出现的次数:

列表的长度可变,内容可以修改。可以使用 [] 或者 list 类型函数来定义列表:

append 方法将元素添加到列表尾部:

insert 方法可以将元素插入到指定列表位置:

( 插入位置范围在0到列表长度之间 )

pop 是 insert 的反操作,将特定位置的元素移除并返回:

remove 方法会定位第一个符合要求的值并移除它:

in 关键字可以检查一个值是否在列表中;

not in 表示不在:

+ 号可以连接两个列表:

extend 方法可以向该列表添加多个元素:

使用 extend 将元素添加到已经存在的列表是更好的方式,比 + 快。

sort 方法可以对列表进行排序:

key 可以传递一个用于生成排序值的函数,例如通过字符串的长度进行排序:

bisect.bisect 找到元素应当被插入的位置,返回位置信息

bisect.insort 将元素插入到已排序列表的相应位置保持序列排序

bisect 模块的函数并不会检查列表是否已经排序,因此对未排序列表使用bisect不会报错,但是可能导致不正确结果

切片符号可以对大多数序列类型选取子集,基本形式是 [start:stop]

起始位置start索引包含,结束位置stop索引不包含

切片还可以将序列赋值给变量:

start和stop可以省略,默认传入起始位置或结束位置,负索引可以从序列尾部进行索引:

步进值 step 可以在第二个冒号后面使用, 意思是每隔多少个数取一个值:

对列表或元组进行翻转时,一种很聪明的用法时向步进值传值-1:

dict(字典)可能是Python内建数据结构中最重要的,它更为常用的名字是 哈希表 或者 关联数组 。

字典是键值对集合,其中键和值都是Python对象。

{} 是创建字典的一种方式,字典中用逗号将键值对分隔:

你可以访问、插入或设置字典中的元素,:

in 检查字典是否含有一个键:

del 或 pop 方法删除值, pop 方法会在删除的同时返回被删的值,并删除键:

update 方法将两个字典合并:

update方法改变了字典元素位置,对于字典中已经存在的键,如果传给update方法的数据也含有相同的键,则它的值将会被覆盖。

字典的值可以是任何Python对象,但键必须是不可变的对象,比如标量类型(整数、浮点数、字符串)或元组(且元组内对象也必须是不可变对象)。

通过 hash 函数可以检查一个对象是否可以哈希化(即是否可以用作字典的键):

集合是一种无序且元素唯一的容器。

set 函数或者是用字面值集与大括号,创建集合:

union 方法或 | 二元操作符获得两个集合的联合即两个集合中不同元素的并集:

intersection 方法或 操作符获得交集即两个集合中同时包含的元素:

常用的集合方法列表:

和字典类似,集合的元素必须是不可变的。如果想要包含列表型的元素,必须先转换为元组:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。