浙江大学学报(工学版), 2019, 53(5): 819-828 doi: 10.3785/j.issn.1008-973X.2019.05.001

计算机与控制工程

Stack Overflow上机器学习相关问题的大规模实证研究

万志远,, 陶嘉恒, 梁家坤, 才振功,, 苌程, 乔林, 周巧妮

Large-scale empirical study on machine learning related questions on Stack Overflow

WAN Zhi-yuan,, TAO Jia-heng, LIANG Jia-kun, CAI Zhen-gong,, CHANG Cheng, QIAO Lin, ZHOU Qiao-ni

通讯作者: 才振功,男,助理研究员. orcid.org/0000-0001-5003-6085. E-mail: cstcaizg@zju.edu.cn

收稿日期: 2018-10-23  

Received: 2018-10-23  

作者简介 About authors

万志远(1984—),女,博士,从事软件工程、软件安全、程序语言相关研究.orcid.org/0000-0001-7657-6653.E-mail:wanzhiyuan@zju.edu.cn , E-mail:wanzhiyuan@zju.edu.cn

摘要

为了调查机器学习相关主题分布和发展趋势,从在线问答网站Stack Overflow上,利用过滤标签,从4 178多万帖子中提取出60 028个与机器学习相关的问题帖. 通过分析问题帖,统计各个机器学习平台的讨论量,发现Scikit-learn、TensorFlow、Keras是前3位频繁被讨论的机器学习平台,占总讨论量的58%. 为了进一步分析机器学习相关讨论主题,进行潜在狄利克雷分布(LDA)主题模型训练,提出自适应LDA中的主题数渐进搜索方法,采用主题一致性系数评估输出结果,获得主题最佳数量,从而发现9个讨论主题,分属3个类别:代码相关、模型相关、理论相关. 基于主题中问题帖的浏览数、评论数,分析不同主题的流行度和回答困难程度.

关键词: 实证研究 ; 机器学习 ; Stack Overflow ; 潜在狄利克雷分布(LDA) ; 主题一致性

Abstract

By using filtered tags, 60 028 machine learning related questions were extracted from more than 41.78 million posts on an online Q & A website, Stack Overflow, in order to investigate the topic distribution and trends related to machine learning. Extracted question posts were analyzed by counting the amount of discussion on each machine learning platform, and top three most frequently discussed machine learning platforms were discovered, i.e. Scikit-learn, TensorFlow and Keras, accounting for 58% of these posts. Latent Dirichlet allocation (LDA) topic model training was conducted to further explore discussion topics related to machine learning. A progressive search approach was proposed for number of topics in adaptive LDA, which discovered the optimal number of topics with topic coherence coefficient, in order to obtain the optimal topic numbers for LDA models. Nine discussion topics related to machine learning were discovered, which fell into three broad categories, i.e. code-related, model-related, and theory-related. In addition, the popularity and difficulty of different topics were analyzed according to the view counts and comment counts of question posts.

Keywords: empirical research ; machine learning ; Stack Overflow ; latent Dirichlet allocation (LDA) ; topic coherence

PDF (807KB) 元数据 多维度评价 相关文章 导出 EndNote| Ris| Bibtex  收藏本文

本文引用格式

万志远, 陶嘉恒, 梁家坤, 才振功, 苌程, 乔林, 周巧妮. Stack Overflow上机器学习相关问题的大规模实证研究. 浙江大学学报(工学版)[J], 2019, 53(5): 819-828 doi:10.3785/j.issn.1008-973X.2019.05.001

WAN Zhi-yuan, TAO Jia-heng, LIANG Jia-kun, CAI Zhen-gong, CHANG Cheng, QIAO Lin, ZHOU Qiao-ni. Large-scale empirical study on machine learning related questions on Stack Overflow. Journal of Zhejiang University(Engineering Science)[J], 2019, 53(5): 819-828 doi:10.3785/j.issn.1008-973X.2019.05.001

近年来,机器学习逐渐成为学术界和工业界的热点研究问题,受到各界人士关注. 人们关心机器学习,希望了解机器学习的趋势和潮流;开发者关注机器学习,希望在传统软件中引入智能化的解决方案;专家关心机器学习,希望将研究成果在各行业转化,推动社会的发展和进步. 然而,机器学习领域内的相关主题众多,热点问题更新快,对机器学习相关主题进行全面研究,分析与机器学习相关的技术趋势很有必要.

在线问答类网站有丰富的数据集. Gyöngyi等[1]和Adamic等[2]分别分析Yahoo! Answers上的用户行为和问题内容. Yahoo! Answers是面向一般大众的社区驱动的问答网站. 相对于Yahoo! Answers,Stack Overflow作为最受欢迎的软件信息站点之一,包含数以百万计的帖子,涵盖编程、移动、安全、算法等与软件开发和维护相关的主题. 开发人员可以在那里自由询问并回答有关问题. 目前已有一些基于Stack Overflow数据集的研究. Barua等[3]对Stack Overflow上开发者讨论的主题和趋势进行大规模分析;Rosen等[4]通过指定研究Stack Overflow上移动开发者的问题缩小问题规模;Linares-Vásquez等[5]探索分析与移动开发问题相关的讨论主题;Yang等[6]研究安全相关问题的主题; Beyer等[7]对550个Android相关帖子进行人工分析,发现其中问题类型和问题类别之间的依赖性; Nadi等[8]通过综合Stack Overflow上前100个Java密码学相关问题实证调查开发者在使用密码学API时面临的问题. 迄今为止,未有针对Stack Overflow上机器学习相关问题的研究.

