1 问题重述

1.1 问题背景

这是一个信息增长速度飞快的时代,人们获取信息的方式也更加多样化。随着网络和计算机技术的快速发展,如何对各种重要资料进行数据分析是应对变化发展的主要途径。公司在经营过程中积累了大量的数据,股份持有者需要对企业财务数据进行有效分析;很多金融网站每天都发布各上市公司的信息,所有公司的管理人员分析这些数据决定各种策略,投资者也分析这些数据进行有效合理的投资。现代的信息管理系统在公司的运营管理活动中广泛使用,但传统的公司财务统计表分析等方法已经难以满足管理者对信息发现的需要。
目前的财务分析是基于公司或部门收集的公司经营状况的各项指标数据或统计资料,这些信息可以形成财务报表的数据或报告,以便向财务部门的工作人员提供分析和研究。比较指标数据和往年的数据,可以分析现在公司的运营是否有异常,如有异常,具体分析哪方面有异常,根据分析的报告书来改善公司的经营战略。但是,传统的财务分析手段无法准确发现数据记录和报告指标之间的内在联系,无法充分利用这些资源的有效信息。作为一个专业投资者,要研究上市公司的财务数据是否可靠,可以对上市公司多年的财务数据报告进行数据挖掘,选定数据指标进行跟踪分析和研究,识别真伪,避免投资踩雷。

1.2 问题提出

  1. 根据附件1的行业分类,利用附件2所提供的相关上市公司的财务数据,确定出各行业与财务数据造假相关的数据指标,并分析比较不同行业上市公司相关数据指标的异同。
  2. 根据附件2中制造业各上市公司的财务数据,确定出第6年财务数据造假的上市公司。
  3. 根据附件2中其他(除制造业外)各行业上市公司的财务数据,确定出第6年财务数据造假的上市公司。

2 模型假设

(1) 假设所获取的数据是真实可靠的;
(2) 假设第6年未发生重大事件和灾难或国家未推行重要政策影响公司运营。

3 机器模型介绍

3.1 LASSO模型

LASSO是由1996年Robert Tibshirani首次提出,全称Least absolute shrinkage and selection operator。该方法是一种压缩估计,它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数绝对值之和小于某个固定值,同时设定一些回归系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。
LASSO是在RSS最小化的计算中加入一个 lpl_plp 范数作为惩罚约束。lpl_plp 范数的好处是当 λ\lambdaλ 充分大时,可以把某些待估系数精确地收缩到零。通过交叉验证法:对 λ\lambdaλ 的给定值,进行交叉验证,选取交叉验证误差最小的 λ\lambdaλ 值,然后按照得到的 λ\lambdaλ 值,用全部数据重新拟合模型即可。

3.2 Logistic模型

3.2.1 模型介绍

Logistic回归即对数概率回归,它的名字虽然叫“回归”,但却是一种用于二分类问题的分类算法,它用sigmoid函数估计出样本属于某一类的概率。概率的值为0~1,如果有这样一个函数:对于一个样本的特征向量,这个函数可以输出样本属于每一类的概率值,那么这个函数就可以用来作为分类函数,sigmoid函数(也称logistic函数)就具有这种性质,他的定义为:
h(z)=11+exp(−z)(1)h(z)=\frac{1}{1+exp(-z)}\tag{1}h(z)=1+exp(z)1(1)
这个函数的定义域为整个实数域,值域为(0,1),并且是一个单调的增函数。根据对分布函数的要求,这个函数可以用来作为随机变量 xxx 的分布函数,即:
p(x≤z)=h(z)(2)p(x\leq z)=h(z)\tag{2}p(xz)=h(z)(2)
直接将这个函数用于分类有问题,它是一个一元函数,在实际应用中特征向量一般是多维的。先用一个线性函数将输入向量 sss 映射成一个实数 zzz 即可,这样就得到如下预测函数:
h(x)=11+exp(−wTx)(3)h(x)=\frac{1}{1+exp(-w^Tx)}\tag{3}h(x)=1+exp(wTx)1(3)
其中,www为线性映射权向量,由训练算法决定。
样本属于正样本的概率为:p(y=1∣x)=h(x)p(y=1|x)=h(x)p(y=1x)=h(x) ;属于负样本的概率为:p(y=0∣x)=1−h(x)p(y=0|x)=1-h(x)p(y=0x)=1h(x)
其中,yyy为类别标签,取值为1或者0,分别对应正负样本。样本属于正样本和负样本概率值比的对数称为对数似然比:
lnp(y=1∣x)p(y=0∣x)=ln11+exp(−wTx)1−11+exp(−wTx)=wTx(4)ln\frac{p(y=1|x)}{p(y=0|x)}=ln\frac{\frac{1}{1+exp(-w^Tx)}}{1-\frac{1}{1+exp(-w^Tx)}}=w^Tx\tag{4}lnp(y=0x)p(y=1x)=ln11+exp(wTx)11+exp(wTx)1=wTx(4)
分类规则:如果正样本的概率大于负样本的概率,即:h(x)>0.5h(x)>0.5h(x)>0.5 。则样本被判定为正样本,否则被判定为负样本。这等价于:
h(x)1−h(x)=p(y=1∣x)p(y=0∣x)>1(5)\frac{h(x)}{1-h(x)}=\frac{p(y=1|x)}{p(y=0|x)}>1\tag{5}1h(x)h(x)=p(y=0x)p(y=1x)>1(5)
也就是下面的线性不等式:wTx>0w^Tx>0wTx>0,因此,logistic回归是一个线性模型。

3.2.2 正则化

在构造机器学习模型时,最终目的是让模型在面对新数据的时候,可以有很好的表现。机器学习中,如果参数过多,模型过于复杂,容易造成过拟合(overfit)。即模型在训练样本数据上表现的很好,但在实际测试样本上表现的较差,不具备良好的泛化能力。为了避免过拟合,最常用的一种方法是使用正则化,例如L1和L2正则化。简单来说,正则化是一种为了减小测试误差的行为。
L1正则化时,对应惩罚项为L1范数:
Ω(w)=∣∣w∣∣1=∑i∣wi∣(6)\Omega(w)=||w||_1=\sum_i|w_i|\tag{6}Ω(w)=w1=iwi(6)
L2正则化时,对应惩罚项为L2范数:
Ω(w)=∣∣w∣∣22=∑iwi2(7)\Omega(w)=||w||_2^2=\sum_iw_i^2\tag{7}Ω(w)=w22=iwi2(7)
从上式可以看出,L1正则化通过让原目标函数加上了所有特征系数绝对值的和来实现正则化,而L2正则化通过让原目标函数加上了所有特征系数的平方和来实现正则化。
两者都是通过加上一个和项来限制参数大小,却有不同的效果:L1正则化更适用于特征选择,而L2正则化更适用于防止模型过拟合。

3.3 支持向量机

3.3.1 模型介绍

支持向量机的目标是寻找一个分类超平面,它不仅能正确地分类每一个样本,并且要使得每一类样本中距离超平面最近的样本到超平面的距离尽可能远。假设训练样本有1个样本,特征向量xix_ixi是n维向量,类别标签yiy_iyixix_ixi取值为+1或-1,分别对应正样本和负样本。支持向量机为这些样本寻找一个最优分类超平面,首先要保证每个样本能正确分类,因此,分类超平面的约束为:
yi(wTxi+b)≥1(8)y_i(w^Tx_i+b)\geq1\tag{8}yi(wTxi+b)1(8)
目标函数是超平面离两类样本的距离要足够大,可以写成:
12∣∣w∣∣2(9)\frac{1}{2}||w||^2\tag{9}21w2(9)
再加上松弛变量 和惩罚因子 对违反不等式的样本进行惩罚,可以得到如下最优化问题:

3.3.2 核映射和核函数

如果样本线性不可分,可以对特征向量进行映射将它转换到更高维的空间,使得在该空间中线性可分,这种方法在机器学习中被称为核技巧。核映射 ϕ\phiϕ 将特征向量变换到更高维的空间:
z=ϕ(x)(11)z=\phi(x)\tag{11}z=ϕ(x)(11)
常用的核函数如下表 1所示。
表 1 常用的核函数

3.4 One Class SVM

3.4.1 OCSVM

