精华内容
下载资源
问答
  • 机器学习模型的分类 机器学习模型有两种形式:参数模型和无参数模型。它们的本质区 别是:参数模型假设函数f(x)有特定的形式,例如线性表达式,而无参 数模型则没有这个要求。 两者各有利弊: 参数模型的精度略差但...

    机器学习模型的分类

    机器学习模型有两种形式:参数模型无参数模型。它们的本质区 别是:参数模型假设函数f(x)有特定的形式,例如线性表达式,而无参 数模型则没有这个要求。

    两者各有利弊:

    • 参数模型的精度略差但可解释性强。很多情况下,由于限制了f(x)的 表达形式,所以参数模型的精确性可能会略差一些,但是好处是简单,可解释性强,例如逻辑回归模型。
    • 无参数模型可解释性差但更精确。相反,无参数模型可解释性差一 些,但是大多数情况下可能模型会更精确。

    参数模型:
    最简单的参数模型就是线性回归,在回归模型中,假定了f(x) 的形式如下: y=f(X)=w1x1+w2x2+w3x3+…+b 在这个模型中,w1,w2,w3…b 这些参数的值是需要利用算法估计出来的, 例如使用梯度下降法,寻找到让损失函数取得最小值的参数。逻辑回归 模型 也是属于参数模型。

    无参数模型:
    无参数模型中,f(x) 的形式 不是一个简单固定的函数,它的形式和 复杂 度 与 算法 和 数据 都有很大关系。无参数模型的一个典型例子就是 决策树。它的f(x) 的表现形式是一个树形结构的决策规则,可以翻译为 if…then… .这样的规则,下图是一个“ 是否要接一个offer ”的决策树 模型示意,其他的非参数模型还包含:K近邻,神经网络,支持向量机, 随机森林等算法。
    在这里插入图片描述

    模型输出结果

    逻辑回归模型为例,它的模型输出结果就是一些参数值:特征变量 的回归系数和截距,就是前面提到的参数模型的w1,w2,w3…b 的值

    • coef_ : 特征变量的回归系数,如果是二分类模型,shape是(1, n_features),如果是多分类模型,shape是(n_classes, n_features)
    • intercept_ : 截距,二分类模型shape是(1,),多分类模型shape是 (n_classes,)
    lr.intercept_   #截距
    

    在这里插入图片描述

    lr.coef_  #回归系数 即w1 w2 ...w40
    

    在这里插入图片描述

     把变量名称和系数对应起来组合成dataframe
    coef = pd.DataFrame(list(zip(X_train.columns, np.transpose(lr.coef_))), 
                        columns=['columns', 'coef'])
    coef
    
    '''
    回归系数的绝对值大小可以反映特征变量对模型的重要性
    系数为正表示与分类模型的正例(类别=1)是正相关,
    即这些特征的乘客生还概率大;
    反之系数为负就表示生还概率小。
    '''
    

    在这里插入图片描述

    # 按照coef的值从高到底排序 
    coef = coef.sort_values(by =['coef'], ascending=False) 
    coef
    

    在这里插入图片描述

    模型的保存

    由于sklearn训练好的模型是 存储在内存 中的,如果内存清除了, 下次就需要再重新训练。一般训练模型的时间会比较长,所以我们会将 训练的模型进行 保存(持久化),然后需要用的时候再读取出来进行 评估和预测,这样可以节省大量的时间。

    有两种模型持久化的方法:
    • 使用python的pickle模块
    • 使用sklearn内部的joblib

    import pickle #python内置模块
    #将模块写入到lrmodel.pickle文件中
    with open('lrmodel.pickle', 'wb') as fw: 
        pickle.dump(lr, fw)
    

    模型加载

    # 通过pickle.load 加载 lrmodel.pickle文件,把读取出来的模型赋予一个新的对象new_lr
    with open('lrmodel.pickle', 'rb') as fr: 
        new_lr = pickle.load(fr)
    
    #通过type()查看new_lr,的确是一个LogisticRegression模型 
    type(new_lr)
    

    在这里插入图片描述

    #让我们用new_lr.predict()来对X_test预测一下 
    new_lr.predict(X_test)
    

    在这里插入图片描述
    第二种方法:

    # 使用 sklearn 的 joblib 
    # 保存和读取的流程和pickle基本一样的套路,就不赘述了,记得导包 
    from sklearn.externals import joblib 
    # 保存模型为文件 
    joblib.dump(lr, "lrmodel.m") 
    # 读取模型文件 
    new_lr2 = joblib.load("lrmodel.m") 
    # 预测 
    new_lr2.predict(X_test)
    
    展开全文
  • 对于在受监管行业中工作分析师和数据科学家来说,尽管机器学习可能会带来『能极大提高预测精度』这一好处,然而它可能不足以弥补内部文档需求以及外部监管责任所带来成本。对于实践者而言,传统线性模型技术可能...

    对于在受监管行业中工作的分析师和数据科学家来说,尽管机器学习可能会带来『能极大提高预测精度』这一好处,然而它可能不足以弥补内部文档需求以及外部监管责任所带来的成本。对于实践者而言,传统线性模型技术可能是预测模型中的唯一选择。然而,创新和竞争的驱动力并不因为你在一个受监管的模式下工作就会止息。在银行,保险以及类似受监管垂直领域里,数据科学家和分析师正面对着这样一个独一无二的难题:他们必须要找到使预测越来越精准的方案,但前提是,保证这些模型和建模过程仍然还是透明、可解释的。

    在这一节中所展现的技巧,有些使用了新型的线性模型,有些则是对传统线性模型做出改进所得到的方法。对于线性模型进行解释的技巧是高度精妙的,往往是有一个模型就有一种解释,而且线性模型进行统计推断的特性和威力是其他类型的模型难以企及的。对于那些对机器学习算法的可解释性心存疑虑而不能使用它们的实践者,本节中的技巧正适合他们。这些模型产生了线性、单调的响应函数(至少也是单调的!),和传统线性模型一样能保证结果是全局可解释的,但通过机器学习算法获得了预测精度的提高。

     

    普通最小二乘(Ordinary Least Square,OLS)回归的替代品

    受惩罚的回归(Penalized Regression)

    图7. 左图:经过L1/LASSO惩罚的回归系数处于缩小可行域中。右图:经过L2/岭回归惩罚的回归系数

    普通最小二乘法(Ordinary least squares,OLS)回归有着200年的历史。也许我们是时候该向前发展一点了?作为一个替代品,带惩罚项的回归技术也许是通往机器学习之路上轻松的一课。现在,带惩罚项的回归技术常常混合使用两种混合:为了做变量选择所使用的L1/LASSO惩罚,以及为了保证模型稳健性的Tikhonov/L2/ridge(岭回归)惩罚。这种混合被称为elastic net。相比OLS回归,它们对于数据所作出的假设更少。不同于传统模型直接解方程,或者使用假设检验来做变量选择,带惩罚项的回归通过最小化带约束的目标函数,来找到给定数据集中的一组最优回归系数。一般而言,这就是一组表征线性关系的参数,但是针对『给共线性或者无意义自变量以较大的回归系数』这一点,模型可以加以一定的惩罚。你可以在统计学习基础(Elements of Statistical Learning, ESL)一书中学到关于带惩罚项回归的方方面面,但是在此,我们的目的只是要强调一下,你很可能需要尝试一下『带惩罚项的回归』这一模型。

    带惩罚项的回归被广泛地应用于不少研究领域,但是对于具有很多列,列数大于行数,列中存在大量多重共线性的商业业务数据集,它们仍然适用。L1/LASSO惩罚把无足轻重的回归系数拉回到0,能够选取一小部分有代表性的变量进行回归系数估计,供线性模型使用,从而规避了那些靠前向、后向、逐步变量选择法(forward, backward, stepwise variable selection)所带来的多模型比较困难的问题。Tikholov/L2/岭回归(ridge) 惩罚可以增加模型参数的稳定性,甚至在变量数目过多、多重共线性较强、重要的预测变量与其他变量存在相关性时也能保持稳定。我们需要知道的重点是:惩罚项回归并非总能为回归系数给出置信区间,t-检验值或者p-value(译者注:t-检验值和p-value都是检查模型显著有效性的统计量)。这些统计量往往只能通过额外花时间进行迭代计算,或者自助采样法(bootstrapping)才能得到。

    广义加性模型(Generalized Additive Models, GAMs)

    图8. 使用广义加性模型对多个自变量建立样条函数

    广义加性模型能够通过对一部分变量进行标准线性回归,对另一部分变量进行非线性样条函数的拟合的方式,手动调整模型,让你在递增的模型精度和递减的模型可解释性之间找到一个权衡。同时,大部分GAM能够方便地为拟合好的样条函数生成图形。根据你所承受的外部监管或者内部文档要求的不同,你也许可以在模型中直接使用这些样条函数来让模型预测的更准确。如果不能直接使用的话,你可以用肉眼观测出拟合出的样条函数,然后用更具可解释性的多项式函数、对数函数、三角函数或者其他简单的函数应用于预测变量之上,这样也能让预测精度提高。同时,你也可以靠查阅《统计学习基础》(Elements of Statistical Learning)加深对GAM的理解。

    分位数回归

    图9. 将分位数回归绘制为二维图表

    分位数回归让你能够使用传统可解释的线性模型对训练数据的分位点进行回归。这种回归允许你对不同的消费者市场细分或者不同账户投资组合行为细分,建立不同的模型,你可以使用不同的预测变量,也可以在模型中给予预测变量不同的回归系数。对低价值客户和高价值客户使用完全不同的两套预测变量和回归系数听上去还算合理,分位数回归对这种做法提供了一套理论框架。

    回归的这些替代品提供的是全局性的还是局部性的可解释性?

    回归的替代品往往能够提供全局可解释的函数,这些函数是线性的、单调的,根据其回归系数的大小以及其他传统回归的评估量、统计量,具备可解释性。

    作为回归的替代品,这些回归函数的复杂程度如何?

    这些回归函数一般来说是线性的、单调的函数。不过,使用GAM可能导致相当复杂的非线性响应函数。

    这些技术如何帮我们提高对模型的理解?

    比较少的模型假设意味着比较少的负担,可以不使用可能带来麻烦的多元统计显著性检验而进行变量选择,可以处理存在多重共线性的重要变量,可以拟合非线性的数据模式,以及可以拟合数据条件分布的不同分位点(这可不止是拟合条件分布),这些特性都可能让我们更准确的理解模型所表征的现象。

    回归函数的这些替代品如何提高模型的可信度?

    基本上,这些技巧都是值得信任的线性模型,只是使用它们的方式比较新奇。如果在你的线上应用中这些技巧带来了更精确的预测结果,那么我们就可以更加信任它们。

     

    为机器学习模型建立基准测试模型

    图10. 考虑交叉效应的线性模型与机器学习模型比较,并绘制评估图

    机器学习算法和传统线性模型的两个主要区别,一个是机器学习算法在预测时引入了很多变量的高阶交叉作用,并不直观,另一个是机器学习算法会产生非线性、非多项式、非单调甚至非连续的响应函数。

    如果一个机器学习算法的预测表现碾压了传统线性模型,我们可以对自变量和目标变量建立一磕决策树。在决策树相邻层的分叉所使用的变量,一般来说会有强交叉效应。我们可以试着把这些变量的交叉效应加入到线性模型中,甚至树的连续几层所涉及到变量的高阶交叉效应也可以加入进来。如果一个机器学习算法较大地超越了传统线性模型,我们可以考虑把数据建模为分段线性的模型。为了要观察机器学习学到的响应函数如何受到一个变量各种取值的影响,或者要获得一些如何使用分段线性模型的洞见,可以使用GAM以及偏相关图。『多变量自适应回归样条法』,是一种可以自动发现条件分布中存在的复杂非线性部分,并对其不同区域分别进行拟合的统计手段。你可以尝试着直接使用多变量自适应回归样条法,对分段模型进行拟合。

    面向机器学习模型的基准测试模型能提供全局性还是局部性的可解释性?

    如果线性性和单调性能够得以保留,建模过程就会产生全局可解释的线性单调响应函数。如果使用分段函数,对机器学习模型建立基准测试可以放弃全局解释性,转而寻求局部可解释性。

    面向机器学习模型的基准测试模型能够生成什么复杂度的响应函数?

    如果谨慎、克制的建立面向机器学习模型的基准测试模型,并加以验证,对机器学习模型建立的基准模型可以维持像传统线性模型那样的线性性和单调性。然而,如果加入了太多的交叉效应,或者是在分段函数中加入了太多小段,将会导致响应函数依然极端复杂。

    面向机器学习模型的基准测试模型如何提升我们对模型的理解?

    这种流程把传统、可信的模型用出了新花样。如果使用类似GAM,偏相关图,多元自适应回归样条法这些技巧进行更进一步的数据探索,对机器学习模型建立相似的基准测试模型,可以让模型的可理解性大大提高,对数据集中出现的交叉效应以及非线性模式的理解也会加深。

    面向机器学习模型的基准测试模型如何提高模型的可信度?

    这种流程把传统、可信的模型用出了新花样。如果使用类似GAM,偏相关图,多元自适应回归样条法这些技巧进行更进一步的数据探索,通过建立面向机器学习模型的基准测试模型,能够让这些模型更准确地表达出数据集中我们感兴趣的那部分模式,从而提高我们对模型的信任程度。

     

    在传统分析流程中使用机器学习

    图11. 在传统分析流程中,使用机器学习的几种可能的方式,以图形呈现

    相较于直接使用机器学习的预测来做分析决策,我们可以通过一些机器学习的技术,对传统分析的生命周期流程(比如数据准备加模型部署)进行一些增强,从而有潜力达到比满足监管的线性、单调性的模型精度更高的预测。图11简要描述了三种可能的场合,在这些场合中,传统分析流程靠着机器学习的加持得以增强效果:

    在传统的线性模型中,加入(加工过的)复杂自变量:

    把交叉效应、多项式函数或者把变量经过简单函数的映射加入到线性模型中算得上是标准做法了。机器学习模型可以产生各种各样非线性、非多项式的自变量,甚至还能表征原有自变量之间存在的高阶交叉效应。产生这些自变量的方法有不少选择。例如,从自编码机神经网络中提取非线性特征,或者从决策树的叶子节点中获得最优化分箱。

    使用多个带门限的线性模型:

    根据重要的数据属性,或者根据不同的时间段对数据分成小组,再对每一个小组分别建模,可以获得更准确的模型。对于一个企业而言,同时部署多个线性模型来处理不同的细分市场数据,或者处理不同年份的数据,这类情况也并非少见。要决定如何手动融合这些不同的模型,对于数据分析师和数据科学家而言是个琐碎的活计。不过,如果关于历史模型表现的数据也能收集起来的话,这个流程就可以实现自动化:建立一个门限模型,让它来决定在遇到观测点时,究竟使用哪个线性模型来对它进行预测。

    预测线性模型的退化行为:

    在大部分情况下,模型是根据静态数据快照建立的,它们会在后来的数据快照上进行验证。尽管这是一种被广泛采纳的实践方式,但是当训练集、验证集数据所代表的真实世界中的数据模式发生变化时,这样做会导致模型发生退化。当市场中的竞争者进入或者退出,当宏观经济指标发生变动,当客户追逐的潮流发生了改变,或者其他各种因素发生时,都可能引起这种退化。如果关于市场、经济指标和旧模型表现的数据能够被上收上来,我们就可以基于此数据另外建立一个模型,来预估我们所部署的传统模型大概多久需要重新训练一次(译者注:仅调整模型参数),或者多久需要被全新的模型(译者注:模型结构发生了改变)所替代。就像在需要保养之前就替换掉一个昂贵的机械部件一样,我们也可以在模型的预测效力降低之前就进行重新训练,或者以新模型取而代之。(我之前写过一遍文章是有关应用机器学习时导致的验证误差,以及如何正确地在真实世界中使用机器学习的。)

    当然,还有很多在传统模型的生命周期中引入机器学习技巧的机会。你可能现在就已经有更好的想法和实践了!

    在传统分析流程中使用机器学习,能提供全局性还是局部性的可解释性?

    一般来说,这种方法致力于保持传统线性模型所具有的全局可解释性。然而,在线性模型中加入机器学习算法所生成的特征,会降低全局可解释性。

    在传统分析流程中使用机器学习,能产生何种复杂程度的响应函数?

    我们的目标仍然是继续使用线性、单调性的响应函数,不过是以一种更加有效、更加自动化的方式来实现这一目的。

    在传统分析流程中使用机器学习,如何帮助我们更好的理解数据?

    在传统分析流程中引入机器学习模型的目的,是为了更有效、更准确地使用线性、可解释的模型。究竟是什么驱动力导致了数据表现出非线性、时间趋势、模式迁移?如果在线性模型中引入非线性项,使用门限模型,或者预测模型失效等等手段能够让你更深入地掌握这种知识的话,那么对数据的理解自然就加深了。

    在传统分析流程中使用机器学习,如何让我们更加信任模型?

    这种手段使我们可以理解的模型更加精确。如果对特征的增加确实导致了精度提升,这就暗示着数据中的关联现象确实以一种更可靠的形式被建模。

     

    对可解释的模型进行小型的模型集成(ensemble)

    图12. 一个小型、堆叠的集成算法图

    很多企业如此擅长使用传统的线性模型建模技巧,以至于他们几乎无法再对单独某一个模型压榨出更高的精度。一种在不太损失可解释性的条件下提高精度的可能办法是,把数个已经理解透彻的模型组合起来进行预测。最终预测结果可以是对这些结果简单取平均,手动对它们进行加权,或者用更复杂的数学方式组合起来。举例说明,针对某种特定用途,总体表现最好的模型,可以和那些处理极端情况特别好的模型组合起来。对一名数据分析师或者数据科学家而言,他们可以通过实验来决定为对每一个模型选取最优加权系数进行简单集成;为了保证模型的输入和预测仍然满足单调性关系,可以使用偏相关图进行确认。

    如果你倾向于,或者需要使用一种更严格的方式来整合模型的预测,那么『超级学习器(super learners)』是一个很棒的选择。在上世纪90年代早期,Wolpert介绍了『堆叠泛化法』(stacked generalization),超级学习器是它的某种实现。堆叠泛化法使用了一种组合模型来为集成模型中的每个小部分赋予权重。在堆砌模型时,过拟合是个很严重的问题。超级学习器要求使用交叉验证,并对集成模型中各个部分的权重加上约束项,通过这种方法来控制过拟合,增加可解释性。图12的图示表明,两个决策树模型和一个线性回归模型分别交叉验证,并且通过另外一个决策树模型把它们堆叠在一起。

    可解释模型的小型集成提供了局部性还是全局性的可解释性?

    这种集成可以增加精度,但是它会降低全局可解释性。这种集成并不影响其中的每一个小模型,但是集成在一起的模型会难以解释。

    可解释模型的小型集成产生了何种复杂程度的响应函数?

    它们会导致很复杂的响应函数。为了确保可解释性,使用尽可能少的模型进行集成,使用模型的简单线性组合,以及使用偏相关图来确保线性、单调性关系依然存在。

    可解释模型的小型集成怎样让我们更好的理解数据?

    如果这种把可解释模型组合在一起的流程能够让我们对数据中出现的模式更熟悉、更敏感,对未来数据进行预测、泛化时能够有所裨益,那么它就可以说是提高了我们对数据的理解。

    可解释模型的小型集成如何让我们对模型更加信任?

    这种集成让我们在没有牺牲太多可解释的情况下,对传统的可靠模型的精度进行一定的提升。精度提高意味着,数据中的有关模式以一种更可信、更可靠的方式被建模出来。当数个模型互为补充,做出符合人类预期或者领域知识的预测时,这种小型集成就显得更加可靠。

     

    单调性约束

    图13. 在神经网络中为数据和模型加入单调性约束的示意图

    单调性约束能够把难以解释的非线性、非单调模型转化成为高度可解释的、符合监管要求的非线性单调模型。我们之所以认为单调性很重要,是基于两个原因:

    监管方希望模型满足单调性。无论数据样本是如何的,监管方总是希望见到模型具有单调性的表现。比如,考虑信贷评分模型中的账户余额。账户余额高,倾向于代表着账户所有者更值得授信,低账户余额则代表着有潜在的违约风险。如果某一批特定的数据包含着的大量样本中,含有很多『储蓄账户余额高但贷款违约』的个体以及『储蓄账户余额低但正在还贷款』的个体,那么,基于这份训练数据进行机器学习学出的响应函数对于账户余额这个变量自然会是非单调的。监管方是不会对这种预测函数感到满意的,因为它和几十年来沉淀下来的领域专家的意见背道而驰,因而会降低模型本身或者数据样本的可信度。

    单调性能够令生成的『原因代码』保持一贯性。具有一贯性的原因代码生成一般被认为是模型可解释性的金标准。如果在一个信贷评分模型中,单调性得以保证,为信贷申请结果分析原因不但直观,而且能够自动化。如果某个人的储蓄账户余额低,那么他的信用水平自然也低。一旦我们能够保证单调性,对于一次授信决定(译者注:一般指拒绝授信)的原因解释可以根据最大失分法(max-points-lost)可靠地进行排序。最大失分法把一个个体放在机器学习所得到的、具有单调性的响应曲面上,并度量他和曲面上最优点(也就是理想的、可能具有最高信用水平的客户)的距离。这个人与理想客户之间,在哪个坐标轴(也就是自变量)距离最远,也就说明拒绝授信时,哪个负面因素最重要;而这个这个人与理想客户之间,在哪个坐标轴(也就是自变量)距离最近,也就说明这个原因代码产生的负面影响最不重要;根据这个人和『理想客户』的相对位置来计算,其他自变量的影响都排在这二者之间。在使用最大失分法时,单调性可以简单地确保我们能做出清晰的、符合逻辑的判断:在单调性模型下,一个在贷款业务中被授信的客户,其储蓄账户余额绝不可能低于一个被拒绝贷款的客户(译者注:在其他条件都接近的情况下)。

    在输入数据上加约束,以及对生成的模型加约束,都可以产生单调性。图13显示,仔细选择并处理非负、单调变量,把它们与单隐层神经网络结合使用,达到了使拟合系数始终为正的约束效果。这种训练组合产生了非线性、单调的响应函数,根据响应函数可以对『原因代码』进行计算;通过分析模型的系数,可以检测高阶交叉效应。寻找以及制造这些非负、单调的自变量的工作十分枯燥、费时,还需要手动试错。幸运的是,神经网络和树模型的响应函数往往能够在规避枯燥的数据预处理的同时,满足单调性的约束。使用单调性神经网络意味着可以定制化模型结构,使得生成模型参数的取值满足约束。对于基于树的模型来说,使用均匀分叉往往可以强制保证单调性:使用某个自变量分的叉上,总是能保证当自变量取值往某个方向前进时,因变量在其所有子节点上的平均值递增;自变量取值往另一个方向前进时,因变量在其所有子节点上的平均值递减。在实践中,为不同类型模型实现单调性约束的方法千变万化,这是一种随模型而改变的模型解释性技术。

    单调性约束提供了全局性还是局部性的可解释性?

    单调性约束为响应函数提供了全局的可解释性。

    单调性约束能够导致何种复杂程度的响应函数?

    它们产生了非线性且单调的响应函数。

    单调性约束如何让我们更好的理解数据?

    它不仅可以确保『原因代码』能够自动化地生成,同时在特定场景下(比如使用单隐层神经网络或者单棵决策树时),变量之间重要的高阶交叉效应也能够被自动检测出来。

    单调性约束如何让模型更可信赖?

    当单调性关系、『原因代码』以及检测出的交叉效应能够简洁地符合领域专家意见或者合理预期的时候,模型的可信度会得以提升。如果数据中存在扰动时结果依然保持稳定,以及模型随着时间产生预料之内的变化的话,通过敏感性分析也能够提升模型的可信度。

    转载于:https://www.cnblogs.com/wmx24/p/9356937.html

    展开全文
  • 机器学习模型上线主要分为两种方式,一种是基于HTTP服务方式,这种方式需要在生产环境上部署相应python环境以及相应python机器学习包,这种方式好处在于将数据预处理部分和模型部分(保存成pkl文件)都能一起...

    一、机器学习模型上线两种方式

    机器学习模型上线主要分为两种方式,一种是基于HTTP服务方式,这种方式需要在生产环境上部署相应的python环境以及相应的python机器学习包,这种方式好处在于将数据预处理部分和模型部分(保存成pkl文件)都能一起部署在HTTP服务中,缺点则是需要在生产上部署相应的python环境;而另一种方式则是通过PMML方式将机器学习模型打包给java环境使用,这种方法好处在于能使生产环境脱离python环境,只需要有java环境即可,但是最大的缺点就是不能将数据预处理部分自己编写的数据处理函数打包成PMML文件,因为PMML文件是用sklearn2pmml导出的,因此它只认识sklearn家族中的函数和模型算法。

    二、HTTP服务上线脚本

    #
    #!coding=UTF-8    
    from http.server import HTTPServer,BaseHTTPRequestHandler    
    import io,shutil,urllib    
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    def companyinformationinput(companyname,entType,termDuration,startDuration,numberEmployers,numberEmployees,numberBranches,ratioProvident):
        import numpy as np
        import pandas as pd
        try:
            predData=pd.DataFrame()
            predData['企业名称(entName)']=[companyname]
            predData['企业类型(entType)']=[entType]
            predData['营业时长']=[int(termDuration)]
            predData['成立时长']=[int(startDuration)]
            predData['所有股东人数(employees)']=[int(numberEmployers)]
            predData['主要人员数(employees)']=[int(numberEmployees)]
            predData['分支机构数(branches)']=[int(numberBranches)]
            predData['单位比例']=[float(ratioProvident)]
            #读取自定义词典
            f = open('word2index.txt','r')
            word2index = f.read()
            word2index = eval(word2index)
            f.close()
            word2index
            #对企业类型编码,若企业类型从未出现过,则编码为0
            predData['企业类型(entType)']=[word2index[predData['企业类型(entType)'][i]] if predData['企业类型(entType)'][i] in word2index.keys() else 0 for i in range(len(predData['企业类型(entType)']))]
            predData1=pd.DataFrame(predData,columns=['企业类型(entType)', '营业时长', '成立时长', '所有股东人数(employees)','主要人员数(employees)', '分支机构数(branches)', '单位比例'])
            #导入保存好的模型
            from sklearn.externals import joblib
            classifier_RandomForest=joblib.load('classifier_RandomForestModelwordsvectornotin.pkl')
            #预测结果
            dictionnary={1:'A',2:'B',3:'C',4:'D'}
            y_pred=pd.Series(classifier_RandomForest.predict(predData1)).map(dictionnary)
            y_pred=y_pred[0]
        except:
    #        y_pred=['无此信息,请手工查询']*len(predData['企业名称(entName)'])
            y_pred='NULL'
    #    aaa=[]
    #    for i in range(len(predData['企业名称(entName)'])):
    ##        aaa.append('您所查询的企业:'+predData['企业名称(entName)'][i]+'类型为:'+y_pred[i]+'(仅供参考,如有疑问请手工查询)')
    #        aaa.append(y_pred[i])
        return y_pred
    
    
    #def randomforest(a,b):
    #    #模型加载
    #    X_test=np.arra
    

    三、PMML文件打包上线脚本

    from sklearn_pandas import DataFrameMapper, cross_val_score
    import sklearn.decomposition 
    from sklearn.feature_extraction.text import CountVectorizer
    import pandas as pd 
    import numpy as np 
    import xgboost as xgb 
    import random 
    import os 
    from datetime import date,datetime 
    from sklearn.linear_model import LogisticRegression 
    from sklearn.svm import SVC 
    from sklearn.metrics import roc_curve,roc_auc_score 
    from sklearn.model_selection import train_test_split 
    from sklearn.preprocessing import Normalizer
    from sklearn.preprocessing import StandardScaler as SS 
    from sklearn.preprocessing import MinMaxScaler as MM 
    from sklearn.preprocessing import LabelEncoder
    from sklearn.preprocessing import LabelBinarizer as LB 
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.externals import joblib 
    from sklearn_pandas import DataFrameMapper
    from sklearn2pmml import PMMLPipeline
    import pandas as pd
    from sklearn.preprocessing import FunctionTransformer
    from sklearn.ensemble import RandomForestClassifier
    from sklearn2pmml import sklearn2pmml
    
    import sys
    sys.path.append('E:\Java')
    sys.path.append('E:\Java\jdk1')
    sys.path
    
    
    heart_data=pd.read_csv("heart.csv")
    
    
    class A:
        def fit(self,X,params):
            pass
        def transform(self,X):
            return 3*X
    
    
    
    pipeline2 = PMMLPipeline([("test", A())])
    pipeline2.fit(2)
    pipeline2.transform(2)
    
    
    #aa=A()
    #aa.fit(5,10)
    #aa.transform(5)
    
    
    
    #用Mapper定义特征工程
    mapper = DataFrameMapper([
        (['sbp'], MM()),
        (['tobacco'], MM()),
        ('ldl', None),
        ('adiposity', None),
    #    (['famhist'], LB()),
        ('typea', None),
        ('obesity', None),
        ('alcohol', None),
        (['age'], FunctionTransformer(np.log)),
    ]) 
    
    #用pipeline定义使用的模型,特征工程等
    pipeline = PMMLPipeline([
       ('mapper', mapper),
    #   ("classifier", RandomForestClassifier())
    ])
    
    
    pipeline.fit(heart_data[heart_data.columns.difference(["chd","famhist"])])
    aaa=pipeline.transform(heart_data[heart_data.columns.difference(["chd","famhist"])])
    
    sklearn2pmml(pipeline,"aaa.pmml",with_repr=True)  
    
    
    pipeline1 = PMMLPipeline([
    #   ('mapper', mapper),
       ("classifier", RandomForestClassifier())
    ])
    
    pipeline1.fit(heart_data[heart_data.columns.difference(["chd","famhist"])],heart_data["chd"])
    aaa=pipeline1.predict(heart_data[heart_data.columns.difference(["chd","famhist"])])
    
    mapper.transformed_names_
    
    sklearn2pmml(pipeline1,"bbb.pmml",with_repr=True)  
    

    在上面代码代码中,不能对自己定义的数据预处理函数进行sklearn2pmml的输出,因为sklearn2pmml是sklearn中的家族,所以不认识上面mapper数据预处理中自己定义的A类中的函数,如果是sklearn下面的一些数据预处理函数,它可以导出为pmml文件;如果不考虑导出pmml文件,只是对数据在python环境下进行离线处理,则可以用自定义的A类函数并嵌入在mapper和pipeline中使用。

    展开全文
  • 主题建模是自然语言处理(NLP)中用于训练机器学习模型的一种方法。它是指从文档中逻辑地选择属于某个主题的单词的过程。从业务的角度来看,主题建模提供了极大的节省时间和精力的好处。例如,想要确定改进之处的公司...

    主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型。

    主题建模是自然语言处理(NLP)中用于训练机器学习模型的一种方法。它是指从文档中逻辑地选择属于某个主题的单词的过程。

    从业务的角度来看,主题建模提供了极大的节省时间和精力的好处。例如,想要确定改进之处的公司可以进行一项调查,要求用户对他们的服务进行评级,并解释每个评级。主题模型可以通过将信息归类到诸如“评级较低的最常见原因”这样的主题来快速跟踪这种分析。

    主题建模技术

    主题建模是关于几个词之间的逻辑关联。比方说,一家电信运营商想要确定糟糕的网络是否是客户满意度低的一个原因。这种情况下 “不良网络”就是主题。分析文档中像“坏”,“慢速”,“呼叫未连接”等词,这些词更有可能描述网络问题,需要排除掉像“或”、“和”等常见无意义的词汇。

    主题建模最常用的三种技术是:

    1. 潜在语义分析(LSA)

    潜在语义分析(LSA)的目的是利用词语周围的上下文,以捕获隐藏的概念或主题。LSA最初是用在语义检索上,为了解决一词多义和一义多词的问题。

    在这种方法中,机器使用Term Frequency- inverse Document Frequency (TF-IDF)来分析文档。TF-IDF是一种反映一个词在语料库中对一个文档的重要性的数字统计。

    为了能够解决这个问题,需要将词语(term)中的concept提取出来,建立一个词语和概念的关联关系(t-c relationship),这样一个文档就能表示成为概念的向量。这样输入一段检索词之后,就可以先将检索词转换为概念,再通过概念去匹配文档。

    3315f5d56ae477120efb8b8d78b9ca84.png

    假设有一个“m”文本文档的集合,每个文档共有“n”个独特的单词。TF-IDF矩阵- m*n -包含文档中每个单词的TF-IDF分数。然后这个矩阵被简化为“k”维数,k是所需的主题数。利用奇异值分解(SVD)进行约简。SVD矩阵分解成其他三个矩阵,如下图所示:

    9a5f06d04018b7729d95dc48221bdb2b.png

    这个分解通过方程a = USVT提供了整个集合中每个文档中的每个单词术语的向量表示。

    通过对大量的文本集进行统计分析,从中提取出词语的上下文使用含义。技术上通过SVD分解等处理,消除了同义词、多义词的影响,提高了后续处理的精度。
    流程:
    (1)分析文档集合,建立词汇-文本矩阵A。
    (2)对词汇-文本矩阵进行奇异值分解。
    (3)对SVD分解后的矩阵进行降维
    (4)使用降维后的矩阵构建潜在语义空间

    利用余弦相似度法,SVD矩阵可以用来寻找相似的主题和文档。

    LSA的主要缺点:

    LSA可以处理向量空间模型无法解决的一义多词(synonymy)问题,但不能解决一词多义(polysemy)问题。因为LSA将每一个词映射为潜在语义空间中的一个点,也就是说一个词的多个意思在空间中对于的是同一个点,并没有被区分。

    特征向量的方向没有对应的物理解释。

    SVD的计算复杂度很高,而且当有新的文档来到时,若要更新模型需重新训练。

    此外,它还需要大量的语料库才能产生准确的结果。

    2. 概率潜在语义分析(pLSA)

    概率潜在语义分析(PLSA)模型其实是为了克服潜在语义分析(LSA)模型存在的一些缺点而被提出的。LSA 的一个根本问题在于,尽管我们可以把 Uk 和 Vk 的每一列都看成是一个话题,但是由于每一列的值都可以看成是几乎没有限制的实数值,因此我们无法去进一步解释这些值到底是什么意思,也更无法从概率的角度来理解这个模型。而寻求概率意义上的解释则是贝叶斯推断的核心思想之 一。引入概率潜在语义分析(pLSA),用概率模型代替奇异值分解(SVD)来解决LSA中的表示问题。

    pLSA用概率表示TF-IDF矩阵中的每个条目。

    655d2d63de747b3472a3d94e8eb8c0b9.png

    P(D,W) = P(D)∑P(Z|D)P(W|Z)提供了一个联合概率,表明基于主题分布的文档中找到某个单词的可能性有多大。

    P(D,W) =∑P(Z)P(D|Z)P(W|Z) -表示文档包含给定主题以及文档中某个单词属于给定主题的概率。

    3.潜在狄利克雷分配(LDA)

    潜在狄利克雷分配(LDA)是pLSA的贝叶斯版本。事实上,理解了pLSA模型,也就差不多快理解了LDA模型,因为LDA就是在pLSA的基础上加层贝叶斯框架,即LDA就是pLSA的贝叶斯版本。

    核心概念被狄利克雷分配所取代,其中分布是在一个单纯的概率上抽样。概率单纯形表示一组加起来等于1的数字。当集合由三个数组成时,称为三维狄利克雷分布。

    在 LDA 中,首先每一个文档都被看成跟有限个给定话题中的每一个存在着或多或少的关联性,而这种关联性则是用话题上的概率分布来刻画的, 这一点与 PLSA 其实是一致的。

    但是在 LDA 模型中,每个文档关于话题的概率分布都被赋予了一个先验分布,这个先验一般是用稀疏形式的狄利克雷分布表示的。 这种稀疏形式的狄利克雷先验可以看成是编码了人类的这样一种先验知识:一般而言,一篇文章的主题更有可能是集中于少数几个话题上,而很少说在单独一篇文章内同时在很多话题上都有所涉猎并且没有明显的重点。

    如何使用LDA?

    LDA模型主要用于对特定主题下的文档文本进行分类。对于每个文档,它构建一个主题并包含相关的单词,LDA建模。LDA被证明可以为主题建模用例提供准确的结果。但是,它首先需要对某些文件进行修改和预处理,如下所述:

    步骤1:选择合适的库文件

    根据任务的不同,使用以下库:

    Pandas:用于数据操作和分析的

    Genism:用于大型文档中的文档索引和相似度检索

    pyLDAvis:用于交互式主题建模可视化

    根据用例的不同,Parsivar和Hazm充当波斯语的NLP库


    步骤2:对数据进行预处理

    在被模型使用之前,文档必须通过以下每一个步骤进行预处理:

    Normalization -将文本转换为标准/规范形式

    Stemming-将一个单词缩减为它的词干/词根,没有后缀和前缀

    Stopwordremoval -删除不添加任何逻辑意义的单词

    Tokenization ——将文本分解为“tokens”,即单词和短语

    这有助于模型识别单词并将它们分配到正确的主题上。

    步骤3:构建字典

    预处理的输出文本用于构建字典和语料库,这些语料库反过来成为主题建模的LDA模型的输入。

    e5d65dec1375a110c395ec0a172a1929.png

    主题的数量(k)设置为10。在第一次运行时,其余参数被设置为“默认”。

    第四步:测试准确性

    相干矩阵用于检验模型的准确性。主题一致性是一种基于人类可解释性比较不同主题模型的度量方法。相干性得分“C_V”为主题的可解释性提供了一个数值。

    8efeebea8eceeb4717a2308113bd3b03.png

    在上图中,coherence得分为0.52。

    企业应该构建许多具有不同“k”值的LDA模型。正确的模式将拥有最高的连贯性得分。虽然选择高k值可以提供细粒度的子主题,但关键词的重复表明k值太大了。因此,正确的“k”值将最小化话题连贯性的快速增长。

    第五步:可视化的话题

    通过交互的pyLDAvis工具,可以更好地可视化主题的最佳数量。pyLDAvis显示主题的数量、重叠主题以及给定主题中包含的所有单词,以便用户采取必要的操作。

    f59f596a63b9b045cd3e06eeacc9258e.png
    15bfe51ea327248f9de6309a16ecc268.png

    第六步:优化主题

    在这一步中,超参数被调优以优化主题的数量。运行alpha(文档-主题密度)、k和beta(主题-词密度)的不同组合,计算它们的相干性得分。结合相干度最高的得分建立LDA模型。

    对于本文解释的LDA模型,最优参数为:

    Number of topics = 6

    Alpha = asymmetric

    Beta/eta = 0.31

    在用这些参数配置模型之后,可以测试它是否能够预测任何看不见的文本文档的主题。

    测试结果可视化如下:

    e96134dab2d86499d6565f81de21f5db.png

    因为这是狄利克雷分配,所有概率加起来是1。图上显示topic 1的值最高- 0.66,即文档属于topic 1的概率最高。

    读取LDA模型结果

    本文使用的LDA模型的相干性得分为0.52(如图6所示),说明该模型在主题建模方面表现得相当好。如果相干度得分为0.85及以上,则模型中出现过拟合的几率很高。

    LDA模型没有将主题标识为独立的单词。相反,它提供了最可能的主题的概率。因此,用户需要从模型提供的单词集确定一个逻辑主题,并将主题编号与用户标识的主题名称进行映射。这整个过程称为主题建模。

    结论

    LSA、概率LSA和LDA是三种常用的主题建模方法。由于LDA能够构建有效的字典并使用以前的学习来预测新文档集中的主题,因此它是高级主题建模的推荐模型。

    展开全文
  • 主题建模是自然语言处理(NLP)中用于训练机器学习模型的一种方法。它是指从文档中逻辑地选择属于某个主题的单词的过程。从业务的角度来看,主题建模提供了极大的节省时间和精力的好处。例如,想要确定改进之处的公司...
  • 机器学习Stacking模型融合

    万次阅读 2018-06-04 18:10:56
    最近学习模型融合方法,遇到了Stacking方法来解决模型融合问题,因此做了以下总结。 1.Stacking是什么? Stacking简单理解就是讲几个简单的模型,一般采用将它们进行K折交叉验证输出预测结果,然后将每...
  • 这种方案,在本次参加 QCon 大会时,Paypal的机器学习平台中也有所提及: PMML 预测模型标记语言(Predictive Model Markup Language,PMML)是一种可以呈现预测分析模型的事实标准语言。标准东西的好处就是,各种...
  • mlmodels:模型ZOO 该存储库是适用于Pytorch,Tensorflow,Keras,Gluon,LightGBM,Keras,Sklearn模型等的ZOO模型,具有轻量级功能接口,可包装对最新和最先进的深度学习,ML模型和超参数...mlmodels回购的好处
  • 机器学习之Softmax回归模型

    千次阅读 2018-03-04 17:59:15
    Softmax在机器学习中有非常广泛应用,但是刚刚接触机器学习的人可能对Softmax特点以及好处并不理解,其实你了解了以后就会发现,Softmax计算简单,效果显著,非常好用。我们先来直观看一下,Softmax究竟是什么...
  • 高多样性全卤代最终状态对于搜索标准模型以外物理而言是重要但困难最终状态。 一种强大搜索方法是寻找由于单个硬喷头内有多个硬质部分而具有意外子结构大型喷气弹。 在此搜索中估计背景一种方法是在量子色...
  • n元语法的好处是什么呢?多年来自然语言处理已经利用n元语法开发了预测序列行为的统计语言模型(language model)。序列行为涉及在包含多个X的序列中识别下一个X。例如,语音识别、机器翻译等。在给定前一个元素的...
  • 文章目录机器学习 模型评估一、评估指标1.网格搜索:2.K折交叉验证3.混肴矩阵二、如何评价模型1. 机器学习 模型评估 一、评估指标 1.网格搜索: 自定义超参数:学习率与正则化组合训练模型 超参数: a学习率 迭代...
  • 作者:zhanlijun ...针对这个问题参考了wiki解释: http://en.wikipedia.org/wiki/Feature_scaling。归一化后有两个好处:1)归一化后加快了梯度下降求最优解速度;2)归一化有可能提高精度”。 1 归
  • 我在算法中使用了Pipeline,Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处: 1. 直接调用fit和predict方法来对pipeline中所有...
  •  最近看的一些论文中发现了模型组合的好处,比如GBDT或者rf,都是将简单的模型组合起来,效果比单个更复杂的模型好。组合的方式很多,随机化(比如random forest),Boosting(比如GBDT)都是其中典型的方法,今天...
  • 最近看的一些论文中发现了模型组合的好处,比如GBDT或者rf,都是将简单的模型组合起来,效果比单个更复杂的模型好。组合的方式很多,随机化(比如random forest),Boosting(比如GBDT)都是其中典型的方法,今天...
  • 泛化误差一般是用来评估一个模型的好坏。 泛化性的下降一般体现在两个方面:overfitting(过拟合)underfitting(欠拟合) 评估方法分为三类:留出法,交叉验证法和自助法 留出法 直接把样本进行37分或28分(大部分...
  • 文章目录网格搜索K折交叉验证混淆矩阵单一实数评估指标一、 用一个实数去做评估,更清晰明了的说明问题二、查准率与查全率将查准率与查全率结合来判断模型的好坏:PR图三、真正率与假正率利用真正率假正率判断模型的...
  • Jordan)教授是机器学习领域神经网络大牛,他对深度学习、神经网络有着很浓厚兴趣。因此,很多提问问题中包含了机器学习领域各类模型,乔丹教授对此一一做了解释和展望。 首先被提到就是经典贝叶斯非...
  • 学习机器学习,除了上一篇提到的实实在在的好处外,在务虚方面同样受益。 学习模型运作原理,可以了解现实事物如何转化为数字并被计算,结果又如何映射回现实世界来影响我们的生活。 掌握机器学习相关知识,能为...
  • 最近看的一些论文中发现了模型组合的好处,比如GBDT或者rf,都是将简单的模型组合起来,效果比单个更复杂的模型好。组合的方式很多,随机化(比如random forest),Boosting(比如GBDT)都是其中典型的方法,今天...
  • 一元线性回归1.1公式表示:f(x)=wxi+b向量形式1.2线性回归模型的好处:简单、可理解1.3线性回归模型因变量是离散变量的处理方法:如果属性是离散的,有序的,则可以编码为0-1-2……,例如西瓜的甜度由不甜-稍甜-特...
  • 1年前给师弟写的 刚才整理资料看到了 放网上吧 如果有侵犯到大佬隐私 请私信我 ...那我就功利的讲讲学机器学习的好处:第一,容易写论文,只要有数据,只要会熟练运用各种算法模型,只要加一点针对数据的改进获得...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 355
精华内容 142
关键字:

机器学习模型的好处