神经网络

神经网络(neural network)是一种模拟人脑神经思维方式的数据模型,神经网络有多种,包括BP神经网络、卷积神经网络,多层感知器MLP等,最为经典为神经网络为多层感知器MLP(Multi-Layer Perception),SPSSAU默认使用该模型。类似其它的机器学习模型(比如决策树、随机森林、支持向量机SVM等),神经网络模型构建时首先将数据分为训练集和测试集,训练集用于训练模型,测试集用于测试模型的优劣,并且神经网络模型可用于特征重要性识别、数据预测使用,也或者训练好模型用于部署工程使用等。

神经网络案例

  • 1、背景

    本部分神经网络使用的‘鸢尾花分类数据集’进行案例演示,其共为150个样本,包括4个特征属性(4个自变量X),以及标签(因变量Y)为鸢尾花卉类别,共包括3个类别分别是刚毛鸢尾花、变色鸢尾花和弗吉尼亚鸢尾花(下称A、B、C三类)。

  • 2、理论

    神经网络的原理上,其可见下图。

    原理上,首先输入特征项X,即放入的自变量项,神经网络模型时,可将特征项X构建出‘伪特征’,比如输入的是性别、年龄、身高、体重等,其结合‘激活函数’构建出一些‘伪特征项’(即事实不存在,完全由模型构建的特征项,并且是无法解释的特征项),具体构建上,比如为线性激活函数时可直观理解为类似“y=1+2*x1+3*x2+4*x3+…”这样的函数)。并且构建‘伪特征项’可有多个层次(即‘隐层神经元’可以有多层,默认是1层),并且每个层次可以有多个神经元(默认是100)。最终由数学优化算法计算,得到输出,即预测项。

    通俗上看,即输入特征项X,然后经过1轮或多轮的‘伪特征’构建,并且由算法最优求解,得到输出项。结合神经网络的原理情况,其涉及以下参数,如下:

    参数 说明 参数值设置
    激活函数 处理输入和输出时的映射函数 identity : f(x) = x
    logistics : f(x) = 1 / (1 + exp(-x))
    tanh : f(x) = tanh(x)
    relu : f(x) = max(0, x)【默认】
    权重优化方法 神经网络的内部算法类型 lbfgs : quasi-Newton 牛顿法;
    sgd : 随机梯度下降法;
    adam : 机遇梯度下降法,在大数据集上表现较好【默认】
    L2正则化/惩罚系数 用来防止过拟合,正则化系数越大则正则化力度越大。 默认是0.0001
    最大迭代次数 若迭代次数达到该值时依然不收敛,则停止迭代。 默认200次
    优化容忍度 当模型的误差变化率小地该值的时候,结束模型构建。 默认0.001
    隐层神经元设置 包括层数和每层神经元个数 默认1层,神经元数量为100

    激活函数,即中间神经元如何得到的数学函数,通常是非线性函数,且通常使用relu项即可。权重优化方法上提供三种,分别是lbfgs,sgd和adam,默认使用机遇梯度下降法,权重优化方法用于最优权重值计算。“L2正则化惩罚系数”用于防止过拟合使用,该值越大时越容易带来更好的训练模型拟合,但‘过拟合’风险越高(即训练数据模型良好,但测试数据模型糟糕)。最大迭代次数和优化容忍度为算法内部结束的判断标准。

    隐层神经元设置上,层数越多模型越复杂,计算时间越长,但理论上层数越多模型拟合效果会越好,SPSSAU默认是一层。神经元个数(即‘伪特征数量’)上,该参数值越大时越容易带来更好的模型拟合效果,但同时也容易带来‘过拟合’效果,一般情况下建议神经元个数应该小于‘特征项个数’的2倍,比如本案例数据时仅为4个特征项,可将神经元个数最多设置为8;隐层神经元层次越多,神经元个数越多时,会让模型变的复杂并且计算时间越长,当特征项个数较多时,建议通过减少层数和神经元个数方式综合权衡(SPSSAU默认是一层,神经元个数为100)。

    除此之外,当权重优化方法为sgd或者adam时,可能涉及下述3个参数值(权重优化方法为lbfgs牛顿法时时不包括),如下:

    参数 说明 参数值设置
    初始学习率 控制更新权重的补偿,只有当solver=’sgd’ 或’adam’时使用。 默认是0.0001
    学习率优化方法 对学习率进行优化,用于权重更新,只有当solver为‘sgd’时使用。 constant法(默认),可选为invscaling和adaptive法
    Batch Size 随机优化的minibatches的大小 如果solver是‘lbfgs’,分类器将不使用minibatch,当设置成‘auto’,batch_size=min(200,n_samples)。
    自定义Batch Size Batch Size为自定义是输入的具体值 默认是200

    初始学习率为内部迭代过程中最优解移动的步长值,该值越大时计算越快,但容易找不到最优解,该值越小时计算越慢,但其更可能找到最优解。除此之外,还可对学习率进行优化,优化方法共有三种,默认使用constant法。

    Batch size指内部数学算法时每次用于训练数据的个数,比如训练数据有1000个,那么设置Batch size为100,神经网络内部算法会先用其中100个数据来训练,然后用另外100个训练,一直训练直至训练数据使用完。该参数值越小时,其会减少机器内存的使用,但通常神经网络运行时间会越长,该参数值默认为200和训练样本个数二者的较小值,如果训练数据较小时,建议自行设置该参数值为较小值,比如仅100个训练数据时,建议设置该值介于2 ~ 20之间,但过小的Batch size值会带来计算收敛太慢等问题,因而实际使用时,建议设置多个不同的batch size值进行对比选择使用。

  • 3、操作

    本例子操作如下:

    训练集比例默认选择为:0.8即80%(150*0.8=120个样本)进行训练神经网络,余下20%即30个样本(测试数据)用于模型的验证。为保持数据量纲统一,选择‘正态标准化’方式。但需要注意的是,本案例数据仅150个,用于训练的数据仅120个非常少,因而需要特别设置某些参数值。

    首先是batch size值,由于仅120个数据用于训练模型太少,因此batch size设置为10个(或者20个对比等)较好。其它参数暂默认,但第一次出来的模型非常糟糕,训练集数据f1-score仅为0.58,意味着该模型不可行。接着考虑隐层神经元这个重要的参数值,由于当前数据样本非常少,并且特征项很低,可以考虑‘让模型更复杂些’,即加大神经元层数,本次设置为3层,每层为100个神经元。最终训练数据评估效果良好,并且测试数据评估效果良好,意味着模型不存在‘过拟合’现象,模型可用。

    本案例设置参数如下:

  • 4、SPSSAU输出结果

    SPSSAU共输出5项结果,依次为基本信息汇总,训练集或测试集模型评估结果,测试集结果混淆矩阵,模型汇总表和模型代码,如下说明:

    参数 说明
    基本信息汇总 因变量Y(标签项)的数据分布情况等
    训练集或测试集模型评估结果 分析训练集和测试集数据的模型效果评估,非常重要
    测试集结果混淆矩阵 测试集数据的进一步效果评估,非常重要
    模型汇总表 模型参数及评估汇总表格
    模型代码 模型构建的核心python代码

    上述表格中,基本信息汇总展示出因变量Y(标签项)的分类分布情况,模型评估结果(包括训练集或测试集)用于模型的拟合效果判断,尤其是测试集的拟合效果,以及提供测试集数据的混淆矩阵结果;模型汇总表格将各类参数值进行汇总,并且在最后附录神经网络模型构建的核心代码。

  • 5、文字分析

    接下来针对最重要的模型拟合情况进行说明,如下表格:

    上表格中分别针对训练集和测试集,提供四个评估指标,分别是精确率、召回率、f1-scrore、准确率,以及平均指标和样本量指标等,训练数据时f1-score值为0.97,并且测试集数据也保持着0.94高分,二者比较接近,因而意味着应该不存在‘过拟合’现象,而且模型良好。

    接着进一步查看测试数据的‘混淆矩阵’,即模型预测和事实情况的交叉集合,如下图:

    ‘混淆矩阵’时,右下三角对角线的值越大越好,其表示预测值和真实值完全一致。上图中仅B类中2个样本被判断成C类,其余全部正确,意味着本次神经网络在测试数据上表现良好。最后SPSSAU输出模型参数信息值,如下表格:

    模型汇总表展示模型各项参数设置情况,最后SPSSAU输出使用python中slearn包构建本次神经网络的核心代码如下:

    model = MLPClassifier(activation='relu', alpha=1.0E-4, hidden_layer_sizes=(100,100,100), learning_rate='constant', learning_rate_init=1.0E-4, batch_size=20, max_iter=200, solver='adam', tol=0.001)

    model.fit(x_train, y_train)

  • 6、剖析

    涉及以下几个关键点,分别如下:

    • 神经网络时是否需要标准化处理?
    • 一般建议是进行标准化处理,因为神经网络中可能涉及距离计算,需要量纲化数据处理,通常使用正态标准化处理方式即可。

    • 保存预测值
    • 保存预测值时,SPSSAU会新生成一个标题用于存储模型预测的类别信息,其数字的意义与模型中标签项(因变量Y)的数字保持一致意义。

    • SPSSAU进行神经网络构建时,自变量X(特征项)中包括定类数据如何处理?
    • 神经网络时通常不会关注于数据类型本身,因为其原理上是对特征项进行非线性转换神经元,进而优先各类特征权重值,且其中间隐藏层变换过程后已经失去原始特征的实际意义,因而神经网络通常不关注数据类型。如果一定要处理,建议可对定类数据进行哑变量转化后放入,关于哑变量可 点击查看

    • SPSSAU中神经网络合格的判断标准是什么?
    • 机器学习模型中,通常均为先使用训练数据训练模型,然后使用测试数据测试模型效果。通常判断标准为训练模型具有良好的拟合效果,同时测试模型也有良好的拟合效果。机器学习模型中很容易出现‘过拟合’现象即假的好结果,因而一定需要重点关注测试数据的拟合效果。针对单一模型,可通过变换参数调优,与此同时,可使用多种机器学习模型,比如使用决策树、随机森林、支持向量机、神经网络等,综合对比选择最优模型。

    • 神经网络更多参考资料?
    • 更多关于神经网络的资料,可通过sklearn官方手册查看, 点击查看

    • 神经网络模型参数设置?
    • 神经网络模型时,参数设置非常重要,建议对batch size进行自定义(当权重优化方法为sgd或adam时,且选择batch size为custom,自定义batch size),并且设置隐层神经元层数及每层神经元个数(隐层神经元层数加大,每层神经元个数加大时均对模型有着拟合帮助,但会带来计算时间更长且模型更复杂带来‘过拟合’现象,正常情况下建议隐层神经元层数小于等于3)。如果出现‘过拟合’现象,可对L2正则化惩罚系数值进行设置(设置更大)。另外可对初始学习率参数值设置更多,以加快计算速度。