基本上将所有的数据点与零点在特征空间 FFF分离开,并且最大化分离超平面到零点的距离。这产生一个binarybinarybinary 函数能够获取特征空间中数据的概率密度区域。当处于训练数据点区域时,返回+1,处于其他区域返回-1。
该问题的优化目标与二分类SVM略微不同,但依然很相似:

其中 ςi\varsigma_iςi表示松弛变量,vvv 类似于二分类SVM中的 ,同时:
1,vvv 为异常值的分数设置了一个上限(训练数据集里面被认为是异常的);
2,vvv 是训练数据集里面作为支持向量的样例数量的下界。
因为这个参数的重要性,这种方法也被称为 v−SVMv-SVMvSVM。采用 LagrangeLagrangeLagrange技术并且采用dot−productcalculationdot-product calculationdotproductcalculation ,确定函数变为:

这个方法创建了一个参数为ω,ρ\omega,\rhoω,ρ 的超平面,该超平面与特征空间中的零点距离最大,并且将零点与所有的数据点分隔开。
3.4.2 SVDD
SVDD采用一个球形而不是平面的方法,该算法在特征空间中获得数据周围的球形边界,这个超球体的体积是最小化的,从而最小化异常点的影响。
产生的超球体参数为中心 aaa 和半径 R>0R>0R>0 ,体积 R2R^2R2 被最小化,中心 是支持向量的线性组合;跟传统SVM方法相似,可以要求所有数据点 到中心的距离严格小于 ,但同时构造一个惩罚系数为 的松弛变量 ,优化问题如下所示:
在采用拉格朗日算子求解之后,可以判断新的数据点 zzz 是否在类内,如果 zzz 到中心的距离小于或者等于半径。采用 GaussianKernelGaussian KernelGaussianKernel作为两个数据点的距离函数:

3.5 随机森林

3.5.1 决策树

决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类情况,本质是一颗由多个判断节点组成的树,是通过训练数据并根据基尼系数的增益统计而来。
基尼系数表示数据集中样本的差异程度,基尼系数越大,表示数据集的种类越多样,即表示有多中的分类结果,表示数据集当前特征的越多样,即越不纯,即可能是一个多分类的问题。具体公式如下:
Gini(D)=1−∑k=1∣y∣(16)Gini(D)=1-\sum^{|y|}_{k=1}\tag{16}Gini(D)=1k=1y(16)
一般选择基尼系数最小的特征作为最初的根节点。在实际项目中根据定义的分类结果进行根节点的选择,通过统计训练样本的特征与类别,根据特征相对初始类别的基尼系数的增益决定之后每一步根节点的选择。
在计算基尼系数增益之前需要知道当对每个特征作为判断依据时的基尼指数,具体公式如下:
Giniindex(D,α)=∑v=1v∣Dv∣∣D∣Gini(Dv)(17)Gini_index(D,\alpha)=\sum^v_{v=1}\frac{|D^v|}{|D|}Gini(D^v)\tag{17}Giniindex(D,α)=v=1vDDvGini(Dv)(17)
基尼增益为:
Gini(D,α)=Gini_index(D,α)(18)Gini(D,\alpha)=Gini\_index(D,\alpha)\tag{18}Gini(D,α)=Gini_index(D,α)(18)
不断地对内部节点进行分类直至显示最终的分类结果为止。此时对样本训练完毕,当有新的样本来进行测试时我们根据当前模型进行预测。在实际工程中需要控制决策树的深度防止过拟合的情形,即在训练样本可以表现很好的性能,但是并不能保证测试样本的准确度,这在训练集很大的时候容易出现。
3.5.2 Bagging算法原理
Bagging基于自助采样法(bootstrap sampling)。给定包含 个样本的训练数据集 DDD,自助采样法是这样进行的:先从 DDD 中随机取出一个样本放入采样集 中,再把该样本放回 中(有放回的重复独立采样)。经过 NNN次随机采样操作,得到包含NNN 个样本的采样集DDD
注意:数据集 DDD中可能有的样本在采样集 DDD中多次出现,但是 DDD中也可能有样本在 DsD_sDs中从未出现。一个样本始终不在采样集中出现的概率是(1−1N)N(1-\frac{1}{N})^N(1N1)N 。根据:
lim⁡N→∞(1−1N)N=1e≈0.368(19)\lim_{N\to\infty}\left(1-\frac{1}{N}\right)^N=\frac{1}{e}\approx0.368\tag{19}Nlim(1N1)N=e10.368(19)
因此 DDD中约有63.2%的样本出现在了DsD_sDs 中。
Bagging首先采用 MMM轮自助采样法,获得 MMM个包含 NNN个训练样本的采样集。然后,基于这些采样集训练出一个基学习器。最后将这 MMM个基学习器进行组合。训练流程如下:
循环,对 i=1,2,...,Ti=1,2,...,Ti=1,2,...,T
对训练样本集进行Bootstrap抽样,得到抽样后的训练样本集,用抽样得到的样本集训练一个模型 hi(x)h_i(x)hi(x)
结束循环,输出模型组合h1(x),...,hT(x)h_1(x),...,h_T(x)h1(x),...,hT(x)
其中,TTT为弱学习器的数量。如果弱学习器是决策树,这种方法就是随机森林。

3.5.3 随机森林

随机森林(Random Forest,RF)是一种以决策树为基学习器的Bagging算法,传统决策树在选择划分属性时,每次选择一个最优属性,但是在BF在决策树的训练过程中引入了随机属性选择。
在RF中构建决策树,选择节点的划分属性时,首先从该节点的属性集合中随机选择一个包含kkk个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
如果 k=nk=nk=n(其中 nnn为当前节点的属性的数量),则RF中决策树的构建与传统决策树相同。如果k=1k=1k=1 ,则随机选择一个属性用于划分。通常建议 k=log2nk=log_2nk=log2n
RF的训练效率较高,因为RF使用的决策树只需要考虑一个属性的子集。另外,RF简单并且容易实现,计算开销小,而且它在很多现实任务中展现出强大的性能。
在随机森林中,每棵树构建时的样本都是由训练集经过有放回抽样得来的(例如,自助采样法(bootstrap sample))。此外,在树的构造过程中拆分每个节点时,可以从所有输入特征或大小为max_features的随机子集中找到最佳拆分。
这两个随机性的目的是减少森林估计器的方差。实际上,单个决策树通常表现出较高的方差并且倾向于过拟合。在森林中注入随机性来产生决策树,让其预测误差有些解耦。通过取这些预测结果的平均值,可以减少一些误差。随机森林通过组合不同的树来减少方差,有时会以略微增加偏差(bias)为代价。在实践中,由于方差的减小通常是很明显的,因此在总体上产生了更好的模型。
与上述相比,scikit-learn的实现是取每个分类器预测出的概率的平均,而不是让每个分类器对单个类别进行投票。

3.6 梯度提升树