本研究旨在针对Stack Overflow,采用潜在狄利克雷分布(latent Dirichlet allocation,LDA)主题模型,进行机器学习相关主题和趋势的大规模实证研究. LDA已经被应用于分析软件工程数据呈现的趋势. Hindle等[9]将LDA应用于版本系统内提交的日志消息,用于确定在指定时间段内开发者工作围绕的主题并研究开发趋势的变化; Neuhaus等[10]将LDA应用于著名的漏洞数据库,发现特定的安全漏洞随时间变化的趋势;Thomas等[11]将LDA应用于分析软件演化,并提出LDA的变体,以更好地检测源代码中主题的趋势. 本研究将LDA应用于开发者问答网站Stack Overflow,并进行了部分改进.

截至2018年9月,Stack Overflow的公开数据集包含4 178多万个帖子,每个帖子都有1个文本(Body),用一些元数据(CreateDate、ViewCount等)来描述1个问题或1个答案. 基于帖子标签使用2个启发式方法来提取与机器学习相关的问题;基于改进的主题模型——渐进搜索过程的LDA主题模型,对不同的机器学习相关问题进行分类;在获得主题后,再利用元数据进行各种分析. 通过调查机器学习平台的讨论量、机器学习相关主题的受欢迎程度、回答难度,总结了有趣且有价值的结论,从而为相关研究人员、教育工作者和从业者提出一些启示.

1. 相关知识

1.1. Stack Overflow问答网站

Stack Overflow的参与者中有相当一部分人在不同的领域有着深厚的专业知识. 开发人员会询问关于各种领域的技术问题,主题多样,这些问题和答案可以通过搜索引擎获取. Stack Overflow实际上充当了开发人员各种需求的知识库,分析和理解知识库里的帖子能够加深开发人员对感兴趣的主题的了解. 现有很多关于Stack Overflow的研究. 一些研究对Stack Overflow上的问题进行分类[12],识别设计特征[13],分析帖子的文本内容[4]; 一些研究为Stack Overflow[14-15]的问题推荐标签;另外一些分析Stack Overflow帖子的主题[3-6].

1.2. LDA主题模型

主题模型将文档视为主题的概率分布,而主题是单词的概率分布. 在本研究中,文档是指帖子中的文本(如正文和标题),主题是指与文本中单词的分布相对应的高级概念. 例如,当文本中包含“use”、“error”、“code”、“run”、“trying”等词时,可以归纳该主题为“代码运行”.

LDA主题模型是著名的主题模型,被用于软件工程研究的各种任务[16-18]. 从理论上讲,LDA主题模型是生成概率模型,假定数据(一组文档)是基于特定的统计过程生成的. 具体来说,LDA主题模型包含如下3个步骤:1) LDA主题模型分别基于2个狄利克雷分布[19]生成主题分布向量t和词汇分布向量p;2) 根据主题分布向量t,LDA主题模型给每个文档分配1个主题,生成1个主题分配向量z;3) LDA主题模型用词汇分布向量p和主题分配向量z生成文档中的每个词. 通过重复K次步骤1),生成K个主题;通过重复N次步骤2)和步骤3),生成1个含有N个词汇的文档;通过重复D次步骤1)到步骤3),生成1个包含D个文档的集合.

实际上,LDA主题模型采用文档词汇矩阵aD×N)作为输入,输出2个矩阵bD×N)、cK×N),即文档主题矩阵和主题词汇矩阵. 文档词汇矩阵a可以被视为词汇频率矩阵,其中 $a{}_{ij}$ 为第j个词汇在第i个文档中出现的次数. 在文档主题矩阵b中, $b{}_{ij}$ 为第i个文档属于第j个主题的概率. 一般来说,文档被认为属于具有最高概率的主题. 在主题词汇矩阵c中, $c{}_{ij}$ 为第j个词汇属于第i个主题的概率. 同样地,用最高的概率来指定词汇属于哪个主题,然后可以通过查找该主题所包含的词汇来了解大致内容. 在某种程度上,LDA主题模型可以被看作聚类算法. 通过使用文档主题矩阵为每个文档分配1个特定的主题,可以完成文档的聚类. 具体来说,就是被分配给同一主题的文档被分在同一组. 目前,有多个开源的LDA主题模型实现,本研究使用gensim包提供的LDA主题模型实现.

2. 研究方法

2.1. 数据采集

为了进行全面的实验研究,使用在Stack Exchange Data Dump上名为“posts.xml”的公开数据集. 该数据集包含从2008年7月到2018年9月的41 782 536个帖子. 其中,问题帖为16 389 567个(39.23%)、答案帖为25 297 926个(60.57%)、其他类型帖为95 043个(0.20%). 每个帖子均包括正文和多个元数据,详细信息如表1所示.

表 1   帖子包含的元数据信息

