当前位置: 首页 > news >正文

东莞宣传网站python基础教程for循环

东莞宣传网站,python基础教程for循环,爱客crm下载,百度竞价推广屏蔽软件目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线#xff0c;判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中#xff0c;评分卡是…目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段它衡量向别人借钱的人受信人需要融资的公司不能如期履行合同中的还本付息责任并让借钱给别人的人授信人银行造成经济损失的可能性。一般来说评分卡打出的分值越高客户的信用越好风险越小。 数据集处理 分箱 要制作评分卡是要给各个特征进行分档以便业务人员能够根据新客户填写的信息为这个新客户来打分。因此在评分卡制作过程中一个重要的步骤就是分箱本质就是对特征进行分档。 分箱是评分卡最难也是最核心的部分。分箱的本质就是离散化连续变量好让拥有不同属性的人被分成不同的类别打上不同的分数。 分多少个箱子合适 既然是将连续型变量离散化箱子的个数必然不能太多最好控制在十个以下用来制作评分卡最好能在4~5个为最佳。离散化连续变量必然伴随着信息的损失而且箱子越少信息损失越大。 为了衡量特征上的信息量以及特征对预测函数的贡献银行业定义了概念Information valueIV   N 是这个特征上箱子的个数 i 代表每个箱子 good% 是这个箱内的优质客户(标签为0)占整个特征中所有优质客户的比例 bad% 是这个箱子里的坏客户(那些会违约的标签为1)占整个特征中所有坏客户的比例 WOE 是银行业中用来衡量违约概率的指标中文叫做证据权重weight of Evidence本质就是优质客户比上坏客户的比例的对数WOEi写作  WOE是对一个箱子来说的WOE越大代表这个箱子里的优质客户越多IV是对整个特征来说的IV代表的意义由 表1 来控制 表1 可见IV 并非越大越好我们想要找到 IV 的大小和箱子个数的平衡点所以我们会对特征进行分箱然后计算每个特征在每个箱子数目下的WOE值利用IV值的曲线找出合适的分箱个数。 分箱要达成什么样的效果 我们希望在同一个箱子里的人的属性是尽量相似的而不同箱子里的人的属性是尽量不同的就是常说的“组间差异大组内差异小”。 对于评分卡来说我们希望一个箱子内的人违约概率是类似的而不同箱子的人违约概率差距很大即 WOE 差距要大并且每个箱子中坏客户所占的比重(bad%)也要不同。 我们可以使用卡方检验来对比两个箱子之间的相似性如果两个箱子之间卡方检验的P值很大说明他们非常相似就可以将这两个箱子合并为一个箱子。 对一个特征进行分箱的步骤 首先把连续型变量分成一组数量较多的分类型变量比如将几万个样本分成100组或者50组确保每一组中都要包含两种类别的样本否则IV值会无法计算对相邻的组进行卡方检验卡方检验的P值很大的组进行合并直到数据中的组数小于设定的N箱为止我们让一个特征分别分成[2,3,4...20]箱观察每个分箱个数下的IV值如何变化找出最适合的分箱个数分箱完毕后我们计算每个箱的WOE值bad%观察分箱效果 这些步骤都完成后我们可以对各个特征都进行分箱然后观察每个特征的IV值以此来挑选特征。 分箱的实现 封装计算 WOE 值和 IV值函数 # 计算 WOE 和 BAD RATE # BAD RATE 是一个箱中坏的样本所占的比例 # bad% 是一个箱中的坏样本占整个特征中的坏样本的比例def get_woe(num_bins):# 通过 num_bins 数据计算 woecolumns [min, max, count_0, count_1]dataf pd.DataFrame(num_bins, columnscolumns)# 一个箱子中所有的样本数dataf[total] dataf.count_0 dataf.count_1# 一个箱子里的样本数占所有样本数的比例dataf[percentage] dataf.total / dataf.total.sum()dataf[bad_rate] dataf.count_1 / dataf.totaldataf[good%] dataf.count_0 / dataf.count_0.sum()dataf[bad%] dataf.count_1/dataf.count_0.sum()dataf[woe] np.log(dataf[good%] / dataf[bad%])return dataf# 计算 IV 值 def get_iv(bins_df):rate bins_df[good%] - bins_df[bad%]iv np.sum(rate * bins_df.woe)return iv 画IV曲线判断最佳分箱数量 # 导入数据 df mlp.get_data_source(data8770d35cf63711ee80850242ac850002, return_typedataframe) # 删除不用于逻辑回归的列只有数字类型的列才参与逻辑回归 # axis1为删除列第一个参数则输入表头的列表 # axis0为删除行第一个参数则输入索引的列表 df.drop([apply_no, pt, query_no, request_hash], inplaceTrue, axis1) # 通过查看标签值的分布发现1的个数只有80个占比只有1%左右属于严重不均衡的。如 图1 所示 print(标签值y分布情况\n{}.format(y.value_counts())) print(标签值y取1的占比情况\n{}.format(y.value_counts()[1]/X.shape[0]))# 查看数据分布情况图2 所示 df.describe([0.01,0.1,0.25,.5,.75,.9,.99]).TX pd.DataFrame(X) y pd.DataFrame(y)# 分训练集和测试集训练集用来建模验证数据用来检测模型的效果的 Xtrain, Xtest, Ytrain, Ytest train_test_split(X, y, test_size 0.3, random_state420) # 逻辑回归做评分卡时建模数据需要将训练集的特征矩阵和标签要合并在一起 # 因为分箱的时候需要的是特征矩阵标签的结构 model_data pd.concat([Ytrain, Xtrain], axis1) # 更新索引 model_data.index range(model_data.shape[0])# 按照等频对需要分箱的列进行分箱保证每个箱子中好的样本数量和坏的样本数据都 0如果有0需要减少分箱数量 # sq_model_score_high 为例 model_data[qcut], updown pd.qcut(model_data[sq_model_score_high], retbinsTrue, q10, duplicatesdrop) pd.qcut,基于分位数的分箱函数本质是将连续型变量离散化只能够处理一维数据 返回箱子的上限和下限 参数q: 要分箱的个数 参数 retbinsTrue来要求除了返回箱子的上 限和下限同时返回一个为索引为样本的索引、元素为分到的箱子的Series的结构 现在返回两个值每个样本属于哪个箱子赋值给model_data[qcut]列以及所有箱子的上限和下限赋值给updown变量# 查看分箱情况如 图3 所示 print(分箱结束后每个箱子的元素个数\n{}.format(model_data[qcut].value_counts()))# 统计每个分段 0, 1 的数,结果如 图4 所示 # 这里使用了数据透视表的功能 groupby count_y0 model_data[model_data[y] 0].groupby(byqcut).count()[y] count_y1 model_data[model_data[y] 1].groupby(byqcut).count()[y]print(对列 sq_model_score_high 进行分箱后每个箱子对应的0的数量为:\n{}.format(count_y0)) print(对列 sq_model_score_high 进行分箱后每个箱子对应的1的数量为: \n{}.format(count_y1))# num_bins 值分别为每个区间的上界、下届0 出现的次数1 出现的次数 num_bins [*zip(updown, updown[1:], count_y0, count_y1)]# 卡方检验num_bins_ num_bins.copy() import matplotlib.pyplot as plt import scipy IV [] axisx [] # 定义箱的数量这里为2 N 2while len(num_bins_) N:pvs []# 获取 num_bins_两两之间的卡方检验的置信度卡方值for i in range(len(num_bins_)-1):x1 num_bins_[i][2:]x2 num_bins_[i1][2:]# scipy.stats.chi2_contingency()0索引返回 chi2 值1索引返回 p 值pv scipy.stats.chi2_contingency([x1, x2])[1]pvs.append(pv)# 通过 p 值进行处理合并 p 值最大的两组# 找出 p 值最大的那一组所在的下标 inum_bins_的[i]和[i1]就是可以合并的组i pvs.index(max(pvs))# 具体合并第i个箱子和i1个箱子操作把 num_bins_的[i:i2]左闭右开换成新列表[()]新列表元素内容按照新方式计算# 1、第0个元素取第i个箱子的第0个元素前一个箱子的下限# 2、第1个元素取第i1个箱子的第1个元素后一个箱子的上限# 3、第2个元素取第i个箱子的第2个元素和第i1个箱子的第2个元素加和# 4、第3个元素取第i个箱子的第3个元素和第i1个箱子的第3个元素加和num_bins_[i:i2] [(num_bins_[i][0],num_bins_[i1][1],num_bins_[i][2]num_bins_[i1][2],num_bins_[i][3]num_bins_[i1][3])]bins_df get_woe(num_bins_)# 记录箱子数axisx.append(len(num_bins_))# 记录对应的IV值IV.append(get_iv(bins_df))plt.figure() plt.plot(axisx, IV) plt.xticks(axisx) # y 坐标为 IV值 plt.ylabel(IV) # x 坐标为箱子数量 plt.xlabel(N) # 画出 IV 值随着箱子数量的变化而变化图如 图5 所示 plt.show() 图1 图2 图3 图4 图5 结论 如 图5 所示分箱数量越多IV值越高在这条线中寻找随着箱子数量减少IV值下降最快的那个点这个转折点对应的箱子数量就是我们要找的相对合适的箱子数量。 这样就这出了特征 sq_model_score_high 的最佳分箱个数 pd.qcut 执行报错 图6 如 图6 所示运行 pd.qcut()函数的时候如果出现ValueError: Bin edges must be unique的错误这通常意味着在尝试对数据进行分箱时边界值出现了重复。这可能会导致qcut函数无法确定如何对数据进行分箱因此需要进行调整以确保边界值唯一。 为了解决这个问题可以在调用qcut()函数时传入duplicatesdrop参数来指定处理重复边界值的方式选择将重复的边界值删除这可能会导致最终分箱后的箱的数量减少以及数据条数减少或者使用cut()函数pd.cut()函数是根据值本身来确定分箱的边界因此可以处理重复的边界值并将它们归入相邻的箱中 model_data[cut], updown pd.cut(model_data[sq_model_score_high], retbinsTrue, bins20)功能函数封装 判断分箱个数   def graph_for_best_bin(DF, X, Y, N5, q20, graphTrue):自动优化分箱函数基于卡方验证的分箱DF需要输入的数据X需要分箱的列名Y分箱数据对应的标签 Y 列名N保留分箱个数q 初始分箱的个数graph是否要画出IV图像区间为前开后闭(]import matplotlib.pyplot as pltimport scipymodel_data DF[[X,Y]].copy()model_data[qcut], updown pd.qcut(model_data[X], retbinsTrue, qq, duplicatesdrop)count_y0 model_data.loc[model_data[Y] 0].groupby(byqcut).count()[Y]count_y1 model_data.loc[model_data[Y] 1].groupby(byqcut).count()[Y]num_bins_ [*zip(updown, updown[1:], count_y0, count_y1)]for i in range(q):if 0 in num_bins_[0][2:]:num_bins_[0:2] [(num_bins_[0][0],num_bins_[1][1],num_bins_[0][2]num_bins_[1][2],num_bins_[0][3]num_bins_[1][3])]for i in range(len(num_bins_)):if 0 in num_bins_[i][2:]:num_bins_[i-1:i1] [(num_bins_[i-1][0],num_bins_[i][1],num_bins_[i-1][2]num_bins_[i][2],num_bins_[i-1][3]num_bins_[i][3])]breakelse:breakdef get_woe(num_bins):columns [min, max, count_0, count_1]dataf pd.DataFrame(num_bins, columnscolumns)dataf[total] dataf.count_0 dataf.count_1dataf[percentage] dataf.total / dataf.total.sum()dataf[bad_rate] dataf.count_1 / dataf.totaldataf[good%] dataf.count_0 / dataf.count_0.sum()dataf[bad%] dataf.count_1/dataf.count_1.sum()dataf[woe] np.log(dataf[good%] / dataf[bad%])return dataf# 计算 IV 值def get_iv(bins_df):rate bins_df[good%] - bins_df[bad%]iv np.sum(rate * bins_df.woe)return ivIV []axisx []while len(num_bins_) N:pvs []for i in range(len(num_bins_)-1):x1 num_bins_[i][2:]x2 num_bins_[i1][2:]pv scipy.stats.chi2_contingency([x1, x2])[1]pvs.append(pv)i pvs.index(max(pvs))num_bins_[i:i2] [(num_bins_[i][0],num_bins_[i1][1],num_bins_[i][2]num_bins_[i1][2],num_bins_[i][3]num_bins_[i1][3])]bins_df get_woe(num_bins_)# 记录箱子数axisx.append(len(num_bins_))# 记录对应的IV值IV.append(get_iv(bins_df))if graph:plt.figure()plt.plot(axisx, IV)plt.xticks(axisx)plt.ylabel(IV)plt.xlabel(N)plt.show()return bins_df
http://www.hkea.cn/news/14330219/