梯度提升树模型是一种基于回归树的集成学习方法,它通过构造多个弱的回归树作为基学习器,并把这些树的结果累加起来作为最终的预测输出。因为其特征处理的简单性和优异的效果,梯度提升树模型被认为是传统统计学习中效果最好的方法之一。
梯度提升树算法是集成学习Boosting家族的一员,它在训练时采用前向分步算法,首先确定第一棵树拟合的值,然后基于之前所有树的误差来更新训练并训练下一棵树,一步一步迭代下去直到梯度提升树模型构建完毕。所以我们在训练时,首先确定初始提升树 f(x)=0f(x)=0f(x)=0,然后在后续训练时第 mmm步的模型是:
fm(x)=fm−1(x)+T(x;Θm)(20)f_m(x)=f_{m-1}(x)+T(x;\Theta_m)\tag{20}fm(x)=fm1(x)+T(x;Θm)(20)
其中,fm−1(x)f_{m-1}(x)fm1(x) 是当前模型,通过经验风险最小化确定下一棵数的参数 。
Θm=argmin∑i=1NL(yi,fm−1(x)+T(x;Θm))(21)\Theta_m=arg\ min\sum_{i=1}^NL(y_i,f_{m-1}(x)+T(x;\Theta_m))\tag{21}Θm=argmini=1NL(yi,fm1(x)+T(x;Θm))(21)
那么我们可以使用梯度下降法对以上式子进行求解,并得到梯度提升树的算法,下面是梯度提升树的算法:
输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)},x1∈X⊆Rn,y1∈Y⊆RnT=\left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N)\right\},x_1\in X\subseteq R^n,y_1\in Y\subseteq R^nT={(x1,y1),(x2,y2),...,(xN,yN)},x1XRn,y1YRn;损失函数 Cost(y,f(x))Cost(y,f(x))Cost(y,f(x))
过程:(1)初始化:f0(x)=argmin∑i=1NL(y,c)\displaystyle f_0(x)=arg\ min\sum^N_{i=1}L(y,c)f0(x)=argmini=1NL(y,c)
(2)对 m=1,2,...,Mm=1,2,...,Mm=1,2,...,M
(a)对 i=1,2,...,Ni=1,2,...,Ni=1,2,...,N,计算:γmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)\gamma_{mi}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]f(x)=f_{m-1}(x)γmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
(b)对 γmi\gamma_{mi}γmi拟合一个回归树,得到第 mmm棵树的叶节点区域 Rmj,j=1,2,...,JR_{mj},j=1,2,...,JRmj,j=1,2,...,J
(c)对 j=1,2,...,Jj=1,2,...,Jj=1,2,...,J,计算:cmj=argmin∑xi∈RmjL(yi,fm−1(xi)+c)\displaystyle c_{mj}=arg\ min\sum_{x_i\in R_{mj}}L(y_i,f_{m-1}(x_i)+c)cmj=argminxiRmjL(yi,fm1(xi)+c)
(d)更新 fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj\displaystyle f_m(x)=f_{m-1}(x)+\sum_{j=1}^Jc_{mj}I(x\in R_{mj}fm(x)=fm1(x)+j=1JcmjI(xRmj
(3)得到回归树 f^(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)\displaystyle \hat{f}(x)=f_M(x)=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x\in R_{mj})f^(x)=fM(x)=m=1Mj=1JcmjI(xRmj)
输出:回归树 f^(x)\hat{f}(x)f^(x)

3.7 XGBoost

XGBoost 是Boosting Tree的一种实现,它对损失函数进行了二阶泰勒展开, 同时用到了一阶和二阶导数,并引入了适用于树模型的正则项用于控制模型的复杂度。XGBoost的正则项里包含了树的叶子节点个数、每个叶子节点输出分数的 L2L2L2平方和。
L~(t)=∑i=1nl(yi,y^i(t−1)+ft(Xi))+Ω(ft)+常数(22)\displaystyle\tilde{L}^{(t)}=\sum^n_{i=1}l\left(y_i,\hat{y}_i^{(t-1)}+f_t(X_i)\right)+\Omega(f_t)+常数\tag{22}L~(t)=i=1nl(yi,y^i(t1)+ft(Xi))+Ω(ft)+(22)
对上式用泰勒展开可以将目标函数转化为:
L~(t)≃∑i=1nl(yi,y^i(t−1)+ft(Xi))+Ω(ft)+常数=∑i=1n[giwq(xi)+12hiwq2(xi)]+γT+12λ∑j=1T=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2]+γT(23)\displaystyle\tilde{L}^{(t)}\simeq\sum^n_{i=1}l\left(y_i,\hat{y}_i^{(t-1)}+f_t(X_i)\right)+\Omega(f_t)+常数\\\quad\ \ \quad=\sum^n_{i=1}\left[g_iw_q(x_i)+\frac{1}{2}h_iw_q^2(x_i) \right]+\gamma T+\frac{1}{2}\lambda\sum^T_{j=1}\\\quad\quad\quad\quad=\sum^T_{j=1}\left[\left(\sum_{i\in I_j}g_i\right)w_j+\frac{1}{2}\left(\sum_{i\in I_j}h_i+\lambda\right)w_j^2\right]+\gamma T\tag{23}L~(t)i=1nl(yi,y^i(t1)+ft(Xi))+Ω(ft)+=i=1n[giwq(xi)+21hiwq2(xi)]+γT+21λj=1T=j=1TiIjgiwj+21iIjhi+λwj2+γT(23)
对上式求 ω\omegaω 的偏导,然后令偏导等于零,可以求解到:
ω∗=−∑i∈Ijgi∑i∈Ijhi+λ(24)\displaystyle\omega^*=-\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j}h_i+\lambda}\tag{24}ω=iIjhi+λiIjgi(24)
然后代入目标函数得到:
L~(t)(q)=−12∑j=1T∑i∈Ijgi∑i∈Ijhi+λ+γT(25)\displaystyle\tilde{L}^{(t)}(q)=-\frac{1}{2}\sum^T_{j=1}\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j}h_i+\lambda}+\gamma T\tag{25}L~(t)(q)=21j=1TiIjhi+λiIjgi+γT(25)
同样在选取分裂点的时候, 也以最小化目标函数为目标。假设在某次选取分裂点进行划分后,ILI_LILIRI_RIR 分别是划分后的左右节点,且 I=IL∪IRI=I_L\cup I_RI=ILIR,那么在该划分后损失函数减小的值为:
Lsplit=12[(∑i∈ILgi)2∑i∈ILhi+λ+(∑i∈IRgi)2∑i∈IRhi+λ+(∑i∈Ijgi)2∑i∈Ijhi+λ]−γ(26)\displaystyle L_{split}=\frac{1}{2}\left[\frac{\left(\sum_{i\in I_L}g_i\right)^2}{\sum_{i\in I_L}h_i+\lambda}+\frac{\left(\sum_{i\in I_R}g_i\right)^2}{\sum_{i\in I_R}h_i+\lambda}+\frac{\left(\sum_{i\in I_j}g_i\right)^2}{\sum_{i\in I_j}h_i+\lambda}\right]-\gamma\tag{26}Lsplit=21iILhi+λ(iILgi)2+iIRhi+λ(iIRgi)2+iIjhi+λ(iIjgi)2γ(26)

3.8 LightGBM

LightGBM是一个梯度Boosting框架,使用基于决策树的学习算法。它可以说是分布式的,高效的,有以下优势:
(1) 更快的训练效率;
(2) 低内存使用;
(3) 更高的准确率;
(4) 支持并行化学习。

3.8.1 GOSS

GOSS(Gradient-based One-Side Sampling)是通过区分不同梯度的实例,保留较大梯度实例同时对较小梯度随机采样的方式减少计算量,从而达到提升效率的目的,在提升树训练过程中目标函数学习的就是负梯度(近似残差)。
GOSS的计算步骤如下:
选取前 a%a\%a% 个较大梯度的值作为大梯度值的训练样本,从剩余的 1−a%1-a\%1a% 个较小梯度的值中,我们随机选取其中的 b%b\%b% 个作为小梯度值的训练样本,对于较小梯度的样本,也就是 b%×(1−1%)×samplesb\%\times(1-1\%)\times samplesb%×(11%)×samples,我们在计算信息增益时将其放大 (1−a)/b(1-a)/b(1a)/b 倍。总的来说就是 a%×samples+b%×(1−a%)×samplesa\%\times samples+b\%\times(1-a\%)\times samplesa%×samples+b%×(1a%)×samples 个样本作为训练样本。而这样的构造是为了尽可能保持与总的数据分布一致,并且保证小梯度值的样本得到训练。

3.8.2 独立特征合并

EFB(Exclusive Feature Bundling)是通过特征捆绑的方式减少特征维度的方式来提升计算效率。通常被捆绑的特征都是互斥的(一个特征值为零,一个特征值不为零),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。

3.8.3 特征融合

构建一个以特征为图中的点 (V)(V)(V),以特征之间的总冲突为图中的边 (E)(E)(E),这里说的冲突值应该是特征之间 coscoscos 夹角值,因为要尽可能保证特征之间非 000 元素不在同一个行上。而寻找合并特征且使得合并的簇个数最小,这是一个图着色问题。所以这个找出合并的特征且使得簇个数最小的问题需要使用近似的贪心算法来完成。
首先按照度来对每个点(特征)做降序排序(度数越大与其他点的冲突越大),然后将特征合并到冲突数小于KKK的簇或者新建另外一个簇。

3.8.4 特征合并