Tab.1  Metadata information in a post

名称 描述 名称 描述
Id 帖子的编号 LastEditorUserId 最近编辑帖子的用户ID(可选)
PostTypeId 帖子的类型,1表示问题帖,2表示答案帖,其他类型不予讨论 LastEditorDisplayName 最近编辑帖子的用户名(可选)
AcceptedAnswerId 问题帖对应的答案帖ID(可选,仅在PostTypeId=1时出现) LastEditDate 最近编辑帖子的时间(可选)
ParentId 答案帖对应的问题帖ID(可选,仅在PostTypeId=2时出现) LastActivityDate 帖子最近活动的时间
CreationDate 帖子的创建时间 Title 帖子标题(可选)
Score 游客对帖子的平均分 Tags 帖子标签(可选)
ViewCount 帖子的总浏览数(可选,仅在PostTypeId=1时出现) AnswerCount 帖子的答案帖数量(可选,仅在PostTypeId=1时出现)
Body 帖子的正文,HTML格式 CommentCount 帖子的评论数量
OwnerUserId 帖子所有者的ID(可选) FavoriteCount 喜欢帖子的人数(可选,仅在PostTypeId=1时出现)
OwnerDisplayName 帖子所有者的用户名(可选) ClosedDate 帖子关闭的时间(可选,仅在帖子关闭时出现)

新窗口打开| 下载CSV


图1所示为Stack Overflow上很受欢迎的机器学习问题之一. 帖子标题为Role of Bias in Neural Networks,标签为artificial-intelligence、machine-learning、neural-network. 在标题和标签之间是帖子的正文,详细描述了问题. 在帖子的右下角还有一些元数据,如帖子的评论数、编辑日期等.

图 1

图 1   Stack Overflow上机器学习相关帖子示例

Fig.1   An example of machine-learning-related post on Stack Overflow


并不是所有与机器学习相关的问题都包含machine-learning这个标签,因此,不能仅通过检查帖子的标签来确定其是否与机器学习相关. 为了解决该问题,设计了2个启发式方法,以提取与机器学习相关的标签,然后根据标签来提取与机器学习相关的帖子. 为了找到所有与机器学习相关的帖子,首先利用标签从数据集中提取与机器学习相关的问题帖,再根据问题帖中的信息提取答案帖. 主要包括以下3个步骤:

1) 遍历数据集找到标签中包含machine-learning的问题帖,共有25 961个. machine-learning是非常宽泛的概念,1个帖子的标签可能会有更细的粒度,因此还需要考虑那些与机器学习相关但并未包含 machine-learning标签的帖子.

2) 从步骤1)中提取的25 961个帖子中提取标签,作为候选标签. 对于每个候选标签t,分别计算:步骤1)中提取的所有帖子中包含标签t的问题帖的数量a,以及原始数据集的所有帖子中包含标签t的问题帖的数量b. 令 ${H_1} = {a / b}$${H_1} \in \left[ {0, 1.0} \right]$,表示标签t与标签machine-learning的相关程度. ${H_1}$ 越大,标签t与machine-learning的排他关系就越强. ${H_1}$ =1.0,意味着标签 $t$ 只包含在标签machine-learning的帖子中(即该标签最具排他性). 通过设置阈值 ${T_1}$ 来过滤标签. 例如,当 ${T_1}{{ = }}0.100$ 时,若一个标签与machine-learning一起出现在所有问题帖中的比例小于10%,则将该标签从候选标签中删除.

然而,仅仅使用上面的启发式方法提取标签,还会引起另一个问题. 假设某标签只出现在整个数据集的1个帖子中,而标签machine-learning恰好同时出现在这个帖子中. 尽管此时 ${H_1}{{ = }}1.0$,但该标签属于与机器学习并不相关的问题. 因此,需要过滤这种标签. 令 $c$ 为步骤1)中提取的问题帖总数, ${H_2} = {a / c}$. 通过设置第2个阈值 ${T_2}$ 对标签进行二次过滤. 例如,当 ${T_2}{{ = }}0.010$ 时,若某标签出现在所有包含标签machine-learning的问题中的比例不到1%,则将该标签从候选标签中删除. 通过设置 ${T_1}$${T_2}$,可以获得能够代表机器学习的主题的标签. 如表2所示为在不同阈值下提取到的与机器学习相关联的标签集和总数. 在后面的实验中,分别取 ${T_1}$${T_2}$ 为0.150、0.030.

表 2   根据不同阈值配置得到的“machine-learning”相关结果标签集

Tab.2  "machine-learning" related tag set from different threshold configurations

T1, T2 标签集 标签数
(0.150,0.025) classification,deep-learning,scikit-learn,neural-network,artificial-intelligence,machine-learning,keras,svm,conv-neural-network,weka 10
(0.150,0.030) classification,deep-learning,scikit-learn,neural-network,artificial-intelligence,machine-learning,keras,svm 8
(0.250,0.025) classification,deep-learning,scikit-learn,neural-network,machine-learning,svm,conv-neural-network,weka 8
(0.250,0.030) classification,deep-learning,scikit-learn,neural-network,machine-learning,svm 6
(0.350,0.025)或(0.350,0.030) classification,machine-learning,svm 3
(>0.400,>0.080) machine-learning 1

