李斌斌
(广西师范大学数学与统计学院,桂林 541006)
近年来,由于国内互联网行业的火热,各种编程人才的需求都较高。Java 从诞生开始就备受青睐,因为它的编程语言具有简洁、高效、安全能力突出等特点,现在越来越多的开发者使用Java 编程。各大招聘网站显示,Java 的岗位需求仍处于一个火热的状态,几乎是其他行业的倍数。但与Java 开发人员的薪资相关的影响因素是什么,尚不十分清楚。本文使用贝叶斯神经网络方法,从许多变量中选择出重要的影响因素。贝叶斯神经网络在解决神经网络的过拟合方面有着突出的效果,它根据已有的信息推断未知,因此被誉为未来神经网络的方向。
线性回归模型中的变量选择目前已经非常成熟,比如采取1 惩罚的lasso,采取2惩罚的岭回归等,这些方法都是基于正则化实现的,通过对似然函数添加惩罚来达到模型的稀疏化。贝叶斯方法通过选取一个比较合适的先验,然后稀疏化模型,但是这些方法仅对线性模型是有用的。日常生活中更多的是非线性模型,因此,有必要去研究如何在非线性系统中选择变量以及确定模型。
最近几年也有神经网络的稀疏方法,比如使用总体随机近似蒙特卡罗算法来稀疏神经网络,但是由于该算法属于传统的MCMC 算法,需要在每一次迭代时评估完整数据的可能性,因此在大数据问题的情况下,该算法受到一定的限制。
本文基于Liang 等提出的贝叶斯神经网络的变量选择方法。贝叶斯神经网络的基础是前反馈神经网络(feed-forward neural networks,FNNs)。
贝叶斯神经网络(Bayesian neural networks,BNN)和深度神经网络(deep neural networks,DNN)的不同之处在于:贝叶斯神经网络的权重由固定的数字变为带有参数的分布,参数由给定的先验表示。
用数据集D=(x,y)表示观测到的个样本数据,其中∈R,∈,由此可以得出,在给定时的分布为:
()表示的非线性函数,(),(),()依次表示所对应的函数。
在如图1 所示的神经网络中,我们设置,…,x为个输入变量,并且令= 1。隐藏层共有个隐藏节点。隐藏层中每一个隐藏结点的值为:
图1 神经网络
ω表示第个输入单元到第个隐藏单元的权重,I表示第个输入单元到第个隐藏单元的连接的指示向量,f是激活函数。同理可以得到输出层的值,即:
我们定义={I,I,I},表示贝叶斯神经网络的连接结构。 为了方便表示={ω,ω,ω; I= 1,I= 1,I= 1} 。在此神经网络中共有个连接,=(+ 1)(+ 1) +,则我们可以用=(,,…,β)表示连接权重。
本文中我们使用spike-and-slab 先验,在此之前,已经有很多的研究者使用spike-andslab先验来做变量选择。
本文数据是通过使用爬虫在智联招聘爬取得到,包括Java 开发者的薪资、城市、岗位要求、工作经验,以及公司人数等变量。按照城市规模,分别爬取了一线城市如北京、上海、广州、深圳,以及部分非一线城市如西安、郑州、兰州等城市的数据。为了便于分析计算,本文将一线城市和非一线城市分别赋值1 和0。由于爬取到的工资以及工作经验是一个范围,因此,取工资平均数作为因变量,工作经验也取平均值。学历要求按照高中到博士分别赋值0~7。该数据集中含有16 个自变量,以每个职位给出的薪资作为因变量。本文使用该数据集的前80%作为训练样本数据集,剩余20%作为测试数据集。由于真正影响每个职位的薪资的变量我们并不知道,所以可以认为该模型是稀疏的。
数据集中含有16 个自变量,本文设置隐藏层有三个隐藏单元,那么在此模型中神经网络的 最 大 连 接 数= 71, 我 们 设 置 λ={0.001,0.002,0.005,0.01,0.02},由 于λ越 大,意味着神经网络中拥有更多的连接,因此计算所需要的时间更长。通过先验最优化计算,我们确定0.02 是最适合的λ。
图2 显示了神经网络中每一个连接的边缘包含概率,其中共有8个连接的边缘包含概率超过了0.5。图3 显示共有四个变量的边缘包含概率大于0.5,那么,就可认为在此神经网络中,共有四个变量,分别对应工作位置、学历信息、工作经验,以及Spring技术。
图2 连接边缘包含概率(横轴数字代表第几根线)
图3 变量选择概率
2.3.1 因变量分析
图4给出了Java开发者薪资的频数分布直方图,可以看出大多数岗位薪资集中在1 万~1.5万之间。该图呈现了一个明显的偏左分布特征,因此,大多数人的薪资水平比较低,只有很少的一部分人拥有很高的工资。在所搜集的数据中,平均薪资在1.38 万元,中位数以及中数都是1.3万元。
图4 各个薪资阶段的人数
2.3.2 自变量分析
在本文数据中共有四个变量与Java 开发者的薪资相关,其中工作城市、工作经验和学历是最重要的几个变量。
计算发现,一线城市的平均薪资在1.738 万元,而非一线的平均薪资在1.29万元。图5和图6显示一线城市和非一线城市中Java开发者的薪资高于总体平均值的比率。从中可以看出,一线城市的薪资水平明显高于其他城市。导致这一现象的主要原因是互联网行业主要集中于大城市,比如北京的百度、美团、小米等;上海有拼多多、小红书;深圳的腾讯、华为以及其他的大型互联网公司。行业的需求以及国家的扶持政策等因素,都在影响着一个公司的发展。
图5 一线城市薪资相对于平均薪资的分布比
图6 非一线城市薪资相对于平均薪资的分布比
由于我国教育事业的高质量发展,使得我们拥有大量的人才。在人们的普遍印象中,学历永远是影响工资的一个重要因素。在Java 行业的招聘要求中,学历要求在大专及以上的公司占到了99.9%,学历要求在大学本科及以上的公司占61%。
除了上述两个因素以外,工作经历也是影响薪资高低的重要变量。工作时间长,意味着有更多的经验和知识技能,因此随着工作经历增长,招聘公司给出的工资也会相应上升。
图7 各个学历的要求占比
图8 薪资与工作经验柱状图
表1 薪资与工作经验的关系表
本文在贝叶斯神经网络的基础上,选择影响Java 开发者薪资的重要因素加以分析,提出以下建议:①一线城市开发者的工资较高,但消费水平也较高,应聘者择业时应综合自身的因素,不能盲目认为一线城市工资高,就锁定一线城市找工作,其它城市的薪资虽稍低,但是由于消费水平低,也不失为一个很好的选择。并且,现在互联网的发展正在扩散,非一线城市也拥有更大的潜力与机遇。②在学历方面,越来越多的公司招聘要求本科以上学位,因为互联网行业是一个需要知识储备与逻辑能力的行业,高学历往往是寻找工作的必要条件。③解决问题的能力,求职者需要积累大量的工作经验,这样才能在找工作时具备与面试官谈判的能力。总的来说,首要任务是增强自己的能力,再结合自身条件,来选择是否在大城市工作。