将这些簇中的特征合并起来。由于每一个簇当中,特征的范围都是不一样,所以我们需要重新构建合并后簇特征的范围。在第一个forforfor循环当中,我们记录每个特征与之前特征累积总范围。在第二个forforfor循环当中,根据之前的 bin Ranges 重新计算出新的 bin value 保证特征之间的值不会冲突。这是针对于稀疏矩阵进行优化。由于之前Greedy Bundling算法对特征进行冲突检查确保簇内特征冲突尽可能少,所以特征之间的非零元素不会有太多的冲突。
EBF的算法步骤如下:
(1) 将特征按照非零值的个数进行排序;
(2) 计算不同特征之间的冲突比率;
(3) 遍历每个特征并尝试合并特征,使冲突比率最小化。
我们称使用GOSS算法和EFB算法的梯度提升树(GBDT)称之为LightGBM。

4 相关理论介绍

4.1 缺失值处理

4.1.1 缺失值来源

数据的缺失是无法避免的,可能的原因有很多种,有以下三大类:
(1)无意的:信息被遗漏,比如由于工作人员的疏忽,忘记而缺失;或者由于数据采集器等故障等原因造成的缺失,比如系统实时性要求较高的时候,机器来不及判断和决策而造成缺失;
(2)有意的:有些数据集在特征描述中会规定将缺失值也作为一种特征值,这时候缺失值就可以看作是一种特殊的特征值;
(3)不存在:有些特征属性根本就是不存在的,比如一个未婚者的配偶名字就没法填写,再如一个孩子的收入状况也无法填写;
总而言之,对于造成缺失值的原因,我们需要明确:是因为疏忽或遗漏无意而造成的,还是说故意造成的,或者说根本不存在。只有知道了它的来源,才能对症下药,做相应的处理。

4.1.2 数据缺失类型

在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。而从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。
(1)完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
(2)随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
(3)非随机缺失(missing not at random, MNAR):指的是数据的缺失与不完全变量自身的取值有关,如高收入人群不原意提供家庭收入;
对于随机缺失和非随机缺失,直接删除记录是不合适的,原因上面已经给出。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性还没有很好的解决办法。题目中的数据缺失属于随机缺失,所以选择估计缺失值的方法对缺失值进行填充。

4.1.3 缺失值处理

以下是处理缺失值的三种方法:删除记录,数据填补,和不处理。
(1)删除记录
优点:最简单粗暴;缺点:牺牲了大量的数据,通过减少历史数据换取完整的信息,这样可能丢失了很多隐藏的重要信息;当缺失数据比例较大时,特别是缺失数据非随机分布时,直接删除可能会导致数据发生偏离,比如原本的正态分布变为非正态分布;这种方法在样本数据量十分大且缺失值不多的情况下非常有效,但如果样本量本身不大且缺失也不少,那么不建议使用。
(2)数据填补
对缺失值的插补大体可分为两种:替换缺失值,拟合缺失值,虚拟变量。替换是通过数据中非缺失数据的相似性来填补,其核心思想是发现相同群体的共同特征,拟合是通过其他特征建模来填补,虚拟变量是衍生的新变量代替缺失值。
替换缺失值
均值插补:对于定类数据:使用众数(mode)填补;对于定量(定比)数据:使用平均数(mean)或中位数(median)填补。一般如果特征分布为正态分布时,使用平均值效果比较好,而当分布由于异常值存在而不是正态分布的情况下,使用中位数效果比较好。此方法虽然简单,但是不够精准,可能会引入噪声,或者会改变特征原有的分布。
热卡填补(Hot deck imputation):热卡填充法是在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多。
KKK最近距离邻法(K-means clustering):另外一种方法就是利用无监督机器学习的聚类方法。通过KKK均值的聚类方法将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。归其本质还是通过找相似来填补缺失值。
拟合缺失值
拟合就是利用其它变量做模型的输入进行缺失变量的预测,与我们正常建模的方法一样,只是目标变量变为了缺失值。如果其它特征变量与缺失变量无关,则预测的结果毫无意义。如果预测结果相当准确,则又说明这个变量完全没有必要进行预测,因为这必然是与特征变量间存在重复信息。一般情况下,会介于两者之间效果为最好,若强行填补缺失值之后引入了自相关,这会给后续分析造成障碍。
回归预测:基于完整的数据集,建立回归方程。对于有缺失值的特征值,将已知特征值代入模型来估计未知特征值,以此估计值来进行填充。
极大似然估计(Maximum likelyhood):在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂,且仅限于线性模型。
多重插补(Mutiple imputation):多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
根据数据缺失机制、模式以及变量类型,可分别采用回归、预测均数匹配( predictive mean matching, PMM )、趋势得分( propensity score, PS )、Logistic回归、判别分析以及马尔可夫链蒙特卡罗( Markov Chain Monte Carlo, MCMC) 等不同的方法进行填补。
(3)不处理
补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。
在实际应用中,一些模型无法应对具有缺失值的数据,因此要对缺失值进行处理。然而还有一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如XGBoost,RF等高级模型。

4.2 数据不平衡

数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差,本文主要是用以下三种方法对数据进行采样,消除不平衡。

4.2.1 过采样

过采样(RandomOverSampler)是主动获取更多的比例少的样本数据。由于样本比例不均衡,在条件允许的情况下可以尝试获取占比少的类型的样本数据,也可以通过使用重复、自举或合成少数类过采样等方法(SMOTE)来生成新的稀有样品。
直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本(数据增强)。

4.2.2 欠采样

数据量足够时,通过欠采样(RandomUnderSampler)保留比例小的样本数据和减少比例大的样本数据来平衡数据集。缺点是会丢失多数类中的一些重要信息。

4.2.3 SMOTE采样

SMOTE采样的原理是在少数类样本之间进行插值来产生额外的样本。具体地,对于一个少数类样本使用 近邻法( 值需要提前指定),求出离 距离最近的 个少数类样本,其中距离定义为样本之间 维特征空间的欧氏距离。然后从 个近邻点中随机选取一个,使用下列公式生成新样本:
xnew=xi+(x^i−xi)×δ(27)x_{new}=x_i+(\hat x_i-x_i)\times \delta\tag{27}xnew=xi+(x^ixi)×δ(27)
其中 x^i\hat x_ix^i 为选出的 kkk 近邻点,δ∈[0,1]\delta\in[0,1]δ[0,1] 是一个随机数。
SMOTE会随机选取少数类样本用以合成新样本,而不考虑周边样本的情况,这样容易带来两个问题:
(1)如果选取的少数类样本周围也都是少数类样本,则新合成的样本不会提供太多有用信息;
(2)如果选取的少数类样本周围都是多数类样本,这类的样本可能是噪音,则新合成的样本会与周围的多数类样本产生大部分重叠,致使分类困难。

4.3 特征选择

与特征提取是从原始数据中构造新的特征不同,特征选择是从这些特征集合中选出一个子集。特征选择对于机器学习应用来说非常重要。特征选择也称为属性选择或变量选择,是指为了构建模型而选择相关特征子集的过程。
使用特征选择的前提是:训练数据中包含许多冗余或者无关的特征,移除这些特征并不会导致丢失信息。冗余和无关是两个概念。如果一个特征本身有用,但这个特征与另外一个有用的特征强相关,则这个特征可能就变得冗余。特征选择常用于特征很多但样本相对较少的情况。
特征选择一般包括产生过程、评价函数、停止准则、验证过程。为了进行特征选择,我们首先需要产生特征或特征子集候选集合,其次需要衡量特征或特征子集的重要性或者好坏程度,因此需要量化特征变量和目标变量之间的联系以及特征之间的相互联系。为了避免过拟合,我们一般采用交叉验证的方式来评估特征的好坏;为了减少计算复杂度,我们可能还需要设定一个阈值,当评价函数值达到阈值后搜索停止;最后,我们需要再验证数据集上验证选出来的特征子集的有效性。
特征选择的方法主要分为三大类:过滤式方法 (Filter Methods),包裹式方法 (Wrapper Methods) 和嵌入式方法 (Embedded Methods)。
过滤式方法运用统计指标来为每个特征打分并筛选特征,其聚焦于数据本身的特点。其优点是计算快,不依赖于具体的模型,缺点是选择的统计指标不是为特定模型定制的,因而最后的准确率可能不高。而且因为进行的是单变量统计检验,没有考虑特征间的相互关系。
包裹式方法使用模型来筛选特征,通过不断地增加或删除特征,在验证集上测试模型准确率,寻找最优的特征子集。包裹式方法因为有模型的直接参与,因而通常准确性较高,但是因为每变动一个特征都要重新训练模型,因而计算开销大,其另一个缺点是容易过拟合。
嵌入式方法利用了模型本身的特性,将特征选择嵌入到模型的构建过程中。典型的如LASSO和树模型等。准确率较高,计算复杂度介于过滤式和包裹式方法之间,但缺点是只有部分模型有这个功能。

