公司做网站,要准备哪些素材,网站优化建设山东,文创产品设计调研,网站建设行业市场分析概述 logistic回归是一种广义线性回归#xff08;generalized linear model#xff09;#xff0c;因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同#xff0c;都具有 w‘xb#xff0c;其中w和b是待求参数#xff0c;其区别在于他们的因变量不同#x…概述 logistic回归是一种广义线性回归generalized linear model因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同都具有 w‘xb其中w和b是待求参数其区别在于他们的因变量不同多重线性回归直接将w‘xb作为因变量即y w‘xb而logistic回归则通过函数L将w‘xb对应一个隐状态pp L(w‘xb),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数就是logistic回归如果L是多项式函数就是多项式回归。 logistic回归的因变量可以是二分类的也可以是多分类的但是二分类的更为常用也更加容易解释多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。 Logistic回归模型的适用条件
1 因变量为二分类的分类变量或某事件的发生率并且是数值型变量。但是需要注意重复计数现象指标不适用于Logistic回归。2 残差和因变量都要服从二项分布。二项分布对应的是分类变量所以不是正态分布进而不是用最小二乘法而是最大似然法来解决方程估计和检验问题。3 自变量和Logistic概率是线性关系4 各观测对象间相互独立。 原理如果直接将线性回归的模型扣到Logistic回归中会造成方程二边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量某个概率作为方程的因变量估计值取值范围为0-1但是方程右边取值范围是无穷大或者无穷小。所以才引入Logistic回归。 Logistic回归实质发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因是发生和未发生的概率成为了比值 这个比值就是一个缓冲将取值范围扩大再进行对数变换整个因变量改变。不仅如此这种变换往往使得因变量和自变量之间呈线性关系这是根据大量实践而总结。所以Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。 原理
线性回归
线性回归是一种使用特征属性的线性组合来预测响应的方法。它的目标是找到一个线性函数以尽可能准确地描述特征或自变量x与响应值y之间的关系使得预测值与真实值之间的误差最小化。 在数学上线性回归要找的这个线性函数叫回归方程其定义如下 PS损失函数的系数 1/2 是为了便于计算使对平方项求导后的常数系数为 1。 现代机器学习中常用的参数更新方法是梯度下降法。
梯度下降法 批梯度下降BGD批梯度下降会获得全局最优解缺点是在更新每个参数的时候需要遍历所有的数据计算量会很大并且会有很多的冗余计算导致的结果是当数据量大的时候每个参数的更新都会很慢。随机梯度下降SGD随机梯度下降是以高方差频繁更新优点是使得sgd会跳到新的和潜在更好的局部最优解缺点是使得收敛到局部最优解的过程更加的复杂。小批量梯度下降MGBD小批量梯度下降结合了sgd和batch gd的优点每次更新的时候使用n个样本。减少了参数更新的次数可以达到更加稳定收敛结果一般在深度学习当中我们采用这种方法。
回归的评价指标 从图中不难看出三者的关系是SST SSR SSE。如果 SSR 的值等于 SST这意味着我们的回归模型是完美的。
逻辑回归
逻辑回归和线性回归不同的地方在于线性回归适用于解决回归问题而逻辑回归适用于解决分类问题。本节我们就讲讲造成这种差异的原因。
Sigmoid函数 总结逻辑回归的总体思路就是先用逻辑函数把线性回归的结果 (-∞,∞) 映射到 (0,1)再通过决策边界建立与分类的概率联系。 代价函数 代价函数之所以要加负号是因为机器学习的目标是最小化损失函数而极大似然估计法的目标是最大化似然函数。那么加个负号正好使二者等价。对数损失函数与上面的极大似然估计的对数似然函数本质上是等价的。所以逻辑回归直接采用对数损失函数来求参数实际上与采用极大似然估计来求参数是一致的。 梯度下降法求解 逻辑回归的分类
逻辑回归对特征变量x和分类响应变量y之间的关系进行建模在给定一组预测变量的情况下它能给出落入特定类别响应水平的概率。也就是说你给它一组数据特征它告诉你这组数据属于某一类别的概率。根据分类响应变量y的性质我们可以将逻辑回归分为三类
二元逻辑回归Binary Logistic Regression 当分类结果只有两种可能的时候我们就称为二元逻辑回归。例如考试通过或未通过回答是或否血压高或低。名义逻辑回归Nominal Logistic Regression 当存在三个或更多类别且类别之间没有自然排序时我们就称为名义逻辑回归。例如企业的部门有策划、销售、人力资源等颜色有黑色、红色、蓝色、橙色等。序数逻辑回归Ordinal Logistic Regression 当存在三个或更多类别且类别之间有自然排序时我们就称为序数逻辑回归。例如评价有好、中、差身材有偏胖、中等、偏瘦。注意类别的排名不一定意味着它们之间的间隔相等。
Softmax Regression 原为链接https://www.cnblogs.com/marvin-wen/p/15966151.html
优劣势
优点
1形式简单模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响某个特征的权重值比较高那么这个特征最后对结果的影响会比较大 2模型效果不错。在工程上是可以接受的作为baseline)如果特征工程做的好效果不会太差并且特征工程可以大家并行开发大大加快开发的速度。 3训练速度较快。分类的时候计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟训练的速度可以通过堆机器进一步提高这样我们可以在短时间内迭代好几个版本的模型。 4资源占用小,尤其是内存。因为只需要存储各个维度的特征。 5方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果因为输出的是每个样本的概率分数我们可以很容易的对这些概率分数进行cutoff也就是划分阈值(大于某个阈值的是一类小于某个阈值的是一类)。
缺点
1准确率并不是很高。因为形式非常的简单(非常类似线性模型)很难去拟合数据的真实分布。 2很难处理数据不平衡的问题。举个例子如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器它对正负样本的区分能力不会很好。 3处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下只能处理线性可分的数据或者进一步说处理二分类的问题 。 4逻辑回归本身无法筛选特征。有时候我们会用gbdt来筛选特征然后再上逻辑回归。
实现
评分卡的目标模型是依据客户数据预测客户是否坏客户 整个建模过程共5步 1.变量分析与分箱筛选与标签SeriousDlqin2yrs有相关性的变量并把变量进行分箱作为建模的输入特征。 2.建模 (1)数据预处理转woe,归一化 (2)用逐步回归选出尽量少的特征(同时保持建模效果) (3)训练逻辑回归模型 3.模型评估检验AUC是否达标并检查系数是否都为正。 4.将逻辑回归模型预测结果转为评分 5.确定生产上的判定为坏客户的分数阈值 scikit-learn
在scikit-learn中与逻辑回归有关的主要是这3个类。LogisticRegression LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证以及选择正则化系数C以外 LogisticRegression和LogisticRegressionCV的使用方法基本相同。 logistic_regression_path类则比较特殊它拟合数据后不能直接来做预测只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择的时候。一般情况用不到这个类 此外scikit-learn里面有个容易让人误解的类RandomizedLogisticRegression,虽然名字里有逻辑回归的词但是主要是用L1正则化的逻辑回归来做特征选择的属于维度规约的算法类不属于我们常说的分类算法的范畴。 后面的讲解主要围绕LogisticRegression和LogisticRegressionCV中的重要参数的选择来来展开这些参数的意义在这两个类中都是一样的。 函数调用形式:
LogisticRegression(penaltyl2,dualFalse,tol1e4,C1.0,fit_interceptTrue,intercept_scaling1,class_weightNone,random_stateNone,solverliblinear,max_iter100,multi_classovr,verbose0,warm_startFalse, n_jobs1)
参数
参数参数名称解释penalty正则化类型1字符串型’l1’ or ‘l2’默认’l2’正则化类型。2LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为l1和l2.分别对应L1的正则化和L2的正则化默认是L2的正则化。3penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择如果是L2正则化那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。dual布尔型默认False。当样本数特征数时令dualFalse用于liblinear解决器中L2正则化。tol误差范围浮点型默认1e-4迭代终止判断的误差范围。C正则化强度浮点型默认1.0其值等于正则化强度的倒数为正的浮点数。数值越小表示正则化越强。fit_intercept截距布尔型默认True指定是否应该向决策函数添加常量(即偏差或截距)。intercept_scalingintercept_scaling浮点型默认为1仅仅当solver是”liblinear”时有用。solver逻辑回归损失函数的优化方法solver参数决定了我们对逻辑回归损失函数的优化方法有4种算法可以选择分别是 a. liblinear使用了开源的liblinear库实现内部使用了坐标轴下降法来迭代优化损失函数。b.lbfgs拟牛顿法的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。c. newton-cg也是牛顿法家族的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。d. sag即随机平均梯度下降是梯度下降法的变种和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度适合于样本数据多的时候SAG是一种线性收敛算法这个速度远比SGD快。从上面的描述可以看出newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数因此不能用于没有连续导数的L1正则化只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。同时sag每次仅仅使用了部分样本进行梯度迭代所以当样本量少的时候不要选择它而如果样本量非常大比如大于10万sag是第一选择。但是sag不能用于L1正则化所以当你有大量的样本又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量要么回到L2正则化。max_iter最大迭代次数整型默认是100multi_class分类方式multi_class参数决定了我们分类方式的选择有 ovr和multinomial两个值可以选择默认是 ovr。如果是二元逻辑回归ovr和multinomial并没有任何区别区别主要在多元逻辑回归上。verbose整型默认是0对于liblinear和lbfgs solververbose可以设为任意正数。class_weight分类模型中各种类型的权重class_weight参数用于标示分类模型中各种类型的权重可以不输入即不考虑权重或者说所有类型的权重一样。如果选择输入的话可以选择balanced让类库自己计算类型权重或者我们自己输入各个类型的权重比如对于0,1的二元模型我们可以定义class_weight{0:0.9, 1:0.1}这样类型0的权重为90%而类型1的权重为10%。如果class_weight选择balanced那么类库会根据训练样本量来计算权重。某种类型样本量越多则权重越低样本量越少则权重越高。sklearn的官方文档中当class_weight为balanced时类权重计算方法如下n_samples / (n_classes * np.bincount(y))_samples为样本数n_classes为类别数量np.bincount(y)会输出每个类的样本数例如y[1,0,0,1,1],则np.bincount(y)[2,3]sample_weight样本权重由于样本不平衡导致样本不是总体样本的无偏估计从而可能导致我们的模型预测能力下降。遇到这种情况我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种第一种是在class_weight使用balanced。第二种是在调用fit函数时通过sample_weight来自己调节每个样本权重。在scikit-learn做逻辑回归时如果上面两种方法都用到了那么样本的真正权重是class_weight*sample_weight。warm_start布尔型默认为False当设置为True时重用前一个调用的解决方案以适合初始化。否则只擦除前一个解决方案。对liblinear解码器无效。n_jobs使用的CPU核数整型默认是1如果multi_class‘ovr’ 则为在类上并行时使用的CPU核数。无论是否指定了multi_class当将’ solver ’ 设置为’liblinear’时将忽略此参数。如果给定值为-1则使用所有核。random_state随机种子整型默认None当“solver”“sag”或“liblinear”时使用。在变换数据时使用的伪随机数生成器的种子。如果是整数, random_state为随机数生成器使用的种子;若为RandomState实例则random_state为随机数生成器;如果没有随机数生成器就是’ np.random 使用的RandomState实例。
Toad基于 Python 的标准化评分卡模型
原为链接https://geekdaxue.co/read/fcantai/he3tkz 本次和大家分享一个开源的评分卡神器toad。从数据探索、特征分箱、特征筛选、特征WOE变换、建模、模型评估、转换分数都做了完美的包装极大的简化了建模人员的门槛。
一、读取数据、划分样本集
首先通过read_csv读取数据看看数据概况。
data pd.read_csv(train.csv)
print(Shape:,data.shape)
data.head(10)
# Shape: (108940, 167)这个测试数据有10万条数据167个特征。
print(month:,data.month.unique())
# month: [2019-03 2019-04 2019-05 2019-06 2019-07]通过观察时间变量可以发现数据的时间跨度为2019年5月到7月。为了真正测试模型效果将用3月和4月数据用于训练样本5月、6月、7月数据作为时间外样本也叫作OOT的跨期样本。
train data.loc[data.month.isin([2019-03,2019-04])True,:]
OOT data.loc[data.month.isin([2019-03,2019-04])False,:]
#train data.loc[data.month.isin([Mar-19,Apr-19])True,:]
#OOT data.loc[data.month.isin([Mar-19,Apr-19])False,:]
print(train size:,train.shape,\nOOT size:,OOT.shape)
# train size: (43576, 167)
# OOT size: (65364, 167)其实这部分属于模型设计的阶段是非常关键的环节。实际工作中会考虑很多因素要结合业务场景根据样本量、可回溯特征、时间窗口等因素制定合适的观察期、表现期、以及样本并且还要定义合适的Y标签。本次主要介绍toad的用法上面的设计阶段先忽略掉。
二、EDA相关功能
1. toad.detect
EDA也叫数据探索分析主要用于检测数据情况。toad输出每列特征的统计性特征和其他信息主要的信息包括缺失值、unique values、数值变量的平均值、离散值变量的众数等。
toad.detect(train)[:10]2. toad.quality
这个功能主要用于进行变量的筛选可以直接计算各种评估指标如iv值、gini指数entropy熵以及unique values结果以iv值排序。target为目标列iv_only决定是否只输出iv值。
to_drop [APP_ID_C,month] # 去掉ID列和month列
toad.quality(data.drop(to_drop,axis1),target,iv_onlyTrue)[:15]注意1. 对于数据量大或高维度数据建议使用iv_onlyTrue 2. 要去掉主键日期等高unique values且不用于建模的特征 但是这一步只是计算指标而已呈现结果进行分析还并没有真的完成筛选的动作。
三、特征筛选
toad.selection.select
前面通过EDA检查过数据质量后会有选择的筛选一些样本和变量比如缺失值比例过高的、IV值过低的、相关性太强的等等。 empyt0.9缺失值大于0.9的变量被删除 iv0.02iv值小于0.02的变量被删除 corr0.7两个变量相关性高于0.7时iv值低的变量被删除 return_dropFalse若为Truefunction将返回被删去的变量列 excludeNone明确不被删去的列名输入为list格式 用法很简单只要通过设置以下几个参数阈值即可实现如下
train_selected, dropped toad.selection.select(train,target target, empty 0.5, iv 0.05, corr 0.7, return_dropTrue, exclude[APP_ID_C,month])
print(dropped)
print(train_selected.shape)经过上面的筛选165个变量最终保留了32个变量。并且返回筛选过后的dataframe和被删掉的变量列表。 当然了上面都是一些常规筛选变量的方法可能有些特殊的变量比如从业务角度很有用是需要保留的但不满足筛选要求这时候可以用exclude排除掉。这个功能对于变量初筛非常有用各种指标直接计算并展示出来。
四、分箱
在做变量的WOE变换之前需要做变量的分箱分箱的好坏直接影响WOE的结果以及变换后的单调性。toad将常用的分箱方法都集成了包括等频分箱、等距分箱、卡方分箱、决策树分箱、最优分箱等。 并且toad的分箱功能支持数值型数据和离散型分箱。 这部分东哥看过源码toad首先判断变量类型如果为数值型就按数值型分箱处理如果为非数值型那么会判断变量唯一值的个数如果大于10个或者超过变量总数的50%那么也按照数值型处理。 另外toad还支持将空值单独分箱处理。 分箱步骤如下 初始化c toad.transform.Combiner() 训练分箱: c.fit(dataframe, y ‘target’, method ‘chi’, min_samples None, n_bins None, empty_separate False) y: 目标列 method: 分箱方法支持chi(卡方分箱), dt(决策树分箱), kmean, quantile, step(等步长分箱) min_samples: 每箱至少包含样本量可以是数字或者占比 n_bins: 箱数若无法分出这么多箱数则会分出最多的箱数 empty_separate: 是否将空箱单独分开 查看分箱节点c.export() 手动调整分箱: c.load(dict) apply分箱结果: c.transform(dataframe, labelsFalse):labels: 是否将分箱结果转化成箱标签。False时输出0,1,2…离散变量根据占比高低排序True输出(-inf, 0], (0,10], (10, inf)。 注意做筛选时要删去不需要分箱的列特别是ID列和时间列。
# initialise
c toad.transform.Combiner()
# 使用特征筛选后的数据进行训练使用稳定的卡方分箱规定每箱至少有5%数据, 空值将自动被归到最佳箱。
c.fit(train_selected.drop(to_drop, axis1), y target, method chi, min_samples 0.05) #empty_separate False
# 为了演示仅展示部分分箱
print(var_d2:,c.export()[var_d2])
print(var_d5:,c.export()[var_d5])
print(var_d6:,c.export()[var_d6])#结果输出var_d2: [747.0, 782.0, 820.0]
var_d5: [[O, nan, F], [M]]
var_d6: [[PUBLIC LTD COMPANIES, NON-RESIDENT INDIAN, PRIVATE LTD COMPANIES, PARTNERSHIP FIRM, nan], [RESIDENT INDIAN, TRUST, TRUST-CLUBS/ASSN/SOC/SEC-25 CO., HINDU UNDIVIDED FAMILY, CO-OPERATIVE SOCIETIES, LIMITED LIABILITY PARTNERSHIP, ASSOCIATION, OVERSEAS CITIZEN OF INDIA, TRUST-NGO]]观察分箱并调整
因为自动分箱也不可能满足所有需要很多情况下还是要手动分箱。toad除了上面自动分箱以外还提供了可视化分箱的功能帮助调整分箱节点比如观察变量的单调性。有两种功能
1. 时间内观察
toad.plot.bin_plot(dataframe, x None, target target) #也就是不考虑时间的因素单纯的比较各个分箱里的bad_rate观察单调性。
# 看var_d5在时间内的分箱
col var_d5
#观察单个变量分箱结果时建议设置labels True
bin_plot(c.transform(train_selected[[col,target]], labelsTrue), xcol, targettarget)上图中bar代表了样本量占比红线代表了坏客户占比。通过观察发现分箱有些不合理还有调整优化的空间比如将F和M单独一箱0和空值分为一箱。因此使用**c.set_rules(dict)**对这个分箱进行调整。
# iv值较低假设我们要 F 单独分出一组来提高iv
#设置分组
rule {var_d5:[[O, nan],[F], [M]]}
#调整分箱
c.set_rules(rule)
#查看手动分箱稳定性
bin_plot(c.transform(train_selected[[var_d5,target]], labelsTrue), xvar_d5, targettarget)
badrate_plot(c.transform(OOT[[var_d5,target,month]], labelsTrue), targettarget, xmonth, byvar_d5)2. 跨时间观察
toad.plot.badrate_plot考虑时间因素输出不同时间段中每箱的正样本占比观察分箱随时间变量的稳定性。
target: 目标列x: 时间列, string格式要预先分好并设成string不支持timestampeby: 需要观察的特征
下面分别观察变量var_d2在训练集和OOT测试集中随时间month变化的稳定性。正常情况下每个分箱的bad_rate应该都有所区别并且随时间保持稳定不交叉。如果折现有所交叉说明分箱不稳定需要重新调整。
from toad.plot import badrate_plot
col var_d2
# 观察 var_d2 分别在时间内和OOT中的稳定性
badrate_plot(c.transform(train[[col,target,month]], labelsTrue), targettarget, xmonth, bycol)
badrate_plot(c.transform(OOT[[col,target,month]], labelsTrue), targettarget, xmonth, bycol)敞口随时间变化而增大为优代表了变量在更新的时间区分度更强。线之前没有交叉为优代表分箱稳定。五、WOE转化
WOE转化在分箱调整好之后进行步骤如下 用上面调整好的Combinerc转化数据: c.transform只会转化被分箱的变量。 初始化woe transertranser toad.transform.WOETransformer() 训练转化woetranser.fit_transform训练并输出woe转化的数据用于转化train/时间内数据 target目标列数据非列名 exclude: 不需要被WOE转化的列。注意会转化所有列包括未被分箱transform的列通过exclude删去不要WOE转化的列特别是target列。 根据训练好的transer转化test/OOT数据transer.transform 根据训练好的transer输出woe转化的数据用于转化test/OOT数据。
# 初始化
transer toad.transform.WOETransformer()
# combiner.transform() transer.fit_transform() 转化训练数据并去掉target列
train_woe transer.fit_transform(c.transform(train_selected), train_selected[target], excludeto_drop[target])
OOT_woe transer.transform(c.transform(OOT))
print(train_woe.head(3))#结果输出
APP_ID_C target var_d2 var_d3 var_d5 var_d6 var_d7 \
0 app_1 0 -0.178286 0.046126 0.090613 0.047145 0.365305
1 app_2 0 -1.410248 0.046126 -0.271655 0.047145 -0.734699
2 app_3 0 -0.178286 0.046126 0.090613 0.047145 0.365305var_d11 var_b3 var_b9 ... var_l_60 var_l_64 var_l_68 var_l_71 \
0 -0.152228 -0.141182 -0.237656 ... 0.132170 0.080656 0.091919 0.150975
1 -0.152228 0.199186 0.199186 ... 0.132170 0.080656 0.091919 0.150975
2 -0.152228 -0.141182 0.388957 ... -0.926987 -0.235316 -0.883896 -0.385976var_l_89 var_l_91 var_l_107 var_l_119 var_l_123 month
0 0.091901 0.086402 -0.034434 0.027322 0.087378 2019-03
1 0.091901 0.086402 -0.034434 0.027322 0.087378 2019-03
2 0.091901 -0.620829 -0.034434 -0.806599 -0.731941 2019-03
[3 rows x 34 columns]六、逐步回归
toad.selection.stepwise
逐步回归特征筛选支持向前向后和双向。 逐步回归属于包裹式的特征筛选方法这部分通过使用sklearn的REF实现。 estimator: 用于拟合的模型支持’ols’, ‘lr’, ‘lasso’, ‘ridge’direction: 逐步回归的方向支持’forward’, ‘backward’, ‘both’ 推荐criterion: 评判标准支持’aic’, ‘bic’, ‘ks’, ‘auc’max_iter: 最大循环次数return_drop: 是否返回被剔除的列名exclude: 不需要被训练的列名比如ID列和时间列 根据多次验证一般来讲 direction both’效果最好。estimator ols’以及criterion aic’运行速度快且结果对逻辑回归建模有较好的代表性。
# 将woe转化后的数据做逐步回归
final_data toad.selection.stepwise(train_woe,target target, estimatorols, direction both, criterion aic, exclude to_drop)
# 将选出的变量应用于test/OOT数据
final_OOT OOT_woe[final_data.columns]
print(final_data.shape) # 逐步回归从31个变量中选出了10个
#结果输出(43576, 13)#最后筛选后再次确定建模要用的变量。
col list(final_data.drop(to_drop[target],axis1).columns)七、建模和模型评估
首先使用逻辑回归建模通过sklearn实现。模型参数比如正则化、样本权重等不在这里详解。
用逻辑回归建模
# 用逻辑回归建模
from sklearn.linear_model import LogisticRegression
lr LogisticRegression()
lr.fit(final_data[col], final_data[target])
# 预测训练和隔月的OOT
pred_train lr.predict_proba(final_data[col])[:,1]
pred_OOT_may lr.predict_proba(final_OOT.loc[final_OOT.month 2019-05,col])[:,1]
pred_OOT_june lr.predict_proba(final_OOT.loc[final_OOT.month 2019-06,col])[:,1]
pred_OOT_july lr.predict_proba(final_OOT.loc[final_OOT.month 2019-07,col])[:,1]然后计算模型预测结果。风控模型常用的评价指标有: KS、AUC、PSI等。下面展示如果通过toad快速实现完成。 KS 和 AUC
评价指标
from toad.metrics import KS, AUC
print(train KS,KS(pred_train, final_data[target]))
print(train AUC,AUC(pred_train, final_data[target]))
print(OOT结果)
print(5月 KS,KS(pred_OOT_may, final_OOT.loc[final_OOT.month 2019-05,target]))
print(6月 KS,KS(pred_OOT_june, final_OOT.loc[final_OOT.month 2019-06,target]))
print(7月 KS,KS(pred_OOT_july, final_OOT.loc[final_OOT.month 2019-07,target]))
#结果输出train KS 0.3707986228750539
train AUC 0.75060723924743#OOT结果
5月 KS 0.3686687175756087
6月 KS 0.3495273403486497
7月 KS 0.3796914199845523PSI
PSI分为两种一个是变量的PSI一个是模型的PSI。 下面是变量PSI的计算比较训练集和OOT的变量分布之间的差异。
toad.metrics.PSI(final_data[col], final_OOT[col])
#结果输出var_d2 0.000254
var_d5 0.000012
var_d7 0.000079
var_d11 0.000191
var_b10 0.000209
var_b18 0.000026
var_b19 0.000049
var_b23 0.000037
var_l_20 0.000115
var_l_68 0.000213
dtype: float64模型PSI的计算分别计算训练集和OOT模型预测结果的差异下面细分为三个月份比较。
print(toad.metrics.PSI(pred_train,pred_OOT_may))
print(toad.metrics.PSI(pred_train,pred_OOT_june))
print(toad.metrics.PSI(pred_train,pred_OOT_june))另外toad还提供了整个评价指标的汇总输出模型预测分箱后评判信息包括每组的分数区间样本量坏账率KS等。
toad.metrics.KS_bucketbucket分箱的数量method分箱方法建议用quantile等人数或step(等分数步长) bad_rate为每组坏账率 组之间的坏账率差距越大越好 可以用于观察是否有跳点 可以用与找最佳切点 可以对比
# 将预测等频分箱观测每组的区别
toad.metrics.KS_bucket(pred_train, final_data[target], bucket10, method quantile)八、转换评分
toad.ScoreCard
最后一步就是将逻辑回归模型转标准评分卡支持传入逻辑回归参数进行调参。 combiner: 传入训练好的 toad.Combiner 对象transer: 传入先前训练的 toad.WOETransformer 对象pdo、rate、base_odds、base_score: e.g. pdo60, rate2, base_odds20, base_score750 实际意义为当比率为1/20输出基准评分750当比率为基准比率2倍时基准分下降60分card: 支持传入专家评分卡**kwargs: 支持传入逻辑回归参数参数详见 sklearn.linear_model.LogisticRegression python card toad.ScoreCard( combiner c, transer transer,class_weight ‘balanced’,C0.1,base_score 600,base_odds 35 ,pdo 60,rate 2) card.fit(final_data[col], final_data[‘target’]) 结果输出 ScoreCard(base_odds35, base_score750, cardNone,combinertoad.transform.Combiner object at 0x1a2434fdd8, pdo60,rate2,transertoad.transform.WOETransformer object at 0x1a235a5358)注评分卡在 fit 时使用 WOE 转换后的数据来计算最终的分数分数一旦计算完成便无需 WOE 值可以直接使用 原始数据 进行评分。
# 直接使用原始数据进行评分
card.predict(train)
#输出标准评分卡
card.export()
#结果输出
{var_d2: {[-inf ~ 747.0): 65.54,[747.0 ~ 782.0): 45.72,[782.0 ~ 820.0): 88.88,[820.0 ~ inf): 168.3},var_d5: {O,nan: 185.9, F: 103.26, M: 68.76},var_d7: {LARGE FLEET OPERATOR,COMPANY,STRATEGIC TRANSPRTER,SALARIED,HOUSEWIFE: 120.82,DOCTOR-SELF EMPLOYED,nan,SAL(RETIRAL AGE 60),SERVICES,SAL(RETIRAL AGE 58),OTHERS,DOCTOR-SALARIED,AGENT,CONSULTANT,DIRECTOR,MEDIUM FLEETOPERATOR,TRADER,RETAIL TRANSPORTER,MANUFACTURING,FIRST TIME USERS,STUDENT,PENSIONER: 81.32,PROPRIETOR,TRADING,STRATEGIC CAPTIVE,SELF-EMPLOYED,SERV-PRIVATE SECTOR,SMALL RD TRANS.OPR,BUSINESSMAN,CARETAKER,RETAIL,AGRICULTURIST,RETIRED PERSONNEL,MANAGER,CONTRACTOR,ACCOUNTANT,BANKS SERVICE,GOVERNMENT SERVICE,ADVISOR,STRATEGIC S1,SCHOOLS,TEACHER,GENARAL RETAILER,RESTAURANT KEEPER,OFFICER,POLICEMAN,SERV-PUBLIC SECTOR,BARRISTER,Salaried,SALESMAN,RETAIL CAPTIVE,Defence (NCO),STRATEGIC S2,OTHERS NOT DEFINED,JEWELLER,SECRETARY,SUP STRAT TRANSPORT,LECTURER,ATTORNEY AT LAW,TAILOR,TECHNICIAN,CLERK,PLANTER,DRIVER,PRIEST,PROGRAMMER,EXECUTIVE ASSISTANT,PROOF READER,STOCKBROKER(S)-COMMD,TYPIST,ADMINSTRATOR,INDUSTRY,PHARMACIST,Trading,TAXI DRIVER,STRATEGIC BUS OP,CHAIRMAN,CARPENTER,DISPENSER,HELPER,STRATEGIC S3,RETAIL BUS OPERATOR,GARAGIST,PRIVATE TAILOR,NURSE: 55.79},var_d11: {N: 88.69, U: 23.72},var_b10: {[-inf ~ -8888.0): 67.76,[-8888.0 ~ 0.548229531): 97.51,[0.548229531 ~ inf): 36.22},var_b18: {[-inf ~ 2): 83.72, [2 ~ inf): 39.23},var_b19: {[-inf ~ -9999): 70.78, [-9999 ~ 4): 97.51, [4 ~ inf): 42.2},var_b23: {[-inf ~ -8888): 64.51, [-8888 ~ inf): 102.69},var_l_20: {[-inf ~ 0.000404297): 78.55,[0.000404297 ~ 0.003092244): 103.85,[0.003092244 ~ inf): 36.21},var_l_68: {[-inf ~ 0.000255689): 70.63,[0.000255689 ~ 0.002045513): 24.56,[0.002045513 ~ 0.007414983000000002): 66.63,[0.007414983000000002 ~ 0.019943748): 99.55,[0.019943748 ~ inf): 142.36}
}九、其他功能
toad.transform.GBDTTransformer
toad还支持用gbdt编码用于gbdt lr建模的前置。这种融合的方式来自facebook即先使用gbdt训练输出再将输出结果作为lr的输入训练以此达到更好的学习效果。
gbdt_transer toad.transform.GBDTTransformer()
gbdt_transer.fit(final_data[col[target]], target, n_estimators 10, max_depth 2)
gbdt_vars gbdt_transer.transform(final_data[col])
gbdt_vars.shape
# (43576, 40)以上就是toad的基本用法。