新窗口打开| 下载CSV


3) 再次遍历数据集,寻找至少包含1个默认标签集中标签的问题帖(共60 028个),主要使用这些问题帖和相应答案帖进行分析.

2.2. 数据分析

数据分析主要包含2个阶段:特征提取阶段和主题模型阶段. 提取帖子的词汇频率作为特征,并提出自适应的LDA主题模型,通过梯度渐进搜索最佳主题数,将不同的机器学习帖子分组到不同的主题中.

2.2.1. 数据预处理

一个问题帖包括标题、正文和几个元数据. 为了将帖子聚类,需要构建语料库,其中每一行都是1个帖子的文本(包括正文和标题). 数据预处理步骤如下:1) 删除文本中的所有代码片段(即<code>标签),因为代码片段对主题模型没有帮助[3];2) 删除HTML标签(如<p>标签)、停用词、数字、标点符号和其他非字母字符等对主题模型无效的信息;3) 使用Snowball词干分析器将剩下的词汇转换成原形(例如,“reading”和“reads”被简化为“read”,即词干项),以减少特征维度,将相似的词统一成共同的表示.

在上述3个步骤之后,为了进一步减少干扰,根据它们的总频次对所有的词干项进行排序,并丢弃小于10次的项,剩下的7 757个不同的词干项为最终提取的特征,所有帖子共记3 645 754个词. 计算每个帖子中每个词汇出现的次数,得到词汇频次矩阵w. 其中, ${w_{ij}}$ 为第j个词汇出现在第i个帖子中的次数.

2.2.2. 寻找最佳主题数

使用LDA主题模型将帖子分类到不同的主题中. 在LDA中,主题的数量K是待定但重要的参数,其过大或过小都可能会严重影响到方法的性能. 因此,采用分梯度渐进搜索的方式,搜索K的最优值.

算法1. 自适应LDA中的主题数渐进搜索过程

输入:主题数量的搜索范围[MinTopics, MaxTopics]、  渐进梯度数组g

输出:主题的数量 ${k_{{\rm{best}}}}$

1)初始时趟数i=0,根据趟数从梯度数组g中选择  梯度 ${g_i}$,按 ${g_i}$ 从搜索范围[MinTopics, MaxTopics]内  选择,组成主题数的等差数组k

2)将主题数数组k中每个主题数 ${k_i}$,传入LDA模  型进行训练,计算一致性系数,从已尝试的主题数  中选取一致性系数最高的主题数 ${k_{{\rm{top}}}}$

3)以 ${k_{{\rm{top}}}}$ 为中心、梯度 ${g_i}$ 为半径,形成新的搜索  范围:[max {MinTopics, ktopgi}, min {MaxTopics,    ktop+gi}],趟数加1;

4)重复步骤1)到步骤3),直到梯度数组遍历完;

5)输出最佳主题数 ${k_{{\rm{best}}}}$

算法1给出了自适应LDA中的主题数渐进搜索过程. 将搜索范围设为[2,50]的整数,因为至少有2个主题,而50足以满足最大的主题数量. 渐进梯度数组g是从大到小排序的整数数组,每个值不应超过搜索范围的1/4,且最后一个梯度为1. 本研究所选取的梯度数组g=[11,5,2,1]. 以11为梯度进行初步选择,所选的主题数数组k=[2,13,24,35,46]. 最终找到的最佳主题数为9,如图2所示. 图中,Ccoh为一致性系数,n为主题数. 需要注意的是,出于性能的考虑,所得最优主题数可能并非全局最优解.

图 2

图 2   最佳主题数搜索算法过程中一致性系数的分布

Fig.2   Distribution of coherence coefficient in process of optimal topic number search algorithm


使用一致性系数评估LDA在不同主题数下的分类效果,一致性系数解决了主题模型对其输出结果可解释性低的问题. 一致性系数有 ${C_{\rm{V}}}$${C_{\rm{P}}}$${C_{{\rm{UMass}}}}$${C_{{\rm{UCI}}}}$${C_{\rm{A}}}$${C_{{\rm{UCI}}}}$ 等,其中综合性能最好的为 ${C_{\rm{V}}}$${C_{\rm{V}}}$ 组合了间接余弦度量、标准化点互信息(normalized pointwise mutual information,NPMI)和布尔滑动窗口[20],故使用 ${C_{\rm{V}}}$ 进行主题模型输出的一致性度量. 一致性系数计算包括4个阶段:分割、概率估算、确认测量、聚合. 使用gensim包中的CoherenceModel实现.

一致性系数为[−1.0,1.0]. 一致性系数越大表明聚类效果越好. 当主题数量获得较高的一致性系数时,意味着该主题数将使LDA获得较好的结果. 通过LDA的主题数渐进搜索,可以为所有机器学习问题帖找到适当数量的主题,并将每个帖子分配到相应的主题中.

3. 研究结果

对开发人员较感兴趣的4个问题进行实证研究和结果分析. 实验环境如下:处理器为Intel® CoreTM i7-6700HQ CPU @2.60GHz、RAM为16 GB、OS为Windows 10(64位).