4.3.1 常用方法比较

对常用的特征选择算法进行比较,如下表 2所示。

4.4 超参数寻优

机器学习模型参数众多,参数选择不恰当,就会出现欠拟合或者过拟合的问题。为了提高模型的精度,同时提升模型的泛化能力,调参过程不可缺少。而在选择超参数的时候,有两个途径,一个是凭经验微调,另一个就是选择不同大小的参数,带入模型中,挑选表现最好的参数。
本文主要选择网格搜索,网格搜索是一种重要调参手段,即穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找到最大值,网格搜索可以保证在指定的参数范围内找到精度最高的参数。

4.5 K折交叉验证

KKK折交叉验证(K-fold Cross Validation)将数据集 DDD 划分成 KKK 份互斥数据集 ,满足 D=D1∪...∪DkD=D_1\cup...\cup D_kD=D1...Dk,一般是平均分配使每份数据量接近并且数据分布尽可能一致。每次用一份数据测试,其余 K−1K-1K1 份数据训练,需要迭代 KKK 轮得到 KKK 个模型;最后再将 KKK 份测试结果汇总到一起评估一个离线指标。
cv_score=1K∑k=1KL(Pk,Yk)(28)cv\_score=\frac{1}{K}\sum^K_{k=1}L(P_k,Y_k)\tag{28}cv_score=K1k=1KL(Pk,Yk)(28)
KKK 折交叉验证的稳定性与 KKK 取值有很大关系。 KKK 值太小实验稳定性依然偏低, KKK 值太大又可能导致实验成本高, KKK 最常用的取值是5和10。 KKK 折交叉验证能够更好地避免过拟合和欠拟合,得到的结论也更有说服力。

4.6 模型评估

评估指标用于反映模型效果。在预测问题中,要评估模型的效果,就需要将模型预测结果 f(X)f(X)f(X) 和真实标注 YYY 进行比较。
评估指标定义为 f(X)f(X)f(X)YYY 的函数:
score=metric(f(X),Y)(29)score=metric(f(X),Y)\tag{29}score=metric(f(X),Y)(29)
模型的好坏是相对的,在对比不同的模型效果时,使用不同评估指标往往会导致不同的结论。

4.6.1 精确率和召回率

精确率和召回率多用于二分类问题,可结合混淆矩阵介绍,如表 3所示。

其中,TP(真正,True Positive)表示真实结果为正例,预测结果也是正例;FP(假正,False Positive )表示真实结果为负例,预测结果却是正例;TN(真负,True Negative)表示真实结果为正例,预测结果却是负例;FN(假负,False Negative)表示真实结果为负例,预测结果也是负例。显然,TP+FP+FN+TN=样本总数。
精确率P和召回率R的定义为:
精确率(P)=TPTP+FP召回率(R)=TPTP+FN(30)精确率(P)=\frac{TP}{TP+FP}\\召回率(R)=\frac{TP}{TP+FN}\tag{30}(P)=TP+FPTP(R)=TP+FNTP(30)
理想情况下,精确率和召回率两者都越高越好。然而事实上这两者在某些情况下是矛盾的:精确率高时,召回率低;而精确率低时,召回率高。

4.6.2 F1-score

F1F_1F1值是精确率和召回率的调和平均值:
2F1=1P+1R(31)\frac{2}{F_1}=\frac{1}{P}+\frac{1}{R}\tag{31}F12=P1+R1(31)
FFF 值可泛化为对精确率和召回率赋予不同权重进行加权调和:
Fα=(1+α2)⋅P⋅Rα2⋅P+R(32)F_{\alpha}=\frac{(1+\alpha^2)\cdot P\cdot R}{\alpha^2\cdot P+R}\tag{32}Fα=α2P+R(1+α2)PR(32)
此外,准确率和错误率也是常用的评估指标。
准确率(accuracy)=TP+TNTP+FP+FN+TN错误率(errorrate)=FP+FNTP+FP+FN+TN(33)准确率(accuracy)=\frac{TP+TN}{TP+FP+FN+TN}\\错误率(error\ rate)=\frac{FP+FN}{TP+FP+FN+TN}\tag{33}(accuracy)=TP+FP+FN+TNTP+TN(errorrate)=TP+FP+FN+TNFP+FN(33)
精确率和准确率是比较容易混淆的两个评估指标,两者是有区别的。精确率是一个二分类指标,而准确率能应用于多分类,其计算公式为:
准确率(accuracy)=1n∑i=1nI(f(xi)=yi)(34)准确率(accuracy)=\frac{1}{n}\sum^n_{i=1}I\left(f(x_i)=y_i\right)\tag{34}(accuracy)=n1i=1nI(f(xi)=yi)(34)

4.6.3 ROC与AUC

在众多的机器学习模型中,很多模型输出是预测概率。而使用精确率、召回率这类指标进行模型评估时,还需要对预测概率设分类阔值,比如预测概率大于阈值为正例,反之为负例。这使得模型多了一个超参数,并且这个超参数会影响模型的泛化能力。
接收者操作特征(Receiver Operating Characteristic,ROC)曲线不需要设定这样的阈值。ROC曲线纵坐标是真正率,横坐标是假正率,其对应的计算公式为:
真正率(TPR)=TPTP+FN假正率(FPR)=FPTP+TN(35)真正率(TPR)=\frac{TP}{TP+FN}\\假正率(FPR)=\frac{FP}{TP+TN}\tag{35}(TPR)=TP+FNTP(FPR)=TP+TNFP(35)
ROC曲线越靠近左上角性能越好。左上角坐标为(0,1),即 FPR=0,TPR=1,根据FPR和TPR公式可以得知,此时 FN=0,FP=0,模型对所有样本分类正确。
绘制ROC曲线很简单,首先对所有样本按预测概率排序,以每条样本的预测概率为阈值,计算对应的FPR和TPR,然后用线段连接。当数据量少时,绘制的ROC曲线不平滑;当数据量大时,绘制的ROC曲线会趋于平滑。
AUC(Area Under Roc Curve)即ROC曲线下的面积,取值越大说明模型越可能将正样本排在负样本前面。AUC还有一些统计特性:AUC等于随机挑选一个正样本(P)和负样本(N)时,分类器将正样本排前面的概率;AUC和Wilcoxon Test of Ranks等价;AUC还和基尼(Gini)系数有联系,满足等式 Gini+I=2⋅AUCGini+I=2\cdot AUCGini+I=2AUC
AUC的计算方法有多种,从物理意义角度理解,AUC计算的是ROC曲线下的面积:
AUC=∑i∈(P+N)(TPRi+TPRi−1)⋅(FPRi−FPRi−1)2(36)\textstyle AUC=\sum_{i\in(P+N)}\frac{(TPR_i+TPR_{i-1})\cdot(FPR_i-FPR_{i-1})}{2}\tag{36}AUC=i(P+N)2(TPRi+TPRi1)(FPRiFPRi1)(36)
AUC计算主要与排序有关,所以它对排序敏感,而对预测分数没那么敏感。

4.7 模型融合

