精华内容
下载资源
问答
  • 为了保证后续教程的可持续性,我们先设定一个小目标,教程结束后,我们将完成一个最简单的纯文字游戏编辑器,如果大家有玩过生命线的话,最终生成的游戏就是和这款游戏类似。 游戏玩法大致如下图所示: 游戏中全靠...

    从本篇开始,我们就来一步一步从零开始编写一个自己的游戏编辑器。

    7d7f8ca8b1cd818b10807d0d548b1202.png

    在编写之前,我也做了许多准备工作,其中Construct3我仔细了解了一番,刚刚发现最近增加了简体中文版本,看来还是很照顾中国市场的,有兴趣可以体验一番。

    虽然感觉可以挑战下,但是体量还是稍微有点大,不太适合立flag,万一打脸了呢?以后,有机会一定挑战下。

    9625690e9448afcf982cacceca390d76.png

    我们不需要写的像creator那么高度可复用,我们只针对特定游戏类型进行定制,有点类似《魔兽争霸》编辑器,是为特定游戏类型服务的,别激动,我们也不搞这么高大上的编辑器,我们就只针对文字游戏进行定制编辑器。

    顺带扩展下思路,任何游戏类型的游戏(2D,3D)都可以制作配套的编辑器,如果Creator是偏底层的话,那么我们的编辑器就是偏应用层的,是完全不同的编辑器思路。

    为了保证后续教程的可持续性,我们先设定一个小目标,教程结束后,我们将完成一个最简单的纯文字游戏编辑器,如果大家有玩过生命线的话,最终生成的游戏就是和这款游戏类似。

    34ccc3d79841a6c6413720af5222e4ae.png

    游戏玩法大致如下图所示:

    72cc39f3f7a5c83d04e74a4c44966c04.png

    游戏中全靠文字对话撑起整个游戏剧情,不同的选择会导致不同的游戏剧情走向。

    在调研这款游戏的时候,偶然也发现了『蝶梦文字游戏编辑器』(此处绝无广告的嫌疑,我也没收钱),并且还在运营,在体验了之后,我的内心一直回荡这一个字:抄。

    c94970251400a231a5a52d8c6518497b.png

    OK,那么我们正式进入正题。

    我们先进行一些准备工作,那么都需要哪些内容才能完整的实现出来一个编辑器呢?听说给你分(chui)析(niu)一番:

    1. 首先我们需要编写游戏的基本逻辑,这是游戏的灵魂,也是编辑器的基础,相信creator老司机们,编写这样一个简单的文字游戏逻辑,应该问题不大吧,这都不会,出门左拐,不送。

    2. 我们其实很容易观察到,这种文字游戏,其实是依靠数据驱动,逻辑并不复杂,而我们要编写配套的游戏编辑器,核心其实就是生产数据,在这里我们使用的是Electron,将游戏逻辑嵌入到编辑器中,并编写配套的编辑器逻辑,并且可以视需求,定制一些实用的功能,比如实时展示运行游戏,展示剧情走向逻辑关系等等。

    3. 游戏最终是要发布出去的,发布流程其实就是将游戏逻辑游戏数据打包的过程。

    经过以上分析,个人认为整个一个编辑器想要顺利开发完成,需要具备以下能力:

    1. 对编辑器整体的设计架构能力,如何把一个需求功能,正确的拆分为游戏逻辑、编辑器逻辑等。

    2. 对知识的广度也有一定要求,只有见得多,才能形成自己的认知理解,至于深度嘛,熟练掌握即可。

      游戏逻辑部分:不需要你达到图形学大佬的水平,能写个斗地主,打飞机小游戏就可以。

      编辑器部分:因为Electron使用的web开发技术栈,所以不是web前端老司机也不要紧,web小菜鸡会使用vue,能写个hello world就可以。

    3. 最重要的能力,将1和2,结合起来。

    一通分析猛如虎,战力只有0.5,让你失望了,到现在为止,都是在介绍思路,毕竟三思而后行,写代码亦是如此。

    在下一篇教程中,就开始真正的代码实战了。

    537c1867525051bef6870dbd531638e4.png

    在此时间,你可以抽空了解以下内容,因为紧接着会涉及大量这方面的知识:

    1. Cocos Creator

    2. Electron

    3. Web三件套(JS,HTML,CSS)

    4. Vue:注意,为了降低开发难度,我不会采用vue-cli。

    5. Vuex:视情况啦,但我还是建议你学习下。

    6. Element-ui:ui框架采用了比较流行的框架之一,如果你对其他ui框架比较熟悉,可忽略这部分知识。

    7. 项目开发语言采用js,不采用ts的原因是,配置越简单越好。

    好啦,本篇文章到此结束,虽然没有实战,但是知识点还真的满满一堆,相信完成这个编辑器,绝对能让你从新的角度重新认识creator。

    如果这篇文章对你有帮助,请自觉赞赏,谢谢!

    展开全文
  • - note有多种形式:流程图,时序图,文字描述或概括【针对复杂的代码逻辑,例如:android的aosp的源码】 - debug 和 log最好结合起来,针对项目对外呈现的UI或者其他逻辑,梳理对应的代码。 方法 1 修改法 将已有...

    结论

    debug + log + google + note

    备注:
    - note有多种形式:流程图,时序图,文字描述或概括【针对复杂的代码逻辑,例如:android的aosp的源码】
    - debug 和 log最好结合起来,针对项目对外呈现的UI或者其他逻辑,梳理对应的代码。

    方法

    1 修改法
    将已有功能注释,剔除,数据变更,观察界面,逻辑,数据的变化

    2 二分定位法

    安卓中的特定情况

    样式、资源问题查找

    优先级别:activity主题 < View样式 < layout中的属性 < 代码中的覆写。同样,查找某一个属性的特征时,也在这几个地方。

    转载于:https://www.cnblogs.com/neen/p/10711420.html

    展开全文
  • Python实现逻辑回归建模

      
      逻辑回归已经在各大银行和公司都实际运用于业务,已经有很多前辈写过逻辑回归。本文将从我实际应用的角度阐述逻辑回归的由来,致力于让逻辑回归变得清晰、易懂逻辑回归又叫对数几率回归,是一种广义线性回归分析模型。虽然名字里有回归,但其实是分类模型,常用于二分类。
      
      这篇文章是逻辑回归三部曲中的第三部,介绍sklearn库中逻辑回归参数的含义和使用方法,并给出项目实战的Python代码。如果想要了解逻辑回归的来源和原理,参见公众号中的文章:逻辑回归由来逻辑回归原理

      

      
      

    一、在Python中如何实现逻辑回归建模

      

    1.1 调用sklearn库

    from sklearn.linear_model import LogisticRegression as lr
    

      

    1.2 逻辑回归常用参数详解

      
      逻辑回归函数中有很多参数,可以根据自己的数据进行相应调整。如果觉得纯看参数解释会有点枯燥,可以先看本文第二部分项目实战,有需要的时候再回过头来看这部分。
      

    LogisticRegression( solver='lbfgs', penalty='l2', class_weight=None, tol=0.0001, random_state=None, C=1.0, fit_intercept=True, intercept_scaling=1, dual=False,  max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
    

    参数说明:

    solver求解逻辑回归损失函数对应参数的优化算法。str类型,有以下五种算法可以选择,默值为’lbfgs’。

    1. liblinear:使用开源的liblinear库实现,内部使用坐标轴下降法来迭代优化损失函数,适用于小数据集。

    2. lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵(海森矩阵)来迭代优化损失函数。

    3. newton-cg:牛顿法家族中的一种,利用损失函数二阶导数矩阵(海森矩阵)来迭代优化损失函数。

    4. sag:随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。

    5. saga:线性收敛的随机优化算法的的变种,适用于大数据集。
        

    注1:对于常见的多元逻辑回归(OvR)和(MvM),一般(MvM)比(OvR)分类相对准确一些,但是liblinear只支持(OvR)不支持(MvM)。这意味着我们需要相对精确的多元逻辑回归时,不能选择liblinear,从而也不可以使用优化算法只能选择liblinear的L1正则。
      
    注2:sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候最好不要选择它。而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化(没有连续导数)。如果你有大量的样本,同时模型的特征非常多,想要用L1正则化让模型系数稀疏化,这时就需要进行取舍。要么通过对样本采样来降低样本量 ,要么通过特征筛选提前挑选出重要变量,要么回到L2正则化。
      

    penalty为了解决过拟合问题,给模型加一个惩罚项。可选{‘l1’,‘l2’, ‘elasticnet’,‘none’},默认值为’l2’,如果选择’none’是不加惩罚项。

    如果模型的特征非常多,我们希望一些不重要的特征系数归为零,从而让模型系数稀疏化的话,可以使用L1正则化(这个可以考虑用在变量挑选,把使用L1正则化系数为0的变量剔除掉)。penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择。

    如果是L1正则化,只能选择’liblinear’。这是因为L1正则化的损失函数不是连续可导的,而使用{‘newton-cg’,‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数,而’liblinear’并没有这个依赖。如果是L2正则化,4种算法{‘newton-cg’,‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。
      

    class_weight由于样本不平衡,导致样本不是总体样本的无偏估计,使得模型的预测能力下降。

    为解决样本不均衡问题,可通过调节样本权重,使某种类型的样本量越多则权重越低,样本量越少则权重越高。可选参数为{dict,‘balanced’},默认值为None,即不调节样本权重。当class_weight为balanced时,类权重的计算方法为:n_samples/(n_classes*np.bincount(y)),其中n_samples为样本数,n_classes为类别数,np.bincount(y)会输出每个类的样本数。

    比如当样本标签为[1,1,0,0,0,0,0,0,0,0]时,n_samples为10,n_classes为2,np.bincount(y)为[2,8],类权重为10/(2*[2,8]),结果为[2.5,0.625]。即1的样本权重为2.5,0的样本权重为0.625,从而可以让标签数量少的样本占更高的权重。当class_weight为自定义时,对于0,1二元模型,我们可以定义class_weight={0:0.2,1:0.8},这样类型0的权重为20%,类型1的权重为80%。

    什么情况下要对class_weight进行调整?下面举两个例子(只是为了举例说明,不是真实统计数据):

    1. 样本高度失衡。比如在第三方支付公司的欺诈领域,由于欺诈商户是极少一的部分,绝大部分的商户是正常商户。在建立欺诈模型的时候,99901个商户是正常商户,99个商户是欺诈商户。即0.1%的商户是欺诈商户,99.9%的商户是正常商户。如果我们不考虑权重,把所有商户都预测成正常商户,那么模型的预测准确率为99.9%,但是这种预测结果是没有任何意义的,没有抓到任何欺诈商户。

    2. 误分类代价很高。如果我们将欺诈商户分类为正常商户,可能会带来上万的损失。这时,在模型上我们可能愿意误判一些正常商户,让监控运营进行甄别,尽可能多地识别出欺诈商户,减少资金损失。

    针对以上两种情况,我们可以选择balanced,或者自己确定各个类别的权重,让类库自动提高数量少的样本的权重。提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上述问题。

    注1:建模时使用balance这个参数,对于两端的数据可能会比较均匀。即不使用balance参数在高分区出现的坏样本占比可能会高于使用balance参数的模型(可能和行业数据有关)。如果想要在高分段准确率更高,要慎用balance参数

    注2:调节样本权重的方法有两种,第一种是在class_weight中使用balanced。另一种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。那么样本的真正权重是:class_weight*sample_weight。
      

    tol迭代终止的条件。float类型,默认值为0.0001。

    比如我们想要求取使得损失函数最小化的参数θ,现用梯度下降法进行求解,每迭代一次,损失函数的值都会减少一点,当迭代前后损失函数的差值小于0.0001时,迭代停止。
      

    random_state随机数种子。int类型,默认为None。仅在正则化优化算法为sag、liblinear时使用。

    比如要随机产生一个初始值,可以设置种子的值为20,那么每次随机产生的值都是20这个种子对应的值,可以用此方法复现建模时的数据。
      

    C:正则化系数的倒数。float类型,默认值为1.0,该值越小正则化越强。
      

    fit_intercept:确定是否有一个**常数项(截距项)**应该添加到逻辑函数中的线性表达式中。bool类型,默认值为True。
      

    intercept_scaling:仅在正则化项为‘liblinear’且fit_intercept设置为True时有用。float类型,默认值为1。
      
      

    二、逻辑回归模型项目实战

      
      项目背景:由于公司发展车贷业务,需要判断新进来的申请人有多大的概率会逾期,根据逾期的概率和资金的松紧程度决定是否放贷。现在有一批历史上是否违约的客户样本数据(由于数据涉及安全问题,也是职业操守要求,故此数据不是原始数据,是经过处理的)。想根据这批历史数据训练逻辑回归模型,得到模型参数,预测未来新申请的客户逾期概率。从而决定新申请人是通过、转人工核验还是拒绝。

      

    2.1 导入基本库并设置文件存放路径

      
    从Python中导入最常使用的数据处理库,并设置数据的存放的地址。

    # coding: utf-8
    import os             #导入设置路径的库
    import pandas as pd  #导入数据处理的库
    import numpy as np   #导入数据处理的库
    os.chdir('F:/微信公众号/Python/19.逻辑回归/项目实战数据')  #把路径改为数据存放的路径
    os.getcwd()          #看下当前路径
    

      

    2.2 导入待建模的数据

      

    data = pd.read_csv('testtdmodel.csv',sep=',',encoding='gb18030')
    

    :由于数据中存在中文,如果不使用encoding对编码进行申明会报如下错误:

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 2: invalid start byte
    

    把endcoding的值设置为gb18030gbk可以解决此类问题,成功导入数据。

      

    2.3 分析数据基本情况

      

    2.3.1 用head函数看下数据表头和前几行数据

      
      我选择看前两行的数据,如果括号里为空默认展示前五行的数据,可以根据需要把2改为你想展示的行数。也可以用tail函数展示后几行数据。
      

    data.head(2)
    

    结果:

    在这里插入图片描述
      

    2.3.2 用value_counts函数观测因变量y的数据分布

      
      在信贷中,有些客户因为忘记了还款日期、或者资金在短期内存在缺口(不是恶意不还),可能会导致几天的逾期,在催收后会及时还款。故一般不把历史逾期不超过x天(根据公司的实际业务情况和数据分析结果得出)的客户定义为坏客户(这里的坏不是坏人的意思,纯粹指逾期超过x天的客户)。在本文把逾期超过20天的客户标签y定义为1(坏客户),没有逾期和逾期不超过20天的客户标签y定义为0(好客户)。
      

    data.y.value_counts()
    

    结果:
    在这里插入图片描述
      本文总计样本数量为7252,其中7155个样本是好客户,97个样本是坏客户。说明0和1的分布很不均匀,我们统计一下占比:

    在这里插入图片描述  
      发现0的占比达到了98.6%,1的占比不到2%,这是典型的样本不均衡问题。如果我们把所有的客户都预测成好客户,模型可以达到98.6%的准确率。但是这个结果是毫无意义的,因为模型没起到区分逾期和非逾期客户的作用,没有达到建模的目的。可以用前文提到的class_weight和sample_weight对权重进行调整,让标签是1的样本占更多的权重。
      
      实际中很多问题可能都是数据分布不均匀的,比如患病的人数和不患病的人数、欺诈商户和正常商户、逾期的客户和不逾期的客户等等。不过这些都是正常现象,想一想如果逾期客户数超过了不逾期的人数,公司早就倒闭了好吧。那么建模的目的就是想把钱尽可能多地贷给能按期还钱的客户,尽可能多地拒绝可能会逾期的客户。这样公司的钱才能挣得更多的利息,产生更少的坏账,总收益才能最大化。
      

    2.3.3 用describe函数查看数据分布

      
      一般建模之前要看下数据的缺失情况、检查一下数据是不是存在错误。如果数据存在缺失值考虑删除这个样本,或用0值或中位数等统计变量去填充。如果删除存在缺失值的样本,模型用到的信息量就会减少。如果数据存在错误,考虑从源头纠正错误数据或删除该样本。在Python中可以用describe()函数方便地获取样本数量,变量均值,变量最小值、25%分位数、50%分位数、75%分位数、最大值等信息。
      

    data.describe()
    

    结果:

    在这里插入图片描述
      
    那根据describe得到的结果可以在建模中做什么?
      

    1. 甄别变量是否存在缺失值。count的结果是该变量中非空值的个数,如果某个变量count值和样本个数不等,说明该变量存在缺失值,样本个数和count值的差值即为该变量缺失值个数。
        
    2. 判断某个变量是否存在数据错误。由于describe中有变量最小值和最大值的信息,可以分析该值是否符合常识来判断变量是否正确。比如人的年龄不可能是个负数,如果年龄中存在负数说明该变量数据出现错误。
        
    3. 分析样本在某个变量上是不是有集中性。比如上图中历史最高逾期天数这个变量,从describe结果可发现50%分位数的值为0,75%分位数的值为1,最大值为44。说明50%以上的客户从未逾期,75%的客户从未逾期或逾期不超过1天,说明在该变量上,样本集中在没有逾期这一档。
        
    4. 分析好坏客户的样本分布是否差别很大。可以把数据集分成标签为1和0的子集,分别看子集中describe的结果。
        

      对外拓展感觉有说不完的注意事项,本文着重讲逻辑回归的实现,故后文不再在细枝末节处做过多说明。有小细节需要注意的地方,我会在后续文章中分专题详细阐述。在变量缺失值处理好,并验证数据没有问题后。可以把数据集割分成训练集、测试集、验证集。由于本文中的标签1只有97个,再细分可能出现1过少,导致信息过少,不满足统计特性。故不区分训练集、测试集、验证集,直接把所有数据都当成训练集。接下来我们一起挑选重要变量,建立逻辑回归模型。

      

    2.4 用IV挑选变量

      
      挑选变量的方法多种多样,可以用IV、GBDT、随机逻辑回归、随机森林、逐步回归、cluster等等(我在建模中实际用到)。本文采用信贷中最常用的方法IV进行阐述,其它方法会在本公众号后续挑选变量专题中进行详细阐述。对于用IV挑选变量,在风控建模中的IV和WOE一文中有详细的阐述,感兴趣的可以仔细阅读一遍,本文只引用计算函数。
      

    2.4.1 用等频分割的方法计算单个变量的IV值

      
    等频计算IV的函数如下:

    #等频切割变量函数
    def bin_frequency(x,y,n=10): # x为待分箱的变量,y为target变量.n为分箱数量
        total = y.count()       #1 计算总样本数
        bad = y.sum()           #2 计算坏样本数
        good = total-bad        #3 计算好样本数
        if x.value_counts().shape[0]==2:    #4 如果该变量值是0和1则只分两组
            d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.cut(x,2)}) 
        else:
            d1 = pd.DataFrame({'x':x,'y':y,'bucket':pd.qcut(x,n,duplicates='drop')})  #5 用pd.cut实现等频分箱
        d2 = d1.groupby('bucket',as_index=True)  #6 按照分箱结果进行分组聚合
        d3 = pd.DataFrame(d2.x.min(),columns=['min_bin']) 
        d3['min_bin'] = d2.x.min()               #7 箱体的左边界
        d3['max_bin'] = d2.x.max()               #8 箱体的右边界
        d3['bad'] = d2.y.sum()                   #9 每个箱体中坏样本的数量
        d3['total'] = d2.y.count()               #10 每个箱体的总样本数
        d3['bad_rate'] = d3['bad']/d3['total']   #11 每个箱体中坏样本所占总样本数的比例
        d3['badattr'] = d3['bad']/bad            #12 每个箱体中坏样本所占坏样本总数的比例
        d3['goodattr'] = (d3['total'] - d3['bad'])/good    #13 每个箱体中好样本所占好样本总数的比例
        d3['WOEi'] = np.log(d3['badattr']/d3['goodattr'])  #14 计算每个箱体的woe值
        IV = ((d3['badattr']-d3['goodattr'])*d3['WOEi']).sum()  #15 计算变量的iv值
        d3['IVi'] = (d3['badattr']-d3['goodattr'])*d3['WOEi']   #16 计算IV
        d4 = (d3.sort_values(by='min_bin')).reset_index(drop=True) #17 对箱体从大到小进行排序
        cut = []
        cut.append(float('-inf'))
        for i in d4.min_bin:
            cut.append(i)
        cut.append(float('inf'))
        WOEi = list(d4['WOEi'].round(3))
        return IV,cut,WOEi,d4
    

    先用如下语句整理好原始自变量和因变量:

    columns_x =[
     '7天内申请人在多个平台申请借款',
     '1个月内申请人在多个平台申请借款',
     '3个月内申请人在多个平台申请借款',
     '7天内借款人手机申请借款平台数',
     '1个月内借款人手机申请借款平台数',
     '3个月内借款人手机申请借款平台数',
     '7天内借款人身份证申请借款平台数',
     '1个月内借款人身份证申请借款平台数',
     '3个月内借款人身份证申请借款平台数',
     '7天内关联P2P网贷平台数',
     '1个月内关联P2P网贷平台数',
     '3个月内关联P2P网贷平台数',
     '7天内申请人关联融资租赁平台数',
     '1个月内申请人关联融资租赁平台数',
     '3个月内申请人关联融资租赁平台数',
     '1个月内申请人关联一般消费分期平台数',
     '3个月内申请人关联一般消费分期平台数',
     '风险名单占比',
     '一度关联节点个数',
     '二度关联节点个数',
     '一度风险名单个数',
     '二度风险名单个数',
     '一度风险名单占比',
     '二度风险名单占比',
     'X3个月内申请人手机号作为第二联系人手机号出现的次数',
     'X3个月内申请人手机号作为前三联系人手机号出现的次数',
     '是否命中法院执行模糊名单',
     '是否命中法院结案模糊名单',
     '是否命中手机风险关注名单',
     '是否命中身份证风险关注名单',
     '命中中风险关注名单笔数',
     '客户异常借款笔数',
     '信用异常笔数',
     '执行标的',
     '申请人执行标的是否超过100000',
     '3个月手机号关联身份证数',
     '3个月身份证关联手机号数',
     '三个月银行相关平台数'    
    ]                        #自变量名称
    X = data[columns_x]      #生成自变量数据框
    Y = data['y']            #生成因变量y
    

    再用调用等频法算IV的函数,计算单个变量的IV值,并打印结果。

    IV,cut,WOEi,d4 = bin_frequency(X['1个月内申请人在多个平台申请借款'], Y)
    print('IV=',IV)
    d4
    

    得到结果:

    2.4.2 用等频分割的方法批量计算IV值

      
      在变量one-by-one分析之前可以用等频切分的方法,快速算出所有变量的IV值,一般挑选IV值大于0.02的变量进入后续建模。可以用如下语句批量计算变量的IV值,并打印每个变量的分箱woe情况:

    ivs=[]
    for i in columns_x:
        print(i)
        IV,cut,WOEi,d4 = bin_frequency(X[i], Y)
        print('IV=', IV)
        ivs.append(IV)
        print(d4)
    

    得到结果:

    在这里插入图片描述
      
    可以用如下语句把所有变量的IV值汇总输出到csv文件中:
      

    IVi=pd.DataFrame({'name':columns_x, 'IV':ivs}).sort_values('IV',ascending = False)
    IVi.to_csv("IV.csv")
    

    得到结果(部分截图):

    在这里插入图片描述
      

      在用IV值大于0.02的规则挑选完变量后可以用相关性、vif、逐步回归等方法进一步挑选变量。:IV值多少可以进入模型,需要根据公司的数据情况进行调整,一般IV值低于0.02的变量几乎没有预测效果。如果很多变量的IV值都很高,阈值可以相应提高。如果变量整体的IV值都不高,根据业务逻辑也可以加一些IV值不是很高的变量测试模型效果。挑选好变量后可以调用sklearn中的lr函数建模。
      

    2.5 建立模型

    2.5.1 用挑选好的变量建立原始模型

      

    columns_model = ['1个月内借款人身份证申请借款平台数','7天内关联P2P网贷平台数','3个月内关联P2P网贷平台数','3个月手机号关联身份证数','3个月内申请人关联融资租赁平台数','二度风险名单个数','是否命中身份证风险关注名单','原始分','一度风险名单个数']X_model = data[columns_model]  #生成入模自变量y = data['y']                  #生成入模因变量                                  from sklearn.linear_model import LogisticRegression as lr #导入逻辑回归库lr_model_1 = lr()              #调用逻辑回归lr_model_1_y = lr_model_1.fit(X_model, y)                 #用样本数据训练逻辑回归模型y_proba_model_1 = lr_model_1_y.predict_proba(X_model)     #用训练好的模型预测y_proba_model_1
    

    注:本文为了不泄露公司的数据信息,挑选的变量已经经过数据替换,不是真实数据,只是为了数据展示。

    得到结果:

    在这里插入图片描述
    可以用如下语句得到模型的系数和截距:
      

    lr_model_1_coef = pd.DataFrame(lr_model_1_y.coef_)
    lr_model_1_coef.columns = columns_model
    

    得到结果:
      
    在这里插入图片描述在这里插入图片描述
      把拟合好的系数和截距代入逻辑回归函数中,得到的结果就是逾期的概率值。以上逻辑回归模型的训练直接采用默认参数,没有考虑样本不均衡的问题,可以在逻辑回归模型中引入参数class_weight,即lr(class_weight=‘balanced’)让因变量1的权重变高,0的权重变低。

      

    2.5.2 把挑选好的变量转成woe再建立模型

      
      在建完原始模型后一般要把变量转成woe后,再用逻辑回归训练一次变量,得到相应的系数。因为把变量转成woe后变量具有更好的鲁棒性,模型会更加稳定。比如年龄这个变量,如果不分箱转成woe,在客户从25岁变到26岁时评分可能完全不一样。而转成woe后变量是一个一个的小箱子,在箱子内值的变动不会对模型分产生影响。如果25到26刚好在一个箱子里,这个人的评分不会因为年龄的改变而发生变化。由于篇幅问题,在本文中只给转出转woe后建模的结果:
      
    在这里插入图片描述

      

    2.6 把模型转成评分卡的形式

      
      把变量转成woe后,可以根据分箱情况和逻辑回归的结果,通过转换把变量变成评分卡的形式:
      
    在这里插入图片描述
      
      其实在建模过程中,特征工程、数据准备、数据预处理、变量筛选、模型建立、模型评价、模型上线都是至关重要的。所有小的模块都会在后续文章中陆续发布,欢迎持续关注。为了更清晰地理解逻辑回归的求解和使用,建议对逻辑回归的推导过程有一个大致的了解。而且理解了逻辑回归的原理,有助于其它机器学习模型的学习。
      
      一直对逻辑回归,这个风控建模中必不可少的一员,抱有很大的敬意。逻辑回归三部曲的文章也从2月份断断续续准备到了4月份,今天终于和大家分享第三部-逻辑回归项目实战,如有偏颇的地方,或者有不懂的地方,大家可以加我的微信 阿黎逸阳进行咨询。本文纯属技术分享文档,帮助想要从事风控建模的朋友了解逻辑回归,所有文字都非商业用途,如果需要本文项目实战的数据可以到公众号中私信我,可以免费获取。
      
      之前由于工作需要,自己看了很多资料把逻辑回归的结果转成了评分卡的形式,写完了Python的实现函数,在接下来的时间我会好好总结评分卡的内容,争取评分卡的文章也早日和大家见面。
      
    参考文献

    https://zhuanlan.zhihu.com/p/30116307
    https://zhuanlan.zhihu.com/p/43492827
    https://zhuanlan.zhihu.com/p/59137998
    https://zhuanlan.zhihu.com/p/111260930
    https://baijiahao.baidu.com/s?id=1639202882632470513&wfr=spider&for=pc
    

    你可能感兴趣:
    用Python绘制皮卡丘
    用Python绘制词云图
    逻辑回归三部曲——逻辑回归和sigmod函数的由来
    逻辑回归三部曲——逻辑回归(logistics regression)原理-让你彻底读懂逻辑回归
    Python画好看的星空图V2版——添加背景图片和音乐

    长按(扫一扫)识别上方二维码学习更多Python和建模知识,让你的学习和工作更出彩。
    展开全文
  • 沿路径弯曲的文字

    千次阅读 2020-06-27 10:54:51
    我们可以使用SVG中内置的三个工具沿曲线流动文本: <path> , <text>和<textPath> 。 摘录 <svg viewBox="0 0 500 500"> <path id="curve" d="M73.2,148.6c4-6.1,65.5-96.8,178.6-...

    我们可以使用SVG中内置的三个工具沿曲线流动文本: <path><text><textPath>

    摘录

    <svg viewBox="0 0 500 500">
      <path id="curve" d="M73.2,148.6c4-6.1,65.5-96.8,178.6-95.6c111.3,1.2,170.8,90.3,175.1,97" />
      <text width="500">
        <textPath alignment-baseline="top" xlink:href="#curve">
          Dangerous Curves Ahead
        </textPath>
      </text>
    </svg>

    我们如何到达那里

    想象一下,我们在SVG中绘制一条曲线,并为其指定了一个名为curve的ID。

    请参阅CodePen上的Geoff Graham( @geoffgraham撰写的Pen NgwPYB

    然后,使用<text>标记将内容放入SVG中,并为其提供与SVG viewBox尺寸匹配的宽度。 我们还什么都看不到,但是我们知道文本在屏幕外的某个地方。

    CodePen上查看Geoff Graham( @geoffgraham撰写的Pen ZyaYOw

    我们真的很想看到该文本。 我们可以将文本包装在<textPath>标记中,并通过调用我们先前设置的路径ID将其设置为遵循弯曲路径的线。

    请参阅CodePen上的Geoff Graham( @geoffgraham撰写的Pen Kqywpe

    现在,我们正在用天然气烹饪!

    我们不希望看到该曲线,因此让该路径透明填充。 我们也可以在CSS中执行此操作,但出于此示例的目的,我们将其直接内联地应用到SVG标记中。

    请参阅CodePen上的Geoff Graham( @geoffgraham撰写的Pen xrPbgx

    剩下的就是CSS! 确切的字体大小将取决于文本本身以及所使用的字体系列,但是,一旦达到适当的平衡,SVG本身将处理响应能力,并确保所有内容均以任意比例停留在曲线上。

    见笔SVG的文本沿曲线路径由杰夫·格雷厄姆( @geoffgraham )上CodePen

    我们可以将相同的方法应用于任何类型的弯曲路径。

    见笔SVG的文本沿曲线路径由杰夫·格雷厄姆( @geoffgraham )上CodePen

    翻译自: https://css-tricks.com/snippets/svg/curved-text-along-path/

    展开全文
  • 全面设计与实现问答游戏项目 文字冒险游戏又称互动小说,游戏的交互是通过玩家输入的文字来展开剧情...课程的主要内容围绕着游戏逻辑展开,主要设计了输入与响应逻辑、房间Room逻辑文字指令、物品与背包和物品的...
  • 上传Excel的方法有一下几种一、前端处理Excel的两种方法1.利用js去解析Excel 当做字段或输入... 直接存到数据库临时表中,通过存储过程去操作后续逻辑2.利用POI去解析Excel文件 然后去数据库读取一些参数,在java...
  • 原型用于解决基本的人机文字交互功能,其中核心模块为文字分词、逻辑规则、智能交互,本文件有简单的模型构造及实现代码
  • vue 语音转文字使用例子和解析 第三方科大讯飞

    千次阅读 热门讨论 2020-10-12 11:23:05
    代码如下(示例): /** * Created by lycheng on 2019/8/1. * * 语音听写流式 WebAPI 接口调用示例 接口文档(必看):https://doc.xfyun.cn/rest_api/语音听写(流式版).html * webapi 听写服务参考帖子...
  • ubuntu使用教程

    万次阅读 多人点赞 2020-01-15 17:53:05
    ubuntu使用教程 一、 Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是...
  • Python 文字小游戏

    千次阅读 2019-08-17 17:59:27
    废话说一点,然后上代码 ** 游戏介绍: 1.3V3文字小游戏 2.三种角色,互相之间有克制 3.只有简单的逻辑,比如选择角色出场顺序只能输入数字1-3 import time, random class Role(): def __init__(self,name = '|...
  • 一、实验目的和要求 目的:锻炼我们对Qt的掌握和应用,锻炼实际解决问题,完成项目的能力。...用文字、图(流程图等)、表格等方式记录实验过程中分析、设计工作。 4.1 任务定义和问题分析 ...
  • 目录一、SQL 执⾏⼊口1.1 为 Mapper 接⼜创建代理对象1.2 执⾏代理逻辑1. 创建 MapperMethod 对象2. 执⾏ execute ⽅法二、 查询语句的执⾏过程2.1 selectOne ⽅法分析2.2 获取 BoundSql1.DynamicContext2. 解析 ...
  • 纯代码实现2048各种版本

    千次阅读 2016-03-27 20:48:36
    :一个卡片就是一个LayoutParams,上面放一个文本控件,这个类就是美化这个卡片的,颜色,显示的文字等,根据Config的配置信息显示不同的内容. AnimLayer :继承自FrameLayout.滑动特效:从一个点到另一个点,在其间产生...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    使用js实现这样的效果:在文本域里输入文字时,当按下enter键时不换行,而是替换成“{{enter}}”,(只需要考虑在行尾按下enter键的情况). 98 以下代码中end字符串什么时候输出 98 specify(‘hello,world’)//=>’...
  • 前端面试锦集

    千次阅读 多人点赞 2019-07-20 13:41:45
    它最大的优势就是组件化,这个框架可以把很多元素封装成组件,最后功能的开发变成了组件的拼装,极大的提高了代码的复用。 reactjs,boots TV,nodejs js出现点击上一个模块下一个模块同样被点击应如何处理...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    代码复杂度 版本管理 针对基础测试基础版本要进行充分的测试 验收前的最后一个版本一定要进行完全重复测试 测试方法 黑盒方法 功能问题 无法保证所有的代码逻辑都被执行到 白盒测试思想补充黑盒测试 静态测试方法 ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • 本教程按我自己方式写的,不一定对,但是是可以实现的,为了方便逻辑都写在了Controller层,我数据是静态的,可以自行数据库动态生成。 微信公众平台接口测试帐号申请: ... 内网穿透 ...
  • 使用kaptcha生产数字验证码录1引入依赖2编写容器配置类3生产验证码工具类4控制层逻辑5登陆页面设置6 访问你的登录接口测试 1引入依赖 <dependency> <groupId>com.github.axet</groupId> &...
  • Python练习题

    万次阅读 多人点赞 2017-02-10 11:12:40
    知乎上推荐GitHub上的Python练习题,算是用于巩固基础知识的加深熟悉python语言的良好方案,现将题目和答案做个总结。... 类似于图中效果答案:代码:#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time
  • 以下是代码:(先在.h文件里定义 MBProgressHUD *HUD;) [cpp]   view plain copy //方式1.直接在View上show   HUD = [[MBProgressHUD showHUDAddedTo:self.view...
  • 这是比nltk更全面的英文词典库,但是enchant将 They’re 这种缩略词也判定为英文单词,因此使用 isalpha() 函数加一层过滤,筛选掉含有标点符号的字符串,只保留英文字符串 import enchant from nltk.tokenize ...
  • hello,小伙伴们大家好,今天给大家推荐的开源项目是:plantuml,一个好的程序员在写代码之前会把架构理清楚,编码之前、设计先行、流程图/UML 图先行。我记得我刚刚开始工作的时候喜欢边想边写,后面遇到复杂的业务...
  • 1. Tensorflow 逻辑回归实现手写识别 ...在现实生活中,我们遇到的数据大多数都是非线性的,因此我们不能上一章线性回归的方法来进行数据拟合。但是我们仍然可以从线性模型着手开始第一步,首先对输入的数据进行加权
  • 遇到一个需求,要手机扫描纸质面单,获取面单上的手机号,最后决定tesseract这个开源OCR库,移植到Android平台是tess-two Android平台tess-two地址:https://github.com/tesseract-ocr 我把手机号扫描的算法...
  • 那里的大多数手风琴都依赖JavaScript,主要是jQuery ,但是由于高级CSS3技术的广泛使用,我们还可以找到仅使用HTML和CSS的精美示例,从而可以在禁用JavaScript的环境中访问它们。 创建仅CSS的手风琴可能是一项...
  • 编写可读性代码的艺术

    千次阅读 2016-07-16 10:30:42
    但如果你接受了这个目标(像我们一样),我们可以肯定你会成为一个更好的程序员,会产生更少的缺陷,从工作中获得更多的自豪,并且编写出你周围人都爱代码。那么让我们开始吧! 第一部分表面层次的改进 ...
  • jsp 页面使用if,else逻辑判断

    千次阅读 2021-03-19 08:45:58
    页面之间传递值不免要用到if,else等逻辑判断,由于jsp页面不是后台java代码,所以直接在jsp页面中写if,else等逻辑判断不会起作用。 这里介绍jsp 页面使用if,else逻辑判断,网上有很多同类文章这里只做归纳总结和...
  • Android百度语音集成——文字转语音

    千次阅读 2018-12-05 11:35:50
    项目涉及文字转语音的需求,Android原生提供的TTS生成的语音太单调,机器声音太明显,故寻求第三方更好的支持,科大讯飞的语音包收费,百度语音免费而且不限制调用次数,主页鲜明说永久免费的智能语音开放平台,...
  • 代码 注释英语还是中文 如果您像我一样,则可能有经历过... 原因很明显,这段文字用纯英语写的,而不是像Javascript或(或称)C ++这样的编程语言。 即使是经验丰富的程序员也能更好地理解自然语言。 编...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,980
精华内容 9,992
关键字:

代码逻辑用纯文字