3.1. 问题1 开发者在使用哪些机器学习平台?

利用提取的60 028个问题帖,通过分析正文、标题、标签,确定问题帖中讨论的机器学习平台,统计各机器学习平台的讨论量. 对于同一机器学习平台的同一概念,可能存在不同的表述. 因此,为各平台设置词汇表,其中包含平台名的一些泛化表述,比如H2o.ai平台,h2oai、h2o-3等词汇均属于某平台专有的词汇表. 如表3所示为前20个常用的机器学习平台或库.

表 3   不同机器学习平台的讨论帖的数量

Tab.3  Number of discussion posts about different machine learning platforms

序号 机器学习平台 讨论量 占比/%
1 Scikit-learn 12 641 21.06
2 TensorFlow 11 524 19.20
3 Keras 10 842 18.06
4 Caffe 1 501 2.50
5 Torch 1 366 2.28
6 Theano 1 300 2.17
7 Microsoft Cognitive Toolkit
(CNTK)
583 0.97
8 AWS 567 0.94
9 XGBoost 373 0.62
10 Caret 344 0.57
11 Spark ML&MLlib 339 0.56
12 Watson 286 0.48
13 Tflearn 224 0.37
14 Mahout 223 0.37
15 H2o.ai 209 0.35
16 Blocks 198 0.33
17 MXNet 155 0.26
18 Deeplearning4j 119 0.20
19 SINGA 98 0.16
20 Accord.NET 84 0.14

新窗口打开| 下载CSV


图3表3所示,Scikit-learn、TensorFlow、Keras为Stack Overflow上最被频繁讨论的机器学习平台,与其相关的问题帖讨论量占总讨论量的58%以上.

图 3

图 3   不同机器学习平台讨论帖数量占比

Fig.3   Proportion of number of discussion posts about different machine learning platforms


3.2. 问题2 Stack Overflow上提出的与机器学习相关的问题涉及哪些主题?

该研究问题可以让开发人员更深入地了解与机器学习相关的问题,并使他们了解有关机器学习的不同主题. 由于用户对问题tag标记粒度较粗,仅依靠tag不能有效地进行主题归类,主题归类必须基于对全文的理解. 根据Barua等[3]和Yang等[6]的研究工作,采用LDA主题模型获得的主题具有较好的准确性和可解释性. 本研究使用带主题数渐进搜索过程的LDA主题模型,对机器学习相关问题进行分类. 通常,LDA需要预先设定主题数K. 不同问题的最优主题数K应该不同. 本研究提出的方法可以根据特定问题的特征自动确定K的最优值,以便LDA获得更好的结果.

表4所示为每个主题的主题名、主题类别以及该类主题的前10个关键词. 其中,主题名、主题类别是根据关键词归纳的[1, 8]. 主题是通过LDA计算出来,逻辑上是客观存在的,而主题名是为了行文的可读性和理解效果通过人工归纳得出的,掺杂一定的主观性. 所使用的归纳方法为基于构成主题的关键词对主题的贡献度,由高到低,人工理解关键词构成的语境,归纳出主题名;此外,通过随机抽样验证各主题的问题帖,修正归纳的主题名,减少误差,确保主题名切实地表达主题. 如表5所示为从各主题下随机抽样问题帖以验证主题名的例子.

表 4   9个主题的归纳主题名和相关性前10的关键词

Tab.4  Inductive topic names for nine topics and top ten keywords for relevance

序号 主题名(类别) 主题关键词(提取词干后)
1 代码运行(代码相关) use,error,code,run,tri,model,get,python,imag,train
2 模型训练(模型相关) model,imag,train,use,kera,layer,data,tensorflow,size,batch
3 数据集分类(模型相关) data,use,train,class,classifi,test,set,classif,model,dataset
4 神经网络(模型相关) network,neural,output,layer,loss,function,train,use,weight,input
5 模型性能评估(模型相关) use,predict,featur,model,word,data,time,text,score,valu
6 实现细节(理论相关) use,gradient,function,implement,learn,x,vector,calcul,algorithm,comput
7 编程与库(代码相关) file,line,py,packag,python,tensorflow,error,lib,c,site
8 模型输入问题(模型相关) input,error,shape,kera,lstm,array,model,use,sequenc,tri
9 学习算法(理论相关) algorithm,use,would,like,learn,tree,valu,one,data,problem

新窗口打开| 下载CSV


表 5   随机抽样问题帖验证主题名

Tab.5  Random sampling of question posts to verify topic names