Stacking是另一种更强大的模型融合方法,于1992年被Wolpert©提出,其基本思路是,通过一个模型来融合若干单模型的预测结果,目的是降低单模型的泛化误差。在这里,这些单模型被称为一级模型,Stacking融合模型被称为二级模型或元模型。
Stacking先从初始的训练集训练出若干单模型,然后把单模型的输出结果作为样本特征进行整合,并把原始样本标记作为新数据样本标记,生成新的训练集。再根据新训练集训练一个新的模型,最后用新的模型对样本进行预测。Stacking融合模型本质上是一种分层结构,每一层都是若干模型。简单起见,这里先讨论二级Stacking。同时,我们假设所有的单模型都是使用不同的学习算法产生,即异质模型(当然,Stacking的一级模型也可以是同质模型)。
在Stacking的模型训练阶段,二级模型的训练集是利用一级模型产生的。如果直接使用一级模型对初始的训练集样本进行预测来产生二级训练集,这样会有极大的过拟合的风险。因此,一般是用训练一级模型未使用的样本来产生二级模型的训练集。交叉验证法或留一法是比较常用的方法。下面以K折交叉验证为例,来介绍二级模型的训练集是如何生成的。
输入:训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}D={(x1,y1),(x2,y2),...,(xm,ym)};单模型学习算法 ξ1,ξ2,...,ξT\xi_1,\xi_2,...,\xi_Tξ1,ξ2,...,ξT;融合模型学习算法 ξ\xiξ
过程:
fort=1,2,...,Tdoht=ξt(D)endforD′=ϕ//基于原始数据训练个单模型fori=1,2,...,mdofort=1,2,...,Tdozit=ht(xi)//单模型输出作为样本新特征endforD′=D′∪((zi1,zi2,...,ziT),yi)//单模型输出和样本标记构建新训练集endforh′=ξ(D′)//在新训练集上训练二级模型for\ t=1,2,...,T\ do\\ \quad \quad h_t=\xi_t(D)\\ end\ for\\ D^{'}=\phi \quad\quad //基于原始数据训练个单模型\\ for\ i=1,2,...,m\ do\\ \quad\quad for\ t=1,2,...,T\ do\\ \quad\quad\quad\quad z_{it}=h_t(x_i)\quad\quad//单模型输出作为样本新特征\\ \quad\quad end\ for\\ \quad\quad D^{'}=D^{'}\cup\left((z_{i1},z_{i2},...,z_{iT}),y_i\right)\quad\quad//单模型输出和样本标记构建新训练集\\ end\ for\\ h^{'}=\xi(D^{'})\quad\quad//在新训练集上训练二级模型fort=1,2,...,Tdoht=ξt(D)endforD=ϕ//fori=1,2,...,mdofort=1,2,...,Tdozit=ht(xi)//endforD=D((zi1,zi2,...,ziT),yi)//endforh=ξ(D)//
输出:H(x)=h′(h1(x),h2(x),...,hT(x))//二级模型输出作为Stacking输出H(x)=h^{'}(h_1(x),h_2(x),...,h_T(x))\quad\quad//二级模型输出作为Stacking输出H(x)=h(h1(x),h2(x),...,hT(x))//Stacking