疑难解惑

  • 拟合指标出现R方值小于0等异常?
  • 机器学习时当出现指标异常比如R 方小于0,其从计算公式上是正常的,此时意味着该模型非常糟糕无法使用。除此之外可解释方差分EVS指标也会出现负数(在模型糟糕时)。

  • SPSSAU机器学习如何进行预测?
  • SPSSAU中默认带有数据预测功能,当特征项X有完整数据,但标签项(因变量Y)没有数据时,此时‘保存预测值’,SPSSAU会默认对此种情况进行预测。如下图中的编号9到12共4行数据,其只有X没有Y,那么保存预测值时,默认对该4行数据进行预测。机器学习的各方法(包括决策树/随机森林/KNN/贝叶斯/支持向量机和神经网络等)均遵从此规则。

  • SPSSAU机器学习中量纲归一化处理的具体规则情况?
  • SPSSAU中,机器学习时均具有归一化参数值,并提供正态标准化/区间化/归一化等方式。其原理是针对具有完整数据的特征项X分别进行处理。比如下图中是针对编号为2~12共计11项的4个X分别进行处理。

  • 机器学习中分类任务和回归任务的区别是什么?
  • 机器学习包括分类任务和回归任务,当标签项(因变量Y)为类别数据时,其为分类任务,比如研究X对于“贷款是否逾期”的预测作用,“是否逾期”这个分类数据,因而此时此为分类任务。如果因变量Y为定量数据,比如研究X对于“贷款金额”的预测作用,“贷款金额”为定量数据,因而为回归任务。决策树/随机森林/支持向量机和神经网络等时,SPSSAU默认会对因变量Y进行识别,并且自动选择分类任务或者回归任务。当然研究者可以在“更多参数设置”处进行选择设置。另外,KNN和贝叶斯这两项仅提供分类任务。

  • 机器学习时提示‘分类数据必须为整数’?
  • 机器学习包括分类任务和回归任务,如果是定量数据Y进行分类任务,此时系统会提示“分类数据必须为整数”。决策树/随机森林/支持向量机和神经网络等时,可通过“更多参数设置”处进行选择设置,以及KNN和贝叶斯这两项仅提供分类任务。

  • 分类任务和回归任务,输出拟合指标不同?
  • 如果是分类任务(即Y为类别数据),此时会输出比如准确率、精确率、召回率、F1-score等评估指标,但当Y为定量数据(此时为回归任务),那么则会输出比如R方值,RMSE均方误差根,MSE均方误差等指标用于评估模型质量。分类数据可计算其是否预测正确,但定量数据只能计算预测值与真实值的接近程度,因而二者输出指标并不相同。另提示:SPSSAU会自动结合Y的数据情况自动选择分类或回归任务,当然研究者可自行通过参数设置。

  • 如何将多个模型绘制ROC曲线对比优劣?
  • 如果涉及多个模型预测能力绘制ROC曲线,用于多个模型预测能力对比。建议按以下步骤进行:第1步是得到各个模型(比如神经网络模型、随机森林模型、二元logistic回归模型等)的预测值标题,该预测值可通过SPSSAU中‘保存预测值’参数选中后得到;第2步是将得到的预测值作为ROC曲线时的‘检验变量X’。此时绘制出来的ROC曲线则会有多条,分别表示各模型的预测值。与此同时,ROC曲线时的‘状态变量Y’为实际真实情况上的Y数据,并且该数据正常情况下为二分类(即仅包括2个数字即两个类别)。

  • 机器学习算法时保存数据集标识的意思是什么?
  • 选择‘保存数据集标识’后,SPSSAU会新生成一个标题,用于标识模型构建时训练集或测试集,使用数字1表示训练集,数字2表示测试集。如果后续分析时(比如绘制ROC曲线)只针对训练集,那么使用筛选样本功能,筛选出训练集后分析即可。

  • 如何将多个机器学习模型数据绘制ROC曲线?
  • 如果有多个机器学习模型后,需要对比模型优劣情况。建议按下述步骤进行。

  • 第1步:每个机器学习模型最后一次构建后,选中‘保存预测信息’,系统会生成类别的预测概率;

  • 第2步:将多个机器学习模型的某类别的预测概率值一并纳入作为X,以及将Y作为Y,进行ROC曲线【注意,放入的是某个类别的预测概率值】;

  • 第3步:设置ROC曲线时对应的分割点,需要注意的是,分割点一定要设置为放入的对应类别时预测概率值对应的数字。

  • 需要提示的是:预测概率是指某类别的预测概率值,二分类时只有两个数字,比如是和否(数字1和数字0表示),那么‘是’对应的预测概率值即为模型预测出‘是’的概率,‘是’和‘否’的概率加和一定为1。

  • 机器学习算法中保存预测信息具体是什么意思?
  • 如果选中保存预测信息,并且为分类任务时,SPSSAU会新生成两项标题,分别是预测类别和预测概率。预测类别是指最终预测出来Y的类别,预测概率是指预测出Y的每个类别对应的概率情况;事实上某个类别的预测概率相对最大时,此时预测类别就为该类别(比如Y有A/B/C共3个类别,某样本时3个类别的预测概率分别是0.4,0.5,0.1),那么预测类别则为B类别。

  • 预测类别标题名称类似为‘NeutralNetwork_Prediction_****’,以及预测属于每个类别概率标题名类似‘NeutralNetwork_Prediction_probability_****’。

  • 保存预测信息后,可进一步使用预测概率进行其它的分析或者处理,比如绘制ROC曲线等。

  • 为什么没有输出AUC指标及ROC曲线?
  • 如果是分类任务并且为二分类(Y为分类数据且为二分类,且参数上默认或者选择为分类任务),此时SPSSAU默认会输出ROC曲线及AUC指标等。如果是多分类(Y为分类数据且大于两类,且为分类任务),此时AUC指标的意义较小暂未输出,如果有需要,可按下述步骤进行。

  • 第1步:构建模型时先‘保存预测信息’,得到多个标题,每个标题对应1个类别时的预测概率;

  • 第2步:将某个类别(即1个标题)的预测概率作为X,Y为模型构建时的Y,并且ROC曲线时分割点设置为放入的类别项对应的数字;

  • 第3步:多个类别则重复进行多次,即得到每个Y类别标签的ROC曲线和AUC值等。