序号 标题 说明 主题概率
1 Captcha Recognition using CNN not giving expected results 题主尝试在Python中使用TensorFlow开发验证码识别程序,运行没有得到预期结果 代码运行:0.46
实现细节:0.31
2 How to create Training data for Text classification on 4 categories 题主询问如何为4个类别的文本分类创建训练数据 模型训练:0.42
学习算法:0.38
3 How to use glmnet in R for classification problems 题主想用R中的glmnet来做分类问题,并给出了样本数据和要求 数据集分类:0.92
4 Properly declaring input_shape for neural network in Keras? 题主描述在Keras中遇到的声明神经网络参数input_shape的问题 神经网络:0.73
代码运行:0.18
5 R and PCA Explanation for machine learning 题主希望解释机器学习过程中发生了什么,以阿尔茨海默病数据为例,构建2个预测模型,评估其准确度 模型性能评估:0.39
模型训练:0.37
6 Keras ImageDataGenerator for Cloud ML Engine 题主试图调用Keras的flow_from_directory方法来处理云存储中的图像,但读取数据一直失败 实现细节:0.77
编程与库:0.22
7 ModuleNotFoundError: No module named 'keras' in AI DevCloud Intel 题主在装完Keras和TensorFlow环境后,在调用ImageDataGenerator包时仍提示Keras库未安装 编程与库:0.90
8 How to make this neural network traning function faster 题主输入锯齿状阵列的变量,每个处理阶段至少需要
5 min,询问训练更快的方法
模型输入问题:0.49
代码运行:0.26
9 How to classify documents using Naive Bayes and Principal Component Analysis (C#,Accord.NET) 题主想要学习如何使用朴素贝叶斯和主成分分析对文档进行分类 学习算法:0.45
模型训练:0.21

新窗口打开| 下载CSV


根据表4归纳的主题名,发现机器学习相关问题的主题涉及范围较广,有些主题的粒度较细(如神经网络),而有些则较粗略(如编程与库). 如图4所示为属于每个主题的问题数量,np为问题帖数. 问题最多的主题为数据集分类,最少的主题为编程与库. 将所有主题名分为3类,即代码相关、模型相关、理论相关. 如表4所示,将每个主题划分到这些类别中. 其中,代码相关类别占16.02%,理论相关类别占18.90%,模型相关类别占65.07%. 模型相关主题覆盖了一半以上的机器学习相关问题,表明Stack Overflow上的用户对机器学习模型方面的问题较关注.

图 4

图 4   9个主题对应的问题帖数

Fig.4   Numbers of question posts corresponding to nine topics


3.3. 问题3 哪些主题在机器学习相关问题中最受欢迎?

回答此研究问题可以帮助开发人员了解机器学习相关问题的一般趋势. 为了衡量某个主题的受欢迎程度,收集与该主题相关的所有问题,根据这些问题的元数据使用4个评估指标进行评估,即平均浏览次数V、平均评论数量C、平均喜欢人数F以及问题的平均得分S. 在Stack Overflow的Data Dump中,可以直接从问题帖的ViewCount属性获得问题的浏览量,从CommentCount属性获得问题的评论数,从FavouriteCount属性获得喜欢帖子的人数,从Score属性获得帖子的得分.

实验结果如表6所示,表中列出了不同主题在这4个评估指标方面的受欢迎程度. 可以看出,学习算法、数据集分类、实现细节、代码运行是四大最受欢迎的主题. 其中,学习算法是Stack Overflow上每个初学者最普遍的问题,数据集分类是机器学习中经典和普遍的问题;模型输入问题、模型训练和模型性能评估是在用机器学习建立模型过程中,开发人员可能遇到的常见问题;学习算法、实现细节和代码运行主题的问题平均评论数和喜欢数排名较靠前,进一步表明这3个主题基于这些评估指标是较受欢迎的;相反,模型训练、编程与库似乎较少受到关注,尽管关于编程与库这一主题的问题具有较高的平均评论数. 经计算,这些机器学习相关主题的问题的平均浏览量为1 088.27,表明开发人员确实较关注机器学习领域.

表 6   基于4项评估指标的主题流行度

Tab.6  Popularity of each topic based on four evaluation indexes

主题名(所属类别) V C F S
学习算法(理论相关) 1 509.89 1.92 4.38 2.64
数据集分类(模型相关) 1 281.56 1.61 2.38 1.46
实现细节(理论相关) 1 230.19 1.42 2.74 1.92
代码运行(代码相关) 1 150.17 1.72 2.11 1.38
神经网络(模型相关) 971.61 1.55 2.46 1.67
编程与库(代码相关) 968.26 1.71 1.38 0.93
模型性能评估(模型相关) 912.53 1.46 2.56 1.42
模型输入问题(模型相关) 888.61 1.41 2.06 1.39
模型训练(模型相关) 836.63 1.25 2.30 1.51
平均值 1 088.27 1.56 2.49 1.59

新窗口打开| 下载CSV


图5所示,统计每年各主题相关的提问量,即问题帖数. 数据集跨度从2008年7月到2018年9月,因此2018年各机器学习相关主题的问题帖统计折线略有下降. 由图5可以看出有关学习算法主题的问题最多,增长也最快;数据集分类在2015年前是Stack Overflow上机器学习相关的主要提问主题;所有机器学习相关主题的问题帖数量,自2015年起有加速增长的趋势.

图 5

图 5   各主题的问题帖数逐年变化趋势

Fig.5   Trends in number of question posts on each topic yearly


3.4. 问题4 哪些与机器学习相关的主题最难回答?

该研究问题的答案可以帮助开发人员重视难题,以便他们分配更多的时间来解决这些问题. 特别是,如果某主题既流行又困难,该主题应该得到更多的关注. 参考Yang等[6]的工作,为了衡量某主题的难度,使用2个评估指标:问题从提出到得到答案的平均时间跨 ${\Delta}{{t}}$,以及问题得到的平均答案数量与平均浏览次数的比例PD. 对于第1个度量指标,将问题的创建日期作为开始时间,并将相应被接受答案的创建日期作为结束时间. 2个创建日期可以分别从问题的CreationDate属性及其接受的答案帖中获得,其中被接受的答案帖可以通过问题帖的AcceptedAnswerId属性来索引. 接受答案所花费的时间越多,问题就越难以解决.

Stack Overflow作为良性发展的问答社区,很大程度上得益于其问答机制,包括投票(vote)机制、声望(reputation)机制和排行榜(ranking system);提供优质回答的用户会根据投票数量获得声望值,声望和衍生系统的操作权限与排名密切相关,而各类别的排行榜对参与贡献的用户具有激励作用;Stack Overflow提供异常检测机制,保证声望的客观公正. 声望体现了用户在Stack Overflow社区的影响力,许多IT公司将其作为招聘面试中的参考指标. 因此,当某一问题有大量的浏览量,但回答很少,通常意味着只有少数人才能解决这个问题. 最极端的情况为,在很长的时间跨度中,某问题被大量用户浏览却没有被接受的回答,可以认为该问题是难题.

分别从主题中每个问题的AnswerCount和ViewCount属性中获得答案数和浏览量,计算平均值(AV),从而计算主题的PD以衡量该主题的难度:

${\rm{PD}} = \frac{A}{V} \times 100\text{%} .$

PD越小,表示该主题中的问题越难.

实验结果如表7所示,展示了9个主题的平均时间跨度、平均答案数和PD得分,发现不同主题在接受答案所需的平均时间跨度上有较大差异. 关于实现细节、代码运行和学习算法的问题是最难解决的3类问题,平均需要十多天才能提交和接受答案(分别为14.40、14.23、10.75 d). 而关于模型输入问题和模型训练的问题则相对容易回答,平均为4~5 d. 另外,实现细节和代码运行的PD得分较小,仅为0.08、0.10,这与第1个度量指标指征的结果一致. 此外,神经网络的时间跨度超过10 d,PD=0.09,表明它也较难回答.

表 7   基于2个指标(问题回答的平均时间跨度、答案量与浏览量的比例)的主题难度

Tab.7  Difficulty of each topic based on two evaluation indexes (average time span of answering question and ratio of answer count to view count)

主题名(所属类别) Δt/d PD/%
实现细节(理论相关) 14.40 0. 08
代码运行(代码相关) 14.23 0.10
学习算法(理论相关) 10.75 0.12
神经网络(模型相关) 10.41 0.09
模型性能评估(模型相关) 9.85 0.14
编程与库(代码相关) 9.27 0.11
数据集分类(模型相关) 8.75 0.09
模型训练(模型相关) 5.54 0.10
模型输入问题(模型相关) 4.21 0.11

新窗口打开| 下载CSV


第1个指标平均时间跨度和第2个指标PD不具相关性,时间跨度主要用于考察问题是否已经充分曝光,与PD的分母平均浏览量所指征信息相似. 因此,以PD指标为主,同时参考平均时间跨度. 选出PD不超过0.10且时间跨度超过10 d的主题作为难题,总共找到3个主题,即实现细节、代码运行和神经网络.

4. 结 论

基于Stack Overflow大规模的技术问题,对机器学习相关问题的主题和趋势进行分析,实验性地发现了流行的机器学习平台、受欢迎的机器学习主题和困难的机器学习主题. 本研究的处理方法和流程具有通用性,可用于分析其他技术问题的主题和趋势.

研究结果的启示如下:

(1)对研究人员的启示. 通过大规模实验研究分析了开发人员关心的机器学习相关主题,并重点探究了最受欢迎和最困难的主题. 基于已有的大量回答材料,研究人员可以研究诸如特定领域的自动问答等技术来帮助开发人员回答这些问题.

(2)对教育者的启示. 模型相关是问题最多的类别,其问题数量占Stack Overflow上所有机器学习相关问题的一半以上,表明开发人员对模型相关问题普遍困惑. 因此,教育工作者应该更加关注模型层面,尤其是模型输入和训练性能. 此外,还可以在编写的书籍或讲义中使用更多的章节去详细阐述机器学习领域的热门模型等知识,使学习者对模型有更深入的了解.

(3)对从业人员的启示. 项目经理可能希望将不同难度级别的任务分配给不同的开发人员. 与机器学习相关的三大难题分别为实现细节、代码运行和神经网络,据此,他们可以向高级开发人员分配关于实现细节的任务,向初级开发人员分配关于模型输入问题、模型训练的任务. 正确的分配可以大大缩短项目开发进度. 另外,Scikit-learn、TensorFlow、Keras是三大主流机器学习平台,建议从业者选择这些主流的机器学习平台,在遇到问题时,可以从这些社区中得到更好的支持.

有效性威胁分析如下:

(1)内部有效性. 内部有效性的挑战与本实验中的错误有关. 本研究基于标签来进行问题的提取,所以难免会遗漏一些与机器学习相关的问题. 另外,在对同一单词不同词性的统一处理上仍有不足,没有对词频过高但语意泛化的单词进行有效过滤,机器学习平台的专有词汇表也有待扩充.

(2)外部有效性. 外部有效性的挑战与本研究结果的普遍性有关. 研究仅对Stack Overflow上的60 028个机器学习的相关问题进行实验研究,实验数据集的规模还需要进一步扩展. 未来计划结合问题帖相应的答案帖进行分析,并通过调查更多的问答网站进一步扩展研究,确保得到更具普遍性的结论.

参考文献

GYÖNGYI Z, KOUTRIKA G, PEDERSEN J, et al. Questioning yahoo! answers [R]. Stanford: Stanford InfoLab, 2007.

[本文引用: 2]

ADAMIC L A, ZHANG J, BAKSHY E, et al. Knowledge sharing and yahoo answers: everyone knows something [C]// Proceedings of the 17th International Conference on World Wide Web. Beijing: ACM, 2008: 665–674.

[本文引用: 1]

BARUA A, THOMAS S W, HASSAN A E

What are developers talking about? an analysis of topics and trends in stack overflow

[J]. Empirical Software Engineering, 2014, 19 (3): 619- 654

DOI:10.1007/s10664-012-9231-y      [本文引用: 4]

ROSEN C, SHIHAB E

What are mobile developers asking about? a large scale study using stack overflow

[J]. Empirical Software Engineering, 2016, 21 (3): 1192- 1223

DOI:10.1007/s10664-015-9379-3      [本文引用: 2]

LINARES-VÁSQUEZ M, DIT B, POSHYVANYK D. An exploratory analysis of mobile development issues using stack overflow [C]// 10th IEEE Working Conference on Mining Software Repositories. San Francisco: IEEE, 2013: 93–96.

[本文引用: 1]

YANG X L, LO D, XIA X, et al

What security questions do developers ask? a large-scale study of stack overflow posts

[J]. Journal of Computer Science and Technology, 2016, 31 (5): 910- 924

DOI:10.1007/s11390-016-1672-0      [本文引用: 4]

BEYER S, PINZGER M. A manual categorization of android app development issues on Stack Overflow [C]// International Conference on Software Maintenance and Evolution. Victoria: IEEE, 2014: 531–535.

[本文引用: 1]

NADI S, KRÜGER S, MEZINI M, et al. Jumping through hoops: why do Java developers struggle with cryptography APIs? [C]// Proceedings of the 38th International Conference on Software Engineering. Texas: ACM, 2016: 935–946.

[本文引用: 2]

HINDLE A, GODFREY M W, HOLT R C. What's hot and what's not: windowed developer topic analysis [C]// IEEE International Conference on Software Maintenance. Edmonton: IEEE, 2009: 339–348.

[本文引用: 1]

NEUHAUS S, ZIMMERMANN T. Security trend analysis with cve topic models [C]// 21st International Symposium on Software Reliability Engineering. San Jose: IEEE, 2010: 111–120.

[本文引用: 1]

THOMAS S W, ADAMS B, HASSAN A E, et al. Modeling the evolution of topics in source code histories [C]// Proceedings of the 8th Working Conference on Mining Software Repositories. Hawaii: ACM, 2011: 173–182.

[本文引用: 1]

TREUDE C, BARZILAY O, STOREY M A. How do programmers ask and answer questions on the web? Nier track [C]// 33rd International Conference on Software Engineering. Hawaii: IEEE, 2011: 804–807.

[本文引用: 1]

MAMYKINA L, MANOIM B, MITTAL M, et al. Design lessons from the fastest Q&A site in the west [C]// Proceedings of the SIGCHI Conference on Human Factors in Computing Systems. Vancouver: ACM, 2011: 2857–2866.

[本文引用: 1]

XIA X, LO D, WANG X, et al. Tag recommendation in software information sites [C]// 10th IEEE Working Conference on Mining Software Repositories. New Jersey: IEEE, 2013: 287–296.

[本文引用: 1]

WANG S, LO D, VASILESCU B, et al. EnTagRec: an enhanced tag recommendation system for software information sites [C]// International Conference on Software Maintenance and Evolution. Victoria: IEEE, 2014: 291–300.

[本文引用: 1]

ASUNCION H U, ASUNCION A U, TAYLOR R N. Software traceability with topic modeling [C]// 32nd International Conference on Software Engineering. Cap Town: IEEE, 2010, 1: 95–104.

[本文引用: 1]

THOMAS S W. Mining software repositories using topic models [C]// Proceedings of the 33rd International Conference on Software Engineering. Hawaii: ACM, 2011: 1138–1139.

PANICHELLA A, DIT B, OLIVETO R, et al. How to effectively use topic models for software engineering tasks? an approach based on genetic algorithms [C]// Proceedings of the 2013 International Conference on Software Engineering. San Francisco: IEEE, 2013: 522–531.

[本文引用: 1]

GEORGE H. Parameter estimation for text analysis [R]. Darmstadt: University of Leipzig, 2009.

[本文引用: 1]

RÖDER M, BOTH A, HINNEBURG A. Exploring the space of topic coherence measures [C]// Proceedings of the 8th ACM International Conference on Web Search and Data Mining. Shanghai: ACM, 2015: 399–408.

[本文引用: 1]

/