相关文章:

  • 无锡网站建设 百家号公司企业网站程序下载
  • 品牌网站应该怎么做厦门做网站多
  • 内江 网站建设网站系统管理员模块
  • 青海网站建设优化花生壳网站无法登陆
  • 备案成功后怎么建设网站旅行社的网站建设
  • 桂林旅游网站制作阿里云无主体新增网站
  • 城市建设网站鹤岗市连云港优化推广
  • 南充建网站的资料长沙网站定制建设
  • 贵州省建设厅报名网站域名服务网站建设科技公司
  • 常用的网页编辑软件有哪些网站自然优化自学
  • 网站建设的好处有什么用wordpress怎样弄pdf
  • 网站整体优化产品开发流程8个步骤的总结
  • 亚马逊电商网站银川seo
  • 营销型网站建设需要注意什么网站建设方案的摘要
  • 网站建设免费课程怎么做网站备份
  • 奉贤做网站站长统计在线观看
  • 深圳 网站设拼多多网站怎么做
  • 手机网站后台源码自己做培训网站
  • 手机社交网站模板长春建工集团官网
  • wordpress手机版安装wordpress seo教程
  • 图书拍卖网站开发遇到的问题微信里的小程序怎么制作方法
  • 网站优化的作业及意义微信端微网站怎么做
  • php做的网站怎么运行wordpress.org配置
  • 做一个网站的流程oppo软件商店
  • 在百度里面做个网站怎么做的个人网站如何制作教程
  • 十堰市住房和城乡建设厅官方网站张家界网络营销
  • 邢台企业做网站价格中核五公司是国企还是央企
  • 前端做图表的网站响应式网站是指自适应吗
  • 做网站的收费标准wordpress访问调用流程
  • 北京网站建设电扬科技唐山做网站价格