我们把初始训练集 D 随机划分成 k 个大小相似的集合 D1,D2,...,DkD_1,D_2,...,D_kD1,D2,...,Dk。令 DjD_jDjDˉj\bar{D}_jDˉj(它等于DDD \ DjD_jDj )分别表示第 jjj 折的测试集和训练集。给定 TTT 个初级学习算法,初级学习器 ht(j)h_t^{(j)}ht(j) 通过使用第 ttt 个学习算法而得。对于 Dˉj\bar{D}_jDˉj 中的每个样本 xxx,定义第 ttt 个模型的预测结果为 zjt=ht(j)(xi)z_{jt}=h_t^{(j)}(x_i)zjt=ht(j)(xi),那么由样本 xix_ixi 产生的二级模型训练样本特征为 zi=(zi1,zi2,...,ziT)z_i=(z_{i1},z_{i2},...,z_{iT})zi=(zi1,zi2,...,ziT),样本标记还是原始的样本标记 yiy_iyi。于是,在经过 k×Tk\times Tk×T次模型训练和预测后,得到二级训练集 D′={(zi,yi)}i=1mD^{'}=\{(z_i,y_i)\}_{i=1}^mD={(zi,yi)}i=1m,然后 D′D^{'}D用来训练二级模型。
在这里,二级模型 h′h^{'}h(z1,z2,...,zT)(z_1,z_2,...,z_T)(z1,z2,...,zT) 关于 yyy 的函数。

5 问题一:基于嵌入法的特征选择

5.1 数据预处理

5.1.1 数据描述

题目已公布三个附件,每个附件都包含不同的数据。
附件1:上市公司的行业分类;
附件2:上市公司财务数据;
附件3:附件2中数据字段的说明。
根据统计,附件1共有4163家企业,涵盖了19个行业,附件二包含了每个上市公司多年的财务数据报告数据,共22214条记录,每条记录有364个特征。前5年共18061条标记了FLAG的数据,第六年包含了4154条不标记FLAG的数据。
在364个财务数据因子中,特征FLAC是目标列,其中1表示上市公司在当年出现财务造假;0表示没有造假。剩下的363个特征因子中,包含10个上市公司身份特征因子和353个上市公司财务特征因子,如图 1所示。

5.2 无关信息处理

在上市公司身份特征因子中股票代码是每个股票的唯一特征,没有实际意义,需要删除。其他的,报告类型、会计区间、合并标志、会计准则、货币代码这些没用的身份特征因子与是否会造假没有关系,需要先将它们删除。

附件二中截止日期特征代表该公司造假的年份,其他年份无研究意义,将其删除,最后得到354个特征,如图 2所示。

5.2.1 缺失值处理

提出无关信息后,每个特征因子或多或少都存在缺失,确实太多的特征不利于机器学习,缺失程度大于70%的特征已经没有应用意义,所以我们对缺失程度为大于70%的特征进行删除。
缺失程度在40%到70%之间的也属于缺失严重,因为后面会采用高级机器模型进行训练,所以填充过多的缺失值会给模型带来噪音而干扰到模型的准确性,因此采用0值对缺失值进行填充。
缺失程度在40%以下,采用KNN算法进行填充。处理缺失值的数学模型如下:
{70%<Γ≤100%,舍弃该特征40%<Γ≤70%,用0值填充0%<Γ≤40%,用KNN算法填充\begin{cases}70\%<\Gamma\leq100\%,舍弃该特征\\40\%<\Gamma\leq70\%,用0值填充\\0\%<\Gamma\leq40\%,用KNN算法填充\end{cases}70%<Γ100%,40%<Γ70%00%<Γ40%KNN
经过筛选,留下239个特征,并且所有特征已经全部补全,没有缺失值,如图 3所示。

5.2.2 标准化处理

数据的标准化是指处理数据时统一不同指标之间的量纲。具有不同量纲的数据的差别可能会很大,并且其中有些数据是负值,会影响到后面的特征选择和机器学习,所以,为了解决量纲不统一所带来的问题,需要对数据进行标准化处理,通常采用的方法是把每个指标按照一定比例地缩放到0与1之间。
最小—最大标准化方法是对原始数据的线性变换。设 minAminAminAmaxAmaxAmaxA 分别为属性 AAA 的最小值和最大值,将 AAA 的一个原始值 xxx 通过 min−maxmin-maxminmax 标准化映射在区间 [new_minA,new_maxA][new\_minA,new\_maxA][new_minA,new_maxA]中的值 xxx,转换公式如下:
x∗=x−minmax−min(38)x^*=\frac{x-min}{max-min}\tag{38}x=maxminxmin(38)
其中,maxmaxmax 为样本数据的最大值,minminmin 为样本数据的最小值。max−minmax-minmaxmin 为极差。这种方法的优势在于能够提升模型的归一化程度。

5.3 企业合并

对前5年造价公司的行业分布情况进行统计得到表 5,有一些行业的数量很多,有一些行业的数量很少,对于数量太少的行业进行分析是不合理的,因此我们将教育、居民服务、修理和其他服务业、卫生和社会工作、住宿和餐饮业和综合这几个行业与普通居民的公共生活服务息息相关,所以将这几个行业进行合并成一个新的行业——公共服务业。
而一些行业内公司足够多但是却没有发生过造假的行业,无法通过采样处理使数据平衡,也不能进行机器学习训练,因此把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的模型包括One-class SVM等,此类的行业有租赁和商务服务业。

5.4 特征选择

针对本文对上市公司的财务数据进行特征选取,以制造业为例,我们采用嵌入法来得到每个行业是否造假的有效特征。
常用的嵌入法有两种:
一是基于惩罚项的特征选择法,即用正则 L1L_1L1 范数作为惩罚项。L1L_1L1 范数不但可以降低过拟合风险,还可以使求得的 ω\omegaω 有较多分量为0。所以当希望减少特征的维度以用于其他分类器时,可以选择不为0的系数所对应的特征.本文采用基于LASSO回归、逻辑回归、SVM模型的惩罚项特征选择法来选择特征,计算结果如表 6所示。

二是基于树模型的特征选择法,这种方法能够用来计算特征的重要程度,因此可以用来去除不相关的特征.本文采用随机森林、GBDT模型,XGBoost模型和LightGBM的树模型特征选择法来选择特征,计算结果如表 7所示。

5.4.1 确定与财务数据造假相关的数据指标

通过特征选择发现,各种模型选择的前30个指标都有一定的重合度。在此基础上,挑选出7个模型共同确定的数据指标,并进行分类,得到结果如下:

统计所有方法获取的特征,将出现次数大于等于3次的特征挑选为最终的指标,共23个,如表 8所示。

除了租赁和商务服务业需要另外分析外,对其他行业重复上述操作,就可以选择出每个行业的数据指标。对租赁和商务服务业单独进行OneClass SVM异常点分析,再根据每个指标的相关系数进行排序,得到前25个特征,将其作为该行业的数据指标,如表 9所示。

5.4.2 数据指标共性分析

统计所有行业的数据指标出现次数,如图 5所示,我们挑选出现次数大于和等于4次的指标,并将挑选出来的指标进行分类,分成三大类。

现金流量是评价投资方案经济效益的必备资料,包括:(1)现金流出:现金流出是投资项目的全部资金支出。(2)现金流入:现金流入是投资项目所发生的全部资金收入。运营能力是指企业基于外部市场环境的约束,通过内部人力资源和生产资料的配置组合而对财务目标实现所产生作用的大小。盈利能力是指企业获取利润的能力,也称为企业的资金或资本增值能力,通常表现为一定时期内企业收益数额的多少及其水平的高低。

5.4.3 数据指标差异性分析

以制造业和房地产业为例,不在上述的因子如表 11和表 12所示。
影响制造业的三大主要因子:外部融资条件、企业盈利和投资回报预期,前两者代表企业投资能力,后者代表企业投资意愿。选出的特征出现差异的原因主要是因为传统制造业生产方式。企业以生产大批量、单一产品为手段达到实现规模经济的目的,从而形成一种“大批量——低成本”的循环模式。传统制造业主要以固定资产、存货等实体资产产生盈利,业绩稳定,增长趋势可预测性强,企业价值估值相对容易,主要侧重于债务融资,其中选出来的因子更多地反映企业的负债能力。

房地产业选出的特征出现差异的原因主要是因为以下几点:
(1)房地产企业在建设过程中要投入大量的建设资金,因此,建设阶段最主要的支出就是工程款支出,工程款支出中归属于持有物业的部分计入在建工程项目,归属于销售物业的部分计人存货项目;
(2)由于预售制度的存在,房地产企业一般在建设阶段采用期房销售,因此,此阶段房地产企业会取得大量的预售房款,这是房地产企业最主要的现金流入项目,而预售房款应计入预收账款项目;
(3)在建设阶段,由于开发产品尚未竣工,企业不能结转收入和成本,而大量管理费用和销售费用的支出,造成此阶段企业呈现亏损状态;
(4)随着建设阶段工程进度的加快,房地产企业取得的开发贷款在此阶段将陆续到位,企业贷款规模不断加大。

通过以上分析可以发现,各个行业挑选的特征基本上能看出该行业的资金使用特点,其他行业将不再赘述。

6 问题二:基于Stacking模型的造假公司筛选

根据上文筛选出来的数据指标,用F1-score和AUC作为评价指标,使用各种机器模型算法进行训练,如表 13所示。

从上表可以看出,每个模型的F1-score都很高,但是AUC只有一半的水平,AUC是ROC曲线下覆盖的总面积,数值范围为[0.5,1]。分类器性能越好,ROC曲线越接近左上角,AUC的值越接近于1;分类器性能越差,ROC曲线越接近对角线,AUC的值越接近于0.5。
这是由于AUC希望训练一个尽量不误报的模型,也就是知识外推的时候倾向保守估计,而F1-score希望训练一个不放过任何可能的模型,即知识外推的时候倾向激进,这就是这两个指标的核心区别,样本不平衡往往会导致机器模型误判而导致AUC偏低。

6.1 数据采样

通过应用一些欠采样或过采样技术来处理失衡样本。欠采样就是对多数类进行抽样,保留少数类的全量,使得两类的数量相当,过采样就是对少数类进行多次重复采样,保留多数类的全量,使得两类的数量相当。但是,这类做法也有弊端,欠采样会导致我们丢失一部分的信息,可能包含了一些重要的信息,过采样则会导致分类器容易过拟合。当然,也可以是两种技术的相互结合。
通过采样共获得16818个过采样样本、136个欠采样样本、16818个SMOTE采样样本,并且对每一种采样方法进行机器学习,评价每一种采样方法效果,评价方法为F1-score和AUC,如表 14~表 19所示。






经过对比分析,发现采样处理之后数据发现,经过SMOTE采样可以提升AUC,并且保证F1-score不会骤降,初步推断是由于模型还未调整超参数,所以先用SMOTE采样处理数据。

6.2 寻找最优超参数

建模时先固定每个参数的初始值,再设定其调参范围,进行网格搜索和交叉验证寻找最优化结果。其中设置的初始值、范围和调参结果见各算法框架参数结果详情表,本文模型优化评价指标设为F1-score和AUC。
在经过SMOTE采样之后,共获得16818个样本,但是通过测试发现,SVM对于大数据样本的运行速度太慢,不适合进行调参等工作。
这是由于以下原因:(1)SVM在样本量比较少的时候,容易抓住数据和特征之间的非线性关系(相比线性分类方法如logistic regression,或者linear SVM)。但是,在样本量比较多的时候,线性分类方法的劣势就要小了很多,例如可以通过手工拆分/离散化特征来模拟非线性关系。(2)计算复杂度高。主流的算法是O(n^2)的,这样对大规模数据就显得很无力了。不仅如此,由于其存在两个对结果影响相当大的超参数(如果用RBF核,是核函数的参数gamma以及惩罚项C),这两个超参数无法通过概率方法进行计算,只能通过穷举试验来求出,计算时间要远高于不少类似的非线性分类器。
所以本文暂不考虑支持向量机。

6.2.1 逻辑回归模型调参过程

图 6为逻辑回归模型的学习曲线。

经过调参发现,无论如何调整惩罚系数C,AUC的最高值保持在0.75,由此可以看出逻辑回归模型的效果只是一般,但是难以将其作为最优算法预测,继续探索其他模型。

6.2.2 随机森林模型调参过程

图 7是随机森林模型的学习曲线。

先通过网格搜索确定决策树数目(n_estimators)和决策树最大深度(max_depth),再确定分裂所需最少样本数(min_samples_split)和叶节点最少承载样本数(min_samples_leaf),可以很直观地看到随机森林模型的表现性能更好,与比线性模型相比有着很大优势。
并且在运行随机森林的时候发现代码的运行速度快,这是由于随机森林容易做成并行化方法,随机森林在训练时,树与树之间是相互独立的。

6.2.3 GBDT模型调参过程

图 8是GBDT模型的学习曲线。

先确定学习率(learning_rate)为0.1,再用网格搜索对决策树数目(n_estimators)和决策树最大数目(max_dapth)的最优值进行搜索,得到最优参数后对分类所需最少样本数(min_samples_split)和叶节点最少承载样本数(min_samples_leaf)进行调整,最后根据AUC对子样本占总样本的比例(subsample)进行寻优。为了防止模型过拟合,需要调高分类所需最少样本数(min_samples_split)来使学习率(learning_rate)降到0.01。

6.2.4 XGBoost模型调参过程

图 9是XGBoost模型的学习曲线。

跟RF模型和GBDT模型一样,先确定0.1为XGBoost模型的学习率,再调整决策树数目(n_estmators),再确定模型的决策树的最大深度(max_depth),最后调整子样本占总样本的比例(subsample),最后根据AUC略调整模型的学习率(learning_rate)。

6.2.5 LightGBM模型调参过程

图 10是LightGBM的学习曲线。

LightGBM模型的参数较多,但是调参规则和每一个基于决策树的模型是差不多的,先确定0.1为初始学习率(Learning_rata),可以使模型有更快的收敛速度,然后通过网格搜索确定决策树数目(n_estimators)和决策树最大深度(max_depth),再确定最大叶子节点数(num_leaves)和叶节点最小样本数(min_data_in_leaf),最后调节特征子采样比例(feature_fraction)和样本子采样频率(bagging_fraction),回过头再提升叶节点最小样本数来降低学习率防止模型过拟合。

6.2.6 Stacking模型融合

在模型融合中,第1层学习器使用RF模型、GBDT模型、XGBoost模型和LightGBM模型。
为了得到第2层的学习器所需的数据,采取k折交叉验证来划分训练集的数据,本文使用5折交叉验证,得到第2层的训练集之后,第2层使用逻辑回归模型进行训练,并计算融合模型的F1-score和AUC,如表 25所示。发现Stacking模型有更高的评分并且保持了良好的AUC,说明模型的预测效果良好。

绘制5个模型和Stacking模型的ROC曲线进行比对,如图 11所示:

对第六年的制造业的公司进行预测,预测得到20家公司的财务数据造假,每个企业的编号如表 26所示:

7 问题三:寻找发生造假的公司

7.1 Stacking集成模型进行预测

根据问题二对制造业进行预测的思路,通过Stacking模型,利用各个行业挑选出来的数据指标,并对模型重新进行调参后进行机器学习,预测得到每个行业发生造假的公司。

7.2 OneClass SVM异常点检测

对于无法分类的行业——租赁和商务服务业,采用OneClass SVM进行异常点检测,预测得到如表 28的公司发生造假。

7.3 模型的思考和尝试

通过调参发现,每一个行业机器模型的超参数相差不大,所以提出一个猜想:是否可以使用一个融合模型将所有行业统一起来,并进行预测。假如这个猜想成立,将可以增强模型的鲁棒性和增加模型的使用范围。
特征选取的是第一问统计出来每个行业出现次数大于等于4次的数据指标,但是,得到的每个机器模型和融合模型的F1-score和AUC如表 29所示,同时绘出了ROC曲线(图 12)。


无论怎么调整LR模型的惩罚系数C,都无法再将LR模型的AUC提高,原因猜测是由于LR模型的预测结果呈“S”型,因此从log(odds)向概率转化的过程是非线性的,在两端随着log(odds)值的变化,概率变化很小,边际值太小,slope太小,而中间概率的变化很大,很敏感。导致很多区间的变量变化对目标概率的影响没有区分度,无法确定阈值。

8 总结

本文的研究结果有以下几点:
(1) 机器学习适用于预测上市公司是否会发生财务造假。传统的预测方法可能“力不从心”的现实情况下,可以将本文的经验运用到企业财务管理的实践中。
(2) 本文详细介绍了如何选择数据因子、训练和检验机器学习模型,通过F1-score和AUC指标综合考量了各学习模型的预测准确度和稳定性,并且将众多学习模型中进行融合,从而构建一套适用的、有效的基于集成学习的机器学习分类的财务造假预测方法。
(3) 由于LR模型的局限性,暂时还没有办法得到一个能涵盖所有行业的统一的机器模型,或许以后可以从别的基学习器出发,寻求构建一个涵盖所有行业的机器学习,本文可以进行更多的后续研究。

基于数据挖掘的上市公司财务数据分析——第九届“泰迪杯”挑战赛A题优秀作品相关推荐

  1. 第七届泰迪杯挑战赛C题

    第七届"泰迪杯"数据挖掘挑战赛C题赛题和数据 网盘链接: https://pan.baidu.com/s/1VRIHBLqaTsfOMLnVmibo5A 提取码:L6X6

  2. 基于深度学习的岩石样本智能识别研究——第九届“泰迪杯”挑战赛B题优秀作品

    1 前言 1.1 研究背景 岩石是现代建筑业和制造业的重要原材料,除了作为原材料使用以外,还可以对其进行勘探开发挖掘岩油气藏,若能智能且准确地识别岩石岩性.计算岩石含油量,这将会是一笔巨大的社会财富. ...

  3. 第十届“泰迪杯”比赛B题解题思路及代码论文

    今年大二,因为对编程感兴趣入坑,算下来自学编程快要一年了,了解了关于计算机的很多方向,暑假偶然间了解到数据分析和挖掘,觉得挺有趣的就想深入学习以下,于是开始学习pandas,然后机器学习,并在天池上做 ...

  4. 第九届泰迪杯A题(1)

    分析:统计出造假和非造假的个数并作图 正负样本可视化 import pandas as pd import matplotlib.pyplot as plt import numpy as np# 查 ...

  5. 分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)

    第十届"泰迪杯" 数据挖掘挑战赛优秀作品-农田害虫图像识别--特等奖 实验结果分析 4.1.1 实验配置 本篇论文的实验都是基于 Ubuntu 系统下进行,使用 GPU 和 CPU ...

  6. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 31页省一等奖论文及代码

    相关链接 (1)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统负荷预测分析 问题一Baseline方案 (2)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统 ...

  7. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题二 时间突变分析 Python实现

    目录 相关链接 完整代码下载链接 1 定义绘图函数 2 通过对原始测量应用阈值来查找异常值 3 手动设置阈值 4 使用分位数设置阈值 5 3Sigma原则(IQR) 6 设定分位数 6.1 导入数据 ...

  8. 大数据分析练习-第八届泰迪杯A题-基于数据挖掘的上市公司高送转预测

    报告书-pdf 本实验在Anaconda环境下进行编程,使用jupyter. 具体有以下注意点: 文件结构 : 主文件目录 - |-- Main.ipynb 主文件 ​ |-- ReadMe.md ​ ...

  9. “泰迪杯”挑战赛 - 基于非侵入式负荷检测与分解针对日常电器的电力数据挖掘

    目录 1.挖掘目标 2.分析方法与过程 2.1 问题 1 分析方法与过程 2.1.1 单个设备运行特征 2.1.2 实时用电量计算 2.2 问题 2 分析方法与过程 2.2.1 流程图 2.2.2 基 ...

最新文章

  1. 热更新 FrameWork
  2. java appendchild_详解javascript appendChild()的完整功能
  3. mysql远程权限grant_mysql 赋给用户远程权限 grant all privileges on
  4. 在.Net中进行跨线程的控件操作(上篇:Control.Invoke)
  5. 工业级路由器和家用路由器的区别_5G工业级路由器有哪些优势
  6. 【期望】期望分数(金牌导航 期望-4)
  7. 预写式日志 - postgresql之WAL(Write Ahead Log)
  8. 微信公众号后台开发---永久素材失效
  9. QQ隐藏福利二-----------------那些免费的挂件和气泡
  10. 缠论108课_缠论108课学习顺序
  11. html 插件 firefox,firefox插件 怎么在firefox里添加插件
  12. AcWing 671. DDD
  13. 2020SCTF——PWN snake
  14. uni-app获取元素节点信息
  15. C语言输出矩阵的主对角线和以及次对角线和
  16. python3跑通smpl模型_SMPL模型改用python3+numpy计算
  17. Filter拦截过滤参数
  18. [华为机试真题]69.姓名的夫妻相
  19. 看雪4-ReeHY-main-2017
  20. python学生成绩管理系统-增删查改

热门文章

  1. 描写火车站场景_作文素材 描写火车站的句子-精品
  2. Arduino基础入门之十三 温湿度传感器DHT11
  3. 【转自D8】女神的QQ动了,我大喜,点开后默泪了,狠狠的吸了口烟。。。
  4. 大疆睿炽Tello EDU无人机python操控之一——使用socket调试工具控制Tello EDU无人机
  5. 深入理解debuginfo
  6. 79、Vue的发展及优点和缺点
  7. 51nod-2534 最小旅行路线
  8. 一小时速成!扁平化名片设计PS教程
  9. 图文详解!10大高性能开发核心技术+
  10. Leetcode 1436旅行终点站 拓扑排序 并查集与队列