丁德武,张 鵾,吴志男,王美能
(宜春学院 数学与计算机科学学院,江西 宜春 336000)
“大数据”时代已经到来,在互联网、金融、生物等领域中基于数据分析来发现问题,并作出科学、客观的决策越来越重要。根据NewVantage Partners[1]的一项调研,几乎全部(99 %)受访企业都对数据技术做了不同层度的投入,其中近一半的企业进行数据驱动的创新或利用数据分析来提升竞争力。随着企业对“大数据”越来越重视,“大数据”人才的需求将会越来越大。近年来,国内高校相继开设了“大数据”专业,进行“大数据”人才培养。2016年,北京大学等3所高校首批获教育部批准,设立了“数据科学与大数据技术”本科专业。截至2021年2月,全国前后六批、累计680余所高校获批、设立了该专业。我院也于2019年获批、设立了“数据科学与大数据技术”本科专业。
然而,由于“大数据”专业是一个全新的专业,培养方案的研究尚在“初级阶段”,存在培养目标不明确、课程体系不合理等各种问题。[2-3]加上“大数据”分析除了需要计算机专业知识,还需要数学、统计学基础,以及一定的业务知识,相关课程的开设和教学难度也比较大。目前,我院“大数据”专业数据分析类课程教学存在的突出问题是:课程之间往往“各自为政”“贪多求全”,不同课程的内容在一定程度上存在重复与交叉。同时,由于“贪多求全”,这些课程的教学内容又往往过多,很容易出现赶进度、重理论、轻实践等现象,导致学生缺乏独立分析、解决实际问题的能力,难以达到企业对数据分析人才的要求。因此,对“大数据”专业数据分析类课程的教学改革势在必行。
目前,国内外高校已开展了多种新型“大数据”专业课程教学模式,如运用企业案例、增设项目实战、建立兴趣小组、强化校企合作等。[4-5]然而,这些方法大多针对具体的课程;作为具体课程常规教学的辅助方法,它们非常有效,但却很难用来协调不同课程之间的课程衔接关系。
本研究中,我们通过构建课程群来帮助协调多门课程。这里,课程群是指专业课程体系中用来负担某类功能的几门有机课程体系。[6]这种基于知识体系构建的课程群通常具有如下优势:
(1)完善知识体系,适应时代要求。传统的课程体系往往“各自为政”“贪多求全”,在授课学时有限的情况下,往往只能侧重于概念与原理的简单介绍。模块化的课程群建设则以实际需求为导向,围绕各个任务模块开展教学工作,这不仅有助于知识体系的完善,也更能适应“新工科”的发展要求。此外,征服一个个课程模块的成就感,还可以有效提高学生的学习积极性。
(2)促进知识融合,提升知识价值。通过课程群建设,可以逐步引导学生聚合知识点、形成知识链、构建知识网,可以有效培养学生综合运用所学知识分析问题和解决问题的能力,从而提升知识的价值创造。
(3)加强理实结合,促进校企合作。模块化课程群建设的改革思路,强化了理论联系实际,契合了企业对数据分析人才的需求。合理选择实训项目,能有效促进知识向技能的转化,实现学校教育与企业人才需求的高效对接。
综上,课程群的构建不仅可以解决不同课程内容存在重复与交叉的问题,还将有助于培养学生分析和解决实际问题的能力,激发自主创新能力,提升应用技术能力。因此,我们拟通过课程群的建设来改革“大数据”专业数据分析类课程的教学。
总体而言,我们根据岗位能力需求对专业能力进行分解,特别是围绕数据挖掘与数据分析全过程的各个任务模块,来开展“大数据”专业的数据分析课程群建设。
首先,根据岗位需求对地方院校“大数据”专业学生所需要的核心能力进行分析。“地方高校要对区域经济发展和产业转型升级发挥支撑作用”是“新工科”建设(复旦共识)的一项重要内容。[7]因而,结合地方院校的人才培养目标和办学定位,以岗位需求和岗位能力要求为导向,厘清地方院校“大数据”专业学生所需要的核心能力是“新工科”背景下人才培养的时代要求,也是本研究能够达到预期目标的首要前提。
其次,围绕这些核心能力提出了一种适合应用型“大数据”人才培养的课程群组成原则。合理的规划课程群组成是“新工科”背景下课程体系建设的一个重要方向,[8]也是本研究能够达到预期目标的根本保证。我们以企业的实际需求为导向,围绕数据挖掘与数据分析全过程的各个任务模块展开。通过制定更合理的培养目标、优化课程体系,来构建独立的课程模块,进而避免原课程体系中各课程之间的“各自为政”问题。总体而言,课程模块的设置遵循“以实际应用为导向,以能力建设为目标”的基本原则。
第三,依据《工程教育专业认证标准》,进一步探索课程群的建设标准和教育理念。这就是说,我们以《工程教育专业认证标准》为指导,在正确理解“标准”对计算机类专业课程体系各项要求的基础上,对“大数据”专业数据分析课程群的设置及教学内容优化进行探索与实践,并落实在教育教学的各个环节,主要包括:教学团队,课堂教学,课程考核等。同时,由于思政教育是实现“立德树人”的一个重要途径,也是高等教育的新时代要求。[9]我们还将找准各个课程模块与思政教育的结合点,将课程思政的理念融入课程群建设。
目前,“大数据”专业的人才培养一般可分为三类:(1)大数据分析理论,重点学习大数据挖掘、分析和建模的基础理论;(2)大数据开发运维,重点学习大数据领域软件的开发、使用和运维方面的知识;(3)大数据应用技术,重点学习大数据技术在各行各业的应用,如金融大数据分析、生物医药大数据分析,等等。[10]
一般认为,地方院校的“大数据”专业应当定位于应用型“大数据”人才的培养,基础岗位一般为大数据开发工程师和应用数据分析师。因而,数据分析课程群建设应主要围绕应用型“数据分析”岗位所需要的核心技能开展。这类岗位的主要岗位职责是“具备行业应用领域知识,提供基于数据挖掘分析的战略决策”,对应的“大数据分析”核心技术知识通常应至少包括数据采集、数据预处理、数据存储与管理、数据分析与挖掘,以及数据可视化等五大类别。
因此,我们在新一版的培养计划中调整了相关课程的安排,形成了以上述讨论为基础的“大数据”专业数据分析课程群。整个课程群共建设了5门“数据分析类”课程,分别是“Python程序设计”“数据仓库与数据挖掘”“机器学习”“数据采集与预处理”以及“大数据可视化”,课程详细信息如表1所示。课程群以Python语言为基础,所以在第三学期首先开设了“Python程序设计”。从后续课程的名称可以看出这几门课大多负责1-2个“数据分析”核心技能,只是“数据仓库与数据挖掘”和“机器学习”这两门课有所交叉,它们对应数据存储与管理、数据分析与挖掘这两大类别。其中,前者除了介绍数据存储与管理方面的知识,还涉及数据挖掘的基础理论,后者则侧重介绍常用数据挖掘与机器学习方法的实现。
表1 宜春学院“大数据”专业数据分析课程群
在教育教学实践方面,我们已经组建了“数据分析类”课程校级教学团队。“Python程序设计”“数据仓库与数据挖掘”“机器学习”“数据采集与预处理”“大数据可视化”等课程建设都有老师分工负责。
此外,为了进一步加强课程群中各门课程之间的耦合,我们最初拟针对2-3个特定行业的实际数据分析任务来设计聚合这几门课程的教学案例。考虑到“地方高校要对区域经济发展和产业转型升级发挥支撑作用”这一“新工科”建设(复旦共识)重要任务,我们结合了宜春市中医药产业的地方特色和我院生物、药学方面的优势学科,首先在这些课程中融入了生物学领域的实际案例,并最终增设了“生物信息学导论”课程来系统地介绍数据分析方法与生物医药问题之间的关联,以期更好地融入生物医药特色。该课程由团队全体教师联合授课。
案例教学法是围绕一定的教学目标将真实需求进行典型化处理形成教学实例,是目前最有效的教学手段之一。这里,我们主要介绍“Python程序设计”和“数据采集与预处理”课程中使用的两个生物学领域的教学案例。
案例1 从字符串处理到正则表达式引入的教学案例设计
字符串处理与正则表达式是课程群第一门课程“Python程序设计”中的教学内容。在讲解完字符串处理函数之后,我们先通过血红素结合位点“CXXCH”的提取这一案例进行练习,进而过渡到正则表达式部分。这里,“CXXCH”是血红素蛋白中用于结合血红素的氨基酸基序(其中:“C”代表半胱氨酸,“H”代表组氨酸,“X”则表示任意氨基酸),如图1A所示。本案例,我们共提供了40余个细胞色素c文件,如图1B所示。
图1 教学案例“血红素结合位点CXXCH的提取”引入示意图(A)“CXXCH”图示,(B)部分案例文件截图展示。
我们先使用其中一个文件(如细胞色素c MtrA)为例进行说明,其氨基酸序列为:MKKILLFKLIFISAFCLSSLTIAAENLESLLIKKFEEKQYSKSGADTCLTCHKKDEKVSSFFNSAHGISNQKGPMAGLQCETCHGPQGKHRGKNEPMITFGEQGNIDINKQNGICLSCHKNEMQSDWHNAAHQQQACSSCHNIHAEVDPILANAVSQNKVCADCHQAESHQTLMRSSHPLTNGQMTCTACHGAHGTINDVDLIKNNINQTCYTCHADKRGPLLWEHAPVVDDCTHCHNAHGSVNDNLLKTRAPLLCQQCHNGNPHAAVDQGIAGTNVFNSSGSCLNCHNQIHGSNHPSGNKLLK,我们将此氨基酸序列存储到字符串变量mtrA中。
(1)字符串处理
由于“CXXCH”中的“X”代表任意氨基酸,从字符串处理的角度,最容易想到的是先找出1个“CH”的位置。这可以使用字符串函数find()完成,即:
mtrA.find(‘CH’),得到结果51,说明子串“CH”是从字符串mtrA的51号位置开始。
随后,可以使用字符串切片方法简单地切出第一个基序,即:
mtrA[mtrA.find(‘CH’)-3:mtrA.find(‘CH’)+2],得到结果“CLTCH”。
接下来,分析讨论并引导学生自行编写循环语句,得到全部的“CXXCH”基序。
此后,进一步分析讨论代码,发现存在某些问题,例如:我们只是查找了“CH”子串,并通过切片的方式切出了该子串及其前面的三个字符,理论上只是得到了一系列“XXXCH”子串,这并不能保证第一个字符是“C”。学生随后又增加了判断条件,完成了相关任务。
通常,在实际教学过程中,我们还会请2-3位同学来介绍他们自己设计的提取方法。
(2)正则表达式
在使用字符串函数完成任务后,我们开始过渡到正则表达式。首先,简单介绍正则表达式的基本概念,随后给出使用正则表达式处理此问题的代码,如:
re.findall(‘C[A-Z][A-Z]CH’,mtrA),或者re.findall(‘C[A-Z]{2}CH’,mtrA)
即可得到全部“CXXCH”,结果为列表:[‘CLTCH’,‘CETCH’,‘CLSCH’,‘CSSCH’,‘CADCH’,‘CTACH’,‘CYTCH’,‘CTHCH’,‘CQQCH’,‘CLNCH’]。
从学生的课堂表现(听课与自行实践练习)来看,这种对比式的案例教学能引起学生对正则表达式的强烈兴趣。
(3)课外延伸
回到问题本身,强调本案例的完整任务是处理“cytc.zip”文件中的40余个细胞色素c文件。因此,还需要学生使用“zipfile”模块读取文件包、获取其中的所有细胞色素c文件并分别处理,由学生课外自主完成。
案例2 用Pandas进行蛋白质相互作用数据筛选的教学案例设计
Pandas数据处理是课程群中课程“数据采集与预处理”的教学内容。我们先使用图片对Pandas数据结构和Numpy多维数组做了类比,在介绍了常用数据结构(特别是数据表)的基本概念和常用属性之后,我们安排了蛋白质相互作用数据筛选这样一个教学案例来讲解数据表的存载、索引和切片。
此前,我们在“Python程序设计”课程的“列表”部分用过一个只有10余条边的小型网络实例,在该课程的“模块与包”部分又介绍过网络分析工具包igraph与networkx。因此,在简要回顾这些内容后,我们使用图2引入本例,并带着学生们一起构造了一个蛋白质相互作用网络。
图2 教学案例“用Pandas进行蛋白质相互作用数据筛选”引入示意图
图3 蛋白质相互作用数据的前五行
(1)数据读取
首先,简要介绍Pandas中用于csv、excel等常用数据文件存取的函数pd.read_xxx和df.to_xxx(df应为某个具体的数据框对象)。然后,读取我们从STRING数据库下载的一个蛋白质相互作用信息文件“211586.protein.links.detailed.v10.txt”。
我们先使用pd.read_csv(“211586.protein.links.
detailed.v10.txt”)函数读取该文件;在得到错误结果后,引导学生通过帮助函数help()来查看pd.read_csv()函数的参数说明,并以默认参数sep=‘,’与header=‘infer’为例讲解了如何结合实际数据来进行参数设置,并最终将语句修改为:
son=pd.read_csv(“211586.protein.links.detailed.v10.txt”,sep=“ ”)
至此,数据读取介绍完毕。
随后,使用len(son)可知共有705112行数据,我们随后使用语句son.head()来查看son对象,结果如下:
根据STRING数据库的说明,前两列(protein1、protein2)分别表示两个蛋白质,接下来的neighborhood、fusion、cooccurence、coexpression、experimental、database与textmining等七列是使用了不同的打分方法对这两个蛋白质之间存在相互作用的可能性进行打分,combined_score这一列则是综合打分结果。
(2)切片
在索引与切片方面,一般主要介绍索引方法at与iat、切片方法loc与iloc等几个方法以及逻辑索引方法。
通过上面的图片可以看出:许多分数较低(甚至为0),这说明这些相互作用的可靠性较低。我们需要先筛选出比较可靠的蛋白质相互作用对,如:总分“较高的”(combined_score得分大于等于700)并且具有实验证据的(experimental得分大于0)。这个任务可以用逻辑索引来完成,代码如下:
son700=son[(son[‘experimental’]>0)&(son[‘combined_score’]>=700)]
随后,可以使用loc或iloc切片出前两列,代码分别为:
ppi700=son700.loc[:,(‘protein1’,‘protein2’)],或者ppi700=son700.iloc[:,0:2]
接下来,使用语句len(ppi700)可知一共筛选得到了13446条符合条件的蛋白质相互作用数据,不到原始数据的2 %。
(3)索引与元素操作
在得到的ppi700对象中,我们需要进一步去除所有元素中代表物种信息的“211586.”。
首先,我们可以使用at或iat索引一个元素来进行处理,如:
a_protein=ppi700.at[121,‘protein1’],或者a_protein=ppi700.iat[0,0]
接下来,简单复习并使用字符串处理函数处理得到的元素,代码可以为:
a_protein.replace(“211586.”,“”),或者a_protein.split(‘.’)[1]。
随后,我们讨论如何去除ppi700对象中所有元素的“211586.”,主要介绍如下三种方法:
方法一:两层循环,此方法最容易想到。
for i in range(len(ppi700)):
for j in range(2):
ppi700.iat[i,j]=ppi700.iat[i,j].replace(“211586.”,“”)
ppi700.head()#用于查看处理后数据的前五行。
方法二:两次map,此方法比较容易想到,涉及map与lambda函数。
ppi700[‘protein1’]=ppi700[‘protein1’].map(lambda s:s.replace(“211586.”,“”))
ppi700[‘protein2’]=ppi700[‘protein2’].map(lambda s:s.replace(“211586.”,“”))
方法三:一次applymap,此方法由Pandas库提供。
ppi700.applymap(lambda s:s.replace(“211586.”,“”))
(4)保存数据
根据前面介绍的df.to_xxx系列函数,可以使用ppi700.to_csv(“ppi700.txt”,sep=“ ”,index=False)语句将结果保存下来。
至此,我们通过对蛋白质相互作用数据的筛选这一任务完成了对数据表的存载、索引和切片等内容的讲解。
(5)课外延伸
要求学生使用在“Python程序设计”课程中介绍的网络分析工具包igraph或者networkx读入文件“ppi700.txt”并转换为网络对象(提示:亦可直接将数据框对象ppi700转换为网络对象),或者将该文件导入到网络分析工具如Pajek或者Cytoscape中(图2是使用Cytoscape的网络展示)做进一步探索性学习、研究,由学生课外自主完成。
在获批、设立“数据科学与大数据技术”专业之前,我院对“信息与计算科学”和“软件工程”专业做了“大数据”方向改造。近年来,这些专业的教学实践表明数据分析类课程在一定程度上存在重复与交叉等问题。
为使学生得到系统的数据分析与数据挖掘训练,我们以岗位核心能力需求为导向开展了数据分析课程群的建设。课程群内课程的设置涵盖了“大数据”应用的各个环节,符合“大数据”应用的真实场景。此外,我们还结合宜春市中医药产业的地方特色和我院生物、药学方面的优势学科,介绍了在这些课程中融入生物学领域数据分析的实际教学案例。通过在我院“数据科学与大数据技术”专业的初步实践表明,课程群的建设与相关课程的开设不仅更能适应企业的要求,还能有效地提高学生的学习积极性和实践动手能力。