Python大数据可视化方法与实践课件 第10章 可视化分析大数据案例_第1页
Python大数据可视化方法与实践课件 第10章 可视化分析大数据案例_第2页
Python大数据可视化方法与实践课件 第10章 可视化分析大数据案例_第3页
Python大数据可视化方法与实践课件 第10章 可视化分析大数据案例_第4页
Python大数据可视化方法与实践课件 第10章 可视化分析大数据案例_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章可视化分析大数据案例信用评估·数据清洗·特征工程·建模评估为什么信用评估至关重要?在金融机构的贷款业务中,科学评估客户信用水平是风险控制的核心问题。信用评估关系到借贷双方的资金安全,也直接影响金融市场的健康发展。风险控制评估客户信用水平,帮助借款方做出准确、可靠的决策数据驱动利用数据挖掘和机器学习方法进行信用风险评估已成为主流手段多源数据结合客户历史数据与第三方平台(芝麻分、京东、微信等)数据本章案例全链路概览模型评估逻辑回归特征工程数据导入本章以Kaggle挑战赛GiveMeSomeCredit数据集为主线,完整覆盖从数据预处理到模型评估的全流程,PPT1重点讲解前两个阶段。技术工具栈NumPy/pandas数据读取与预处理Matplotlib/Seaborn数据可视化分析scikit-learn随机森林填补+建模WOE编码特征工程与变量筛选10.1数据解读与导入信用评估是对贷款申请人(信用卡申请人)进行风险评估的预测方法,在金融风险控制领域得到了广泛应用。根据客户提供的资料进行评估利用客户的历史数据建立预测模型结合第三方平台数据(芝麻分、京东、微信等)预测某人在未来一段时间内经历财务困境的可能性10.1数据解读与导入数据来源:GiveMeSomeCredit本章利用Kaggle挑战赛GiveMeSomeCredit提供的部分数据作为数据集,完成数据处理、特征选择、变量WOE编码离散化等,为金融放款机构等的风险水平控制决策给予参考。数据集来源Kaggle挑战赛公开数据集GiveMeSomeCredit文件格式cs-training.csv,包含11个特征变量应用目标为金融放款机构风险水平控制决策给予参考10.1数据解读与导入目标变量:SeriousDlqin2yrs变量含义借款人2年内会出现90天以上逾期的概率编码规则1=是(发生逾期),0=否(未发生逾期)变量类型二分型变量,作为分类label,即y值SeriousDlqin2yrs是需要研究的分类label,即y值,它是二分型变量,代表是否出现逾期偿还的情况。处理后将对label进行调整:好客户为1,坏客户为0,即执行df['label']=1-df['label']。表10-1数据说明(1/4)核心变量解读(一)1SeriousDlqin2yrs借款人2年内会出现90天以上逾期的概率(1=是,0=否)类型:二分型变量·角色:因变量/label2RevolvingUtilizationOfUnsecuredLines无担保信用额度使用比例(信用卡和个人信用额度余额/总额度)类型:连续型变量(percentage)3age借款人年龄类型:连续型变量(integer)表10-1数据说明(2/4)核心变量解读(二)1NumberOfTime30-59DaysPastDueNotWorse借款人逾期30-59天但无更严重逾期的次数类型:离散型变量(integer)2DebtRatio借款人月债务支出与月收入之比类型:连续型变量(percentage)3MonthlyIncome借款人月收入类型:连续型变量(real)·存在较多缺失值(29731个)表10-1数据说明(3/4)核心变量解读(三)1NumberOfOpenCreditLinesAndLoans借款人持有的贷款和信用账户总数类型:离散型变量(integer)2NumberOfTimes90DaysLate借款人逾期90天以上的次数类型:离散型变量(integer)3NumberRealEstateLoansOrLines借款人的房产抵押贷款数量类型:离散型变量(integer)表10-1数据说明(4/4)核心变量解读(四)1NumberOfTime60-89DaysPastDueNotWorse借款人逾期60-89天但无更严重逾期的次数类型:离散型变量(integer)2NumberOfDependents借款人需要抚养的家庭成员数量(包括配偶、子女等)类型:离散型变量(integer)·缺失值3924个共11个特征变量:连续型(lineofcredit、age、DebtRatio、MonthlyIncome)+离散型(其余变量)表10-1数据说明·汇总变量类型全览表10-1数据说明·逾期变量三类逾期变量对比数据集中包含三个逾期相关变量,分别记录不同严重程度的逾期次数,是预测信用风险的关键特征。30-59天逾期NumberOfTime30-59DaysPastDueNotWorse逾期较轻,无更严重逾期记录60-89天逾期NumberOfTime60-89DaysPastDueNotWorse中度逾期,无更严重逾期记录90天以上逾期NumberOfTimes90DaysLate严重逾期,与label强相关表10-1数据说明·财务变量财务相关变量解析DebtRatio(负债比率)借款人月债务支出与月收入之比,反映偿债压力。数值越高,财务压力越大。MonthlyIncome(月收入)借款人月收入,连续型变量(real)。存在较多缺失值(29731个),需用随机森林模型填补。RevolvingUtilizationOfUnsecuredLines无担保信用额度使用比例(信用卡和个人信用额度余额/总额度)。反映信用额度的使用紧张程度。NumberOfOpenCreditLinesAndLoans借款人持有的贷款和信用账户总数,反映信用活跃度。表10-1数据说明·资产与家庭资产与家庭变量解析NumberRealEstateLoansOrLines借款人的房产抵押贷款数量,反映资产状况与抵押负担NumberOfDependents借款人需要抚养的家庭成员数量(包括配偶、子女等),缺失值3924个(小于样本总量5%),直接删除family(NumberOfDependents)缺失值较少(小于样本总量的5%),直接删除对应样本。10.1数据说明·字段重命名映射字段重命名对照表原始列名过长,使用rename()方法进行简化,方便后续分析。原始列名新列名SeriousDlqin2yrslabelRevolvingUtilizationOfUnsecuredLineslineofcreditNumberOfTime30-59DaysPastDueNotWorse30-59daysNumberOfOpenCreditLinesAndLoansopenloanNumberOfTimes90DaysLate90+daysNumberRealEstateLoansOrLinesestateNumberOfTime60-89DaysPastDueNotWorse60-89daysNumberOfDependentsfamily10.1数据准备与导入第一步:下载与解压数据集直接从Kaggle官网下载数据集,如图10-1所示。选择"Data"选项在右侧"DataExplorer"中找到并单击"cs-training.csv"得到cs-training.csv.zip压缩包,解压后得到cs-training.csv文件将文件放到Credit-Score项目文件夹下,以便后续使用10.1数据准备与导入第二步:导入第三方库在JupyterNotebook中运行以下代码,导入所需的第三方库。importpandasaspdimportnumpyasnpfromsklearn.ensembleimportRandomForestRegressorimportmatplotlib.pyplotaspltimportsklearn.cross_validationfromsklearnimportmetricsfromscipyimportstatsimportstatsmodels.apiassmimportcopyimportseabornassnsimportwarningswarnings.filterwarnings('ignore')10.1数据准备与导入第三步:读取数据并初步查看导入数据集,查看数据,在JupyterNotebook中添加并运行以下代码。df=pd.read_csv("cs-training.csv")#导入文件df.head(10)初步观察:数据第一列无意义,部分列名过长。RevolvingUtilizationOfUnsecuredLines、age、DebtRatio、MonthlyIncome为连续型变量,其他为离散型变量。10.1数据准备与导入第四步:删除无用列并重命名字段使用下面的代码删除第一列,并为部分列重新命名。df=df.iloc[:,1:]#删除第一列column_name_mapping={'SeriousDlqin2yrs':'label','RevolvingUtilizationOfUnsecuredLines':'lineofcredit','NumberOfTime30-59DaysPastDueNotWorse':'30-59days','NumberOfOpenCreditLinesAndLoans':'openloan','NumberOfTimes90DaysLate':'90+days','NumberRealEstateLoansOrLines':'estate','NumberOfTime60-89DaysPastDueNotWorse':'60-89days','NumberOfDependents':'family'}df.rename(columns=column_name_mapping,inplace=True)10.1缺失值处理缺失值处理:背景与策略数据缺失情况在实际应用中非常普遍,常见的处理方法包括:1直接删除直接删除有缺失值的样本(适用于缺失比例极低的情况)2相似性填补根据样本之间的相似性进行填补3相关性填补根据变量之间的相关性进行填补(如随机森林模型)10.1缺失值处理查看缺失值分布首先查看缺失值,运行以下代码:print(df.isnull().sum())#查看缺失值可以看到只有两个变量存在缺失值,分别是月收入(MonthlyIncome)和家庭人数(family)。10.1缺失值处理两列缺失值情况对比MonthlyIncome(月收入)缺失值较多,为29731个,可以根据变量之间的相关关系,采用随机森林模型进行填补。family(家庭人数)缺失值较少,为3924个(小于样本总量的5%),直接删除对应样本。填补策略MonthlyIncome→随机森林回归模型预测填补删除策略family→直接删除(缺失比例<5%)去重处理最后查看重复的值并将其删除10.1缺失值处理随机森林填补:代码实现data_copy=df.iloc[:,[5,0,1,2,3,4,6,7,8,9]]df_known=data_copy[data_copy.MonthlyIncome.notnull()].as_matrix()df_unknown=data_copy[data_copy.MonthlyIncome.isnull()].as_matrix()train_X=df_known[:,1:]train_Y=df_known[:,0]rf_model=RandomForestRegressor(random_state=0,n_estimators=200,max_depth=3,n_jobs=-1)rf_model.fit(train_X,train_Y)df.loc[df.MonthlyIncome.isnull(),'MonthlyIncome']=\rf_model.predict(df_unknown[:,1:]).round(0)df=df.dropna()df=df.drop_duplicates()用随机森林模型预测结果来进行填补,并四舍五入到整数。10.1RANDOMFORESTREGRESSOR参数(1/4)参数详解:random_staterandom_state随机数生成的种子,确保结果可重复性。设置为固定整数(如0)后,每次运行代码将得到相同的随机分割结果,保证实验可复现。RandomForestRegressor(random_state=0,...)10.1RANDOMFORESTREGRESSOR参数(2/4)参数详解:n_estimatorsn_estimators决策树的数量。增加树的数量可以提高模型的稳定性和性能,但会增加计算成本。本例中设置为200棵决策树:n_estimators=20010.1RANDOMFORESTREGRESSOR参数(3/4)参数详解:max_depthmax_depth每棵决策树的最大深度。较深的树可以捕获更多细节,但也容易过拟合。本例中设置为3:max_depth=3,在表达能力与过拟合风险之间取得平衡。10.1RANDOMFORESTREGRESSOR参数(4/4)参数详解:n_jobs与超参数调优n_jobs用于并行构建树的CPU核心数(设置为-1以使用所有可用核心)。本例:n_jobs=-1超参数调优建议在实际应用中,建议通过网格搜索(GridSearch)或随机搜索(RandomSearch)进行超参数调优,配合交叉验证等方法来评估模型的性能,以确定最优参数组合。10.1异常值处理异常值判断:IQR规则统计学中,小于Q1-1.5IQR或大于Q3+1.5IQR的数据被看作异常值。这里用箱线图判别异常值。10.1异常值处理箱线图代码与图示box1=df.iloc[:,[3,9,7]]print(box1.boxplot())box2=df.iloc[:,[2]]print(box2.boxplot())在30-59days、60-89days、90+days3个变量中,有两组样本偏离了分布;age有一个为0的样本,不符合常识,应同样作为异常值舍弃。10.1异常值处理异常值分析结论逾期类变量异常30-59days、60-89days、90+days中有两组样本偏离分布,直接删除age异常值age存在为0的样本,不符合常识,作为异常值舍弃WOE编码缓解异常值普遍存在且聚集,后续分析中将使用WOE编码降低异常值的影响10.1异常值处理删除异常值并调整labeldf=df[df['30-59days']<90]#删除异常值df=df[df['age']>0]df['label']=1-df['label']#使好客户为1,坏客户为0删除逾期异常df['30-59days']<90:删除逾期次数极端异常的样本删除年龄异常df['age']>0:删除年龄为0的不合理样本Label反转1-df['label']:调整为好客户=1,坏客户=010.1数据清洗全流程回顾数据清洗全流程总结删除/重命名移除无用列并规范列名异常值处理基于IQR的箱线图检测导入数据读取原始数据文件Label调整将好客户标记为1缺失值处理随机林填补或删除缺失行通过上述五步,数据集已完成基础清洗,可进入探索性分析阶段。10.1变量说明汇总处理后变量类型汇总(表10-2)#新名称原始名称类型1labelSeriousDlqin2yrs因变量,0/1值2lineofcreditRevolvingUtilizationOfUnsecuredLinespercentage3ageageinteger430-59daysNumberOfTime30-59DaysPastDueNotWorseinteger5DebtRatioDebtRatiopercentage6MonthlyIncomeMonthlyIncomereal7openloanNumberOfOpenCreditLinesAndLoansinteger890+daysNumberOfTimes90DaysLateinteger9estateNumberRealEstateLoansOrLinesinteger1060-89daysNumberOfTime60-89DaysPastDueNotWorseinteger11familyNumberOfDependentsinteger10.1数据解读与导入完整数据处理链路回顾1下载数据Kaggle下载cs-training.csv2导入库与数据pandas/NumPy/sklearn等3字段处理删除无用列,重命名字段4缺失值处理随机森林填补+删除+去重5异常值处理IQR+箱线图+删除+label调整10.1阶段要点10.1核心知识点梳理数据来源GiveMeSomeCredit(Kaggle)提供11个特征变量,目标为预测2年内90天以上逾期概率字段工程删除无意义首列,使用rename()方法简化列名,便于后续分析缺失值策略MonthlyIncome用随机森林填补;family缺失比例<5%直接删除异常值策略IQR规则+箱线图识别,删除极端样本;后续用WOE编码进一步降低影响10.2可视化探索性分析探索性数据分析(ExploratoryDataAnalysis,EDA)是一个迭代的过程,可以通过它深入了解数据的结构、特征和潜在模式,从而为后续的建模工作打下坚实的基础。10.2.1数据分析EDA的目的与方法单变量EDA观察单个变量的分布规律,判断是否符合建模假设(如正态分布)多变量EDA分析变量间相关性,检测多重共线性,识别与目标变量强相关的特征建模之前,我们一般还需要对数据进行EDA,可以进行单变量EDA,也可以多变量EDA。10.2.1变量分布直方图为什么要看变量分布?建模之前需要了解数据分布特征,连续型变量的分布形态直接影响模型假设的有效性。逻辑回归要求自变量大致符合正态分布直方图是快速判断分布形态的标准工具若偏差过大,需考虑数据变换10.2.1变量分布直方图绘制age和MonthlyIncome直方图以连续型变量age和MonthlyIncome为例绘制直方图:age=df['age']sns.distplot(age)mi=df[df['MonthlyIncome']<50000]['MonthlyIncome']#将x轴范围限定在50000以内sns.distplot(mi)10.2.1变量分布直方图直方图结果解读:ageage分布特征得到的图形大概符合正态分布,也就是符合逻辑回归模型的一般假设。年龄分布集中在30–60岁区间近似正态分布,满足逻辑回归假设无极端异常集中10.2.1变量分布直方图直方图结果解读:MonthlyIncomeMonthlyIncome处理要点将x轴范围限定在50000以内,过滤极端高收入样本,使分布更清晰可读。收入分布右偏,低收入群体占比高限定范围后分布大致符合正态满足逻辑回归模型的一般假设10.2.1变量分布直方图直方图的意义与局限判断建模适用性得到的图形大概符合正态分布,也就是符合逻辑回归模型的一般假设识别异常分布若分布严重偏斜,需进行对数变换等处理再建模配合WOE编码后续WOE编码可进一步处理非正态分布变量,降低异常值影响10.2.1相关性热力图为什么要检验变量相关性?建模之前还需要检验变量之间的相关性,如果自变量之间具有强相关性,则会影响模型的准确性,需要重点关注,提取特征时需要保留相关特征。强相关自变量会导致多重共线性热力图可直观展示所有变量对的相关系数为特征选择提供依据10.2.1相关性热力图热力图代码实现(一)corr=df.corr()xticks=['x0','x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']yticks=list(df.columns)fig=plt.figure()ax1=fig.add_subplot(111)fig.add_subplot(111):创建一个1×1的网格,并在该网格的第一个位置创建子图ax1,用于放置热力图。10.2.1相关性热力图热力图代码实现(二):heatmap参数说明sns.heatmap(corr,annot=True,cmap='hsv',ax=ax1,annot_kws={'size':6,'weight':'bold','color':'blue'})ax1.set_xticklabels(xticks,rotation=0,fontsize=10)ax1.set_yticklabels(yticks,rotation=0,fontsize=10)plt.show()corr相关性矩阵annot=True在每个热力图单元格中显示相关性值cmap='hsv'设置颜色映射为'hsv'annot_kws设置注释的属性,包括文本大小、粗细和颜色10.2.1相关性热力图热力图结果展示由结果可见:(1)各变量之间的相关性较弱;(2)30-59days、60-89days、90+days与要预测的label有较强的相关性。10.2.1探索性结论(一)EDA结论:多重共线性检验由结果可见:各变量之间的相关性较弱,后续进行逻辑回归分析时可认为不存在多重共线性问题。10.2.1探索性结论(二)EDA结论:关键预测变量识别强相关特征30-59days、60-89days、90+days与要预测的label有较强的相关性建模指导意义提取特征时需要保留相关特征,这三个逾期变量将是后续建模的重要输入WOE编码后续对这些强相关变量进行WOE编码,进一步挖掘其信息价值10.2.2数据划分训练集与测试集划分:策略划分原则为了后续检验模型效果,将数据按照7:3分为训练集和测试集。训练集(70%):用于拟合模型测试集(30%):用于评估模型泛化能力设置random_state=0保证可重复性10.2.2数据划分数据划分代码实现y=df.iloc[:,0]X=df.iloc[:,1:]train_X,test_X,train_y,test_y=train_test_split(X,y,test_size=0.3,random_state=0)train_data=pd.concat([train_y,train_X],axis=1)test_data=pd.concat([test_y,test_X],axis=1)[插图:图10-9训练集与测试集划分]10.2.2数据划分划分结果与意义train_data训练集,占70%,包含label列与所有特征列,用于后续逻辑回归建模test_data测试集,占30%,结构与训练集相同,用于ROC曲线等模型评估pd.concat([train_y,train_X],axis=1):将因变量与自变量拼合为完整数据框,便于后续特征工程处理。10.1小结10.1小结:数据解读与导入数据缺失情况在实际应用中非常普遍,常见的处理方法包括:(1)直接删除有缺失值的样本;(2)根据样本之间的相似性进行填补;(3)根据变量之间的相关性进行填补。缺失值处理后,需要处理异常值。下面直接通过索引条件判断异常值,并对label进行调整,使得好客户为1,坏客户为0。10.2小结10.2小结:可视化探索性分析探索性数据分析(EDA)是一个迭代的过程,可以通过它深入了解数据的结构、特征和潜在模式,从而为后续的建模工作打下坚实的基础。由结果可见:(1)各变量之间的相关性较弱,后续进行逻辑回归分析时可认为不存在多重共线性问题;(2)30-59days、60-89days、90+days与要预测的label有较强的相关性。为了后续检验模型效果,将数据按照7:3分为训练集和测试集。完整数据链路回顾覆盖了从原始数据到建模就绪的完整前处理链路,为后续特征工程与建模阶段打下基础。数据解读→清洗→缺失值处理01数据解读信用评估是对贷款申请人进行风险评估的预测方法,在金融风险控制领域得到了广泛应用02字段清洗删除无意义第一列,使用rename()方法重新命名列,整理变量类型03缺失值处理MonthlyIncome随机森林填补(29731条);family直接删除(3924条,<5%);去重异常值处理→探索性可视化01异常值处理统计学中,小于Q1-1.5IQR或大于Q3+1.5IQR的数据被看作异常值。使用箱线图判别并删除,label调整为好客户=102直方图分析得到的图形大概符合正态分布,也就是符合逻辑回归模型的一般假设03热力图相关性各变量之间的相关性较弱,可认为不存在多重共线性问题;逾期类变量与label强相关04数据划分为了后续检验模型效果,将数据按照7:3分为训练集(70%)和测试集(30%),设置random_state=0保证可重复性。10.3特征工程该数据集存在缺失值和异常点,这些数据会影响模型的训练和预测效果。因此,需要利用特征工程获取更有价值且稳定性更高的特征。特征工程的重要性10.3特征工程在机器学习中具有重要作用,它会直接影响模型的性能和有效性。常用的特征选择方法主要包括:相关性分析基于模型的特征选择方法特征重要性评估方法目标获取更有价值且稳定性更高的特征核心工具WOE编码+IV值筛选WOE方法概述10.3在实际应用中,WOE是一种常用于信用评分建模和风险评估的统计方法。该方法可以衡量某一特征对目标变量的预测能力。WOE通过将每个特征的不同取值映射为一个权重,来反映该取值在区分"好样本"和"坏样本"时的影响方向和程度。WOE方法的四大优势WOE/IV核心概念处理缺失值能够处理缺失值,不影响建模适用范围广适用于连续型和分类型特征解释性强具有较强的解释性抗异常值能降低异常值带来的影响WOE与IV的关系WOE/IV核心概念WOE衡量某一特征某个取值对目标变量的影响方向和程度IV(信息价值)WOE常与IV结合使用,用于衡量整个特征的预测能力。通常,一个特征所包含的信息量越大,其IV值也就越高。WOE与IV计算公式WOE/IV核心概念其中,pyi代表第i组"坏样本"占总体坏样本的比例;qni代表第i组"好样本"占总体好样本的比例。WOE计算WOEᵢ=ln(pyi/qni)IV计算IV=Σ(pyi−qni)×WOEᵢWOE计算函数:初始化与分组WOE/IV核心概念importpandasaspdimportnumpyasnpdefwoe_value(d1):"""原始WOE计算函数"""#按分箱列分组(Bucket为分箱结果列名)d2=d1.groupby('Bucket',as_index=True)#as_index=True保留Bucket作为索引#全局统计量(依赖外部train_y)good=train_y.sum()#全局好样本数(Y=1的总数)bad=train_y.count()-good#全局坏样本数(Y=0的总数)#初始化分箱统计表d3=pd.DataFrame(d2.X.min())#每个分箱的最小值作为初始列WOE计算函数:填充统计与计算WOE/IV核心概念#填充分箱边界信息d3['min']=d2.min().X#分箱下限d3['max']=d2.max().X#分箱上限#填充目标变量统计d3['sum']=d2.sum().Y#分箱内好样本数(Y=1的求和)d3['total']=d2.count().Y#分箱总样本数#计算比例d3['goodattribute']=d3['sum']/goodd3['badattribute']=(d3['total']-d3['sum'])/bad#计算WOE和IV值d3['woe']=np.log(d3['goodattribute']/d3['badattribute'])iv=((d3['goodattribute']-d3['badattribute'])*d3['woe']).sum()#按分箱下限排序结果d4=d3.sort_values(by='min').reset_index(drop=True)woe=list(d4['woe'])returnd4,iv,woe10.3.1变量离散化WOE编码适用于类别型变量。对于连续型变量,需要先进行分箱操作(也称为变量离散化)。三种分箱方法10.3.1变量离散化等距分箱将变量值域划分为等宽区间,如将年龄按每10岁为一个区间划分。等深分箱预先设定分箱数量,使每个箱体中包含大致相同数量的样本。最优分箱在保持原始数据分布特征的前提下,使分箱后的特征与目标变量之间的相关性最大化。最优分箱:mono_bin函数定义10.3.1最优分箱在进行最优分箱时,以自变量和因变量的相关系数最大化为迭代终止条件,代码如下。defmono_bin(Y,X,n=10):#最优分段函数#Y:目标变量label,X:一列;n是分箱的个数,默认值为10r=0#使用循环寻找最优分箱mono_bin:while循环与qcut等深分箱10.3.1最优分箱whilenp.abs(r)<1:#先将特征X和目标变量Y进行等深分箱操作d1=pd.DataFrame({"X":X,"Y":Y,"Bucket":pd.qcut(X,n)})d2=d1.groupby('Bucket',as_index=True)#按bucket分组mono_bin:spearmanr相关系数计算10.3.1最优分箱#计算每个分箱区间均值和Y的Spearman相关系数r,p=stats.spearmanr(d2.mean().X,d2.mean().Y)#r返回的是相关系数,p为对应的p值n=n-1d4,iv,woe=woe_value(d1)以自变量和因变量的相关系数最大化为迭代终止条件,当np.abs(r)==1时退出循环。mono_bin:cut切点计算10.3.1最优分箱#计算切点cutcut=[]cut.append(float('-inf'))foriinrange(1,n+1):#py中的range区间为左开右闭qua=X.quantile(i/(n+1))cut.append(round(qua,4))cut.append(float('+inf'))mono_bin:return返回值10.3.1最优分箱#返回分箱统计信息、IV值、切点cut列表和WOE值列表returnd4,iv,cut,woed4分箱统计信息DataFrameiv该变量的IV值cut切点列表woeWOE值列表连续变量分箱调用:lineofcredit与age10.3.1连续变量分箱利用该函数对连续变量进行分箱,返回需要的dataframe、IV值、cut列表和WOE值列表:x1_d,x1_iv,x1_cut,x1_woe=mono_bin(train_y,train_X.lineofcredit)x2_d,x2_iv,x2_cut,x2_woe=mono_bin(train_y,train_X.age)连续变量分箱调用:DebtRatio与MonthlyIncome10.3.1连续变量分箱x4_d,x4_iv,x4_cut,x4_woe=mono_bin(train_y,train_X.DebtRatio)x5_d,x5_iv,x5_cut,x5_woe=mono_bin(train_y,train_X.MonthlyIncome)其他的非连续型变量,则需要进行手动分箱(主要使用df的拼接操作),目标切点如下(切点可根据要求自行选择):x3_cut=[-inf,0,1,3,5,+inf]x6_cut=[-inf,1,2,3,5,+inf]x7_cut=[-inf,0,1,3,5,+inf]x8_cut=[-inf,0,1,2,3,+inf]x9_cut=[-inf,0,1,3,+inf]x10_cut=[-inf,0,1,2,3,5,+inf]手动分箱:x3(30-59days)10.3.1手动分箱#x3d1=pd.DataFrame({'X':train_X["30-59days"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=0)]d1_x1.loc[:,'Bucket']="(-inf,0]"d1_x2=d1.loc[(d1['Bucket']>0)&(d1['Bucket']<=1)]d1_x2.loc[:,'Bucket']="(0,1]"d1_x3=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=3)]d1_x3.loc[:,'Bucket']="(1,3]"d1_x4=d1.loc[(d1['Bucket']>3)&(d1['Bucket']<=5)]d1_x4.loc[:,'Bucket']="(3,5]"d1_x5=d1.loc[d1['Bucket']>5]d1_x5.loc[:,'Bucket']="(5,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4,d1_x5])x3_d,x3_iv,x3_woe=woe_value(d1)x3_cut=[float('-inf'),0,1,3,5,float('+inf')]手动分箱:x6(openloan)10.3.1手动分箱#x6d1=pd.DataFrame({'X':train_X["openloan"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=1)]d1_x1.loc[:,'Bucket']="(-inf,1]"d1_x2=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=2)]d1_x2.loc[:,'Bucket']="(1,2]"d1_x3=d1.loc[(d1['Bucket']>2)&(d1['Bucket']<=3)]d1_x3.loc[:,'Bucket']="(2,3]"d1_x4=d1.loc[(d1['Bucket']>3)&(d1['Bucket']<=5)]d1_x4.loc[:,'Bucket']="(3,5]"d1_x5=d1.loc[d1['Bucket']>5]d1_x5.loc[:,'Bucket']="(5,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4,d1_x5])x6_d,x6_iv,x6_woe=woe_value(d1)手动分箱:x7(90+days)10.3.1手动分箱#x7d1=pd.DataFrame({'X':train_X["90+days"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=0)]d1_x1.loc[:,'Bucket']="(-inf,0]"d1_x2=d1.loc[(d1['Bucket']>0)&(d1['Bucket']<=1)]d1_x2.loc[:,'Bucket']="(0,1]"d1_x3=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=3)]d1_x3.loc[:,'Bucket']="(1,3]"d1_x4=d1.loc[(d1['Bucket']>3)&(d1['Bucket']<=5)]d1_x4.loc[:,'Bucket']="(3,5]"d1_x5=d1.loc[d1['Bucket']>5]d1_x5.loc[:,'Bucket']="(5,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4,d1_x5])x7_d,x7_iv,x7_woe=woe_value(d1)手动分箱:x8(estate)与x9(60-89days)10.3.1手动分箱#x8d1=pd.DataFrame({'X':train_X["estate"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=0)];d1_x1.loc[:,'Bucket']="(-inf,0]"d1_x2=d1.loc[(d1['Bucket']>0)&(d1['Bucket']<=1)];d1_x2.loc[:,'Bucket']="(0,1]"d1_x3=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=2)];d1_x3.loc[:,'Bucket']="(1,2]"d1_x4=d1.loc[(d1['Bucket']>2)&(d1['Bucket']<=3)];d1_x4.loc[:,'Bucket']="(2,3]"d1_x5=d1.loc[d1['Bucket']>3];d1_x5.loc[:,'Bucket']="(3,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4,d1_x5])x8_d,x8_iv,x8_woe=woe_value(d1)#x9d1=pd.DataFrame({'X':train_X["60-89days"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=0)];d1_x1.loc[:,'Bucket']="(-inf,0]"d1_x2=d1.loc[(d1['Bucket']>0)&(d1['Bucket']<=1)];d1_x2.loc[:,'Bucket']="(0,1]"d1_x3=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=3)];d1_x3.loc[:,'Bucket']="(1,3]"d1_x4=d1.loc[d1['Bucket']>3];d1_x4.loc[:,'Bucket']="(3,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4])x9_d,x9_iv,x9_woe=woe_value(d1)手动分箱:x10(family)10.3.1手动分箱#x10d1=pd.DataFrame({'X':train_X["family"],"Y":train_y})d1['Bucket']=d1['X']d1_x1=d1.loc[(d1['Bucket']<=0)];d1_x1.loc[:,'Bucket']="(-inf,0]"d1_x2=d1.loc[(d1['Bucket']>0)&(d1['Bucket']<=1)];d1_x2.loc[:,'Bucket']="(0,1]"d1_x3=d1.loc[(d1['Bucket']>1)&(d1['Bucket']<=2)];d1_x3.loc[:,'Bucket']="(1,2]"d1_x4=d1.loc[(d1['Bucket']>2)&(d1['Bucket']<=3)];d1_x4.loc[:,'Bucket']="(2,3]"d1_x5=d1.loc[(d1['Bucket']>3)&(d1['Bucket']<=5)];d1_x5.loc[:,'Bucket']="(3,5]"d1_x6=d1.loc[d1['Bucket']>5];d1_x6.loc[:,'Bucket']="(5,+inf)"d1=pd.concat([d1_x1,d1_x2,d1_x3,d1_x4,d1_x5,d1_x6])x10_d,x10_iv,x10_woe=woe_value(d1)10.3.2变量筛选:IV值汇总代码10.3.2变量筛选创建一个空列表,将所有自变量的IV值添加到列表中,最后使用柱形图进行可视化展示:info_value=[]info_value.append(x1_iv)info_value.append(x2_iv)info_value.append(x3_iv)info_value.append(x4_iv)info_value.append(x5_iv)info_value.append(x6_iv)info_value.append(x7_iv)info_value.append(x8_iv)info_value.append(x9_iv)info_value.append(x10_iv)index=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']index_num=range(len(index))ax=plt.bar(index_num,info_value,tick_label=index)plt.show()10.3.2变量筛选从图10-10的柱状图可以看出,x4(DebtRatio)、x5(MonthlyIncome)、x6(openloan)和x10(family)对应的柱子明显较低,说明这些变量的IV值较小,预测能力较弱。IV筛选结果:选定建模变量10.3.2变量筛选IV值较高(入选)x1lineofcreditx2agex330-59daysx790+daysx960-89daysIV值较低(排除)x4DebtRatiox5MonthlyIncomex6openloanx10family根据分析结果,我们选择x1、x2、x3、x7和x9作为建模变量。10.4模型建立与评估本节选用逻辑回归(LogisticRegression,LR)作为建模方法。逻辑回归是一种常用且高效的分类模型,在建模过程中常作为优先选择的工具。逻辑回归:适用场景10.4总述该模型通过估计事件发生的概率来描述自变量与因变量之间的关系,特别适用于二分类问题。在本案例中,因变量为label,用0、1表示好客户与坏客户;自变量则为前面通过IV值筛选得到的变量。因变量label:0=好客户,1=坏客户自变量x1、x2、x3、x7、x9(IV筛选结果)建模流程总览10.4总述WOE编码数据标准化,减少异常与量纲差异逻辑回归构建模型,估计违约概率ROC/AUC评估验证模型区分能力与性能WOE编码是一种数据标准化方法,能够减少异常值和不同量纲对建模的影响。10.4.1WOE编码转换WOE编码是一种数据标准化方法,能够减少异常值和不同量纲对建模的影响。在10.3.2节变量筛选中,已经得到了每个变量的WOE值列表和切点列表,因此可以基于这些结果完成WOE编码转换。x1与x1_woe对应关系10.4.1WOE编码转换以x1为例,(x_woe)的长度为4。当i=0时,对应的WOE值为1.283,判断条件是该自变量小于0.0312(即x_cut[1])。区间WOE值(-inf,0.0312]1.283(0.0312,0.1579]1.193(0.1579,0.5581]0.298(0.5581,+inf)-1.094trans_woe函数:定义与逻辑10.4.1WOE编码转换deftrans_woe(var,var_name,x_woe,x_cut):woe_name=var_name+'_woe'#新列名foriinrange(len(x_woe)):ifi==0:#第一箱:(-inf,cut1]var.loc[var[var_name]<=x_cut[i+1],woe_name]=x_woe[i]elif(i>0)and(i<=len(x_woe)-2):#中间箱:(cut_i,cut_i+1]var.loc[((var[var_name]>x_cut[i])&(var[var_name]<=x_cut[i+1])),woe_name]=x_woe[i]else:#最后一箱:(cut_last,+inf)var.loc[var[var_name]>x_cut[len(x_woe)-1],woe_name]=x_woe[len(x_woe)-1]returnvartrans_woe:注意事项10.4.1WOE编码转换需要注意,Python中range函数的右端点不可取,因此i的取值只能是0、1、2、3,不会取到4。当i=len(x_woe)-1时,对应WOE值应为列表最后一个元素。第一箱(i=0)条件:变量≤x_cut[1]中间箱(0<i≤n-2)条件:x_cut[i]<变量≤x_cut[i+1]最后一箱(i=n-1)条件:变量>x_cut[n-1]调用trans_woe:训练集转换10.4.1WOE编码转换x1_name='lineofcredit'x2_name='age'x3_name='30-59days'x7_name='90+days'x9_name='60-89days'train_X=trans_woe(train_X,x1_name,x1_woe,x1_cut)train_X=trans_woe(train_X,x2_name,x2_woe,x2_cut)train_X=trans_woe(train_X,x3_name,x3_woe,x3_cut)train_X=trans_woe(train_X,x7_name,x7_woe,x7_cut)train_X=trans_woe(train_X,x9_name,x9_woe,x9_cut)train_X=train_X.iloc[:,-5:]train_X.head(5)WOE转换结果解读10.4.1WOE编码转换可以发现,部分样本的某些变量在WOE编码后会得到相同的取值,这是因为它们落在了同一个分箱中。换句话说,WOE编码实质上是把数值型变量按照分箱结果转化为分类型变量。10.4.2建立逻辑回归模型10.4.2建立逻辑回归模型在训练集train_X上添加一个常数列用于模型拟合中的截距项,代码如下:X1=sm.add_constant(train_X)#在训练集train_X上添加常数列logit=sm.Logit(train_y,X1)#创建Logistic回归模型result=logit.fit()#拟合模型print(result.summary())#输出模型摘要逻辑回归:Sigmoid函数原理10.4.2建立逻辑回归模型在二分类问题中,因变量Y为0/1取值,显然不满足线性回归对因变量为连续变量的假设。为此,引入广义线性模型的思想,将线性预测值通过对数几率函数(logit函数)进行变换。这实际上是一个Sigmoid函数,它将线性回归的结果映射到区间(0,1),表示样本属于正类(label=1)的概率。在应用时,可以根据需要设定阈值,如设定0.5为阈值,则:若pi≥0.5,则预测为1,否则预测为0。逻辑回归结果解读10.4.2建立逻辑回归模型从回归结果可以看出,所有变量的p值(P>|z|)均为0.000,小于显著性水平0.05。这表明应拒绝"系数等于0"的零假设,即各个自变量对因变量均具有显著影响,建立的逻辑回归模型是显著的。好坏客户分类判别10.4.2建立逻辑回归模型好客户(label=0)预测概率<0.5,判定为负类坏客户(label=1)预测概率≥0.5,判定为正类逻辑回归是一种常用且高效的分类模型,在建模过程中常作为优先选择的工具。该模型通过估计事件发生的概率来描述自变量与因变量之间的关系,特别适用于二分类问题。10.4.3模型评估10.4.3模型评估在模型训练完成后,需要使用测试集对逻辑回归模型进行性能评估。本节主要采用ROC曲线(ReceiverOperatingCharacteristicCurve,接收者操作特征曲线)作为评估工具。ROC曲线:五步基本原理10.4.3模型评估01计算预测概率二分类模型输出样本属于正类(label=1)的概率02设定阈值通过设置不同阈值,将预测概率转化为分类结果03计算TPR和FPR在不同阈值下分别计算真阳性率(TPR)和假阳性率(FPR)04绘制ROC曲线将不同阈值下的(TPR,FPR)点连接成曲线05计算AUC值AUC为ROC曲线下面积,越接近1模型性能越好TPR与FPR的含义10.4.3模型评估TPR(真阳性率)正类样本被正确预测的比例FPR(假阳性率)负类样本被错误预测为正类的比例ROC曲线越靠近左上角模型性能越好,TPR高而FPR低AUC≈0.5模型性能仅相当于随机猜测,ROC曲线接近对角线ROC评估:测试集WOE编码转换10.4.3模型评估#对测试集数据进行编码转换#(训练模型时使用的是经过WOE编码的数据)test_X=trans_woe(test_X,x1_name,x1_woe,x1_cut)test_X=trans_woe(test_X,x2_name,x2_woe,x2_cut)test_X=trans_woe(test_X,x3_name,x3_woe,x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论