APP下载

基于机器学习的在线学习者画像的构建与实现

2023-01-15杨业壮

无线互联科技 2022年21期
关键词:朴素画像贝叶斯

陈 珂,汤 鑫,杨业壮

(苏州市职业大学,江苏 苏州 215004)

0 引言

随着大数据、机器学习等技术的迅速发展,美国、英国、澳大利亚等国家已发布各自利用技术促进学习的相关计划,《中国教育现代化2035》中也明确指出要努力推动信息技术与教育教学的深度融合,可见用信息技术改变教育已成为各国教育研究者关注的焦点。教育领域倡导以学习者为中心,为学习者提供精准化服务,随着网络在线课程的发展和教育应用软件的升级,学习者画像[1]的研究逐渐进入学界视野,与学习者画像定义相关的更多是以“学习者画像”“学生画像”“数字画像”“学习者肖像”等名词呈现,这使得学习者画像在教育领域[2]的应用更加贴切于教育教学的实际情境。

本文对学习者画像构建[3]进行研究,将围绕研究目标设计在线学习者画像模型及其构建流程,并在此基础上将其应用于在线学习过程,用于展现在线学习者的多维度特征[4],帮助学习者直观明了地了解自己的整体学习情况,有利于促进学习者的参与度和学习效果。本研究获取学习者学习过程中的行为数据,并利用该行为数据和在线评测结果数据为学习者画像,从而客观地揭示学习者状态,对使用在线教学系统的学习者提高教学质量、提高学习水平起到重要作用。

1 数据预处理

本文首先对在线学习者的学习行为痕迹进行了清洗和预处理,数据清洗主要包括去重、去空和删除异常值等步骤,数据预处理是对清洗后的数据做处理汇总,得出分析处理后的数据。本文编写MapReduce程序对学习痕迹数据做清洗和预先处理,然后将学习行为数据导出为csv文件,以便为后续的学习者画像分析做准备,这些学习行为数据的结构包括用户ID、学习天数、学习总时长、学习的章节数和在线测试成绩等字段。具体的实现方法如下。

1.1 Map()函数实现数据清洗

Map()利用并行化思想来对数据进行有意义的筛选,去除csv文件中第1行的字段名和空值,提取登录时间、学习时长、章节名称等相关数据。Map输出的键值对经过shuffle过程,聚成后,会交给reduce()函数。

if (key.get()==0){

System.out.println(value.toString());

return;//抛弃第一行数据,

}

String rowvalue = value.toString();

if (rowvalue.equals("") ∣∣ rowvalue =="") {

return;//数据中存在空字符串

}

String[] strs = rowvalue.split("");

//由登录时间、学习时长、章节名称组成的字符串

String text =strs[1]+","+strs[2]+","+strs[3];

key.set(strs[0]);//用户id

value.set(text);

context.write(key,value);

1.2 Reducer()函数统计学习者的登录次数,学习总时长和学习章节数

Map过程输出的键值对先经过shuffle过程把key值相同的所有value值聚集起来形成values,此时values是对应key字段的由登录时间、学习时长、章节名称组成的字符串的列表,然后将输入reduce方法,reduce方法只要遍历values后进行字符串分割后分别对学习时长求和以及求总天数、章节数求和、用户名,即可得到某个学习者的行为数据。

List logintime = new ArrayList();//存放登录时间

List duration = new ArrayList();//存放学习时长

Set chaptername =new HashSet();//存放章节名称,去除重复章节名

List list = new ArrayList();

for(Text t:values)

list.add(t.toString());

for(String str:list){

String[] strs = str.split(",");

logintime.add(strs[0]);

duration.add(strs[1]);

chaptername.add(strs[2]);

}

long dur_sum=0;

for(String d :duration){

dur_sum += Long.parseLong(d);//统计学习总时长

}

//用户id、学习总时长、学习天数、学习的章节数、在线测试成绩,组成一个字符串

String recordstr = key.toString()+""+dur_sum+""+ dur_sum /24+""+chaptername.size()+""+score;

text.set(recordstr);

context.write(text,NullWritable.get());

1.3 Job对象负责管理和运行MapReduce的一个计算任务

在main()主函数中新建一个Job对象,负责管理和运行MapReduce的一个计算任务,并设定任务的输出和输入路径,将预处理后的数据保存为csv文件。

2 建立机器学习模型

经过MapReduce清洗和预处理后的在线学习者的学习行为数据将用于构建机器学习模型。为了挖掘学习行为与学业表现的相关性,本文运用Scikit-Learn库中K-means模型,对学生各行为指标和学习绩效指标进行相关分析[5]。学习者的参与程度和努力程度将会对学习者的学习质量产生影响,因此了解学生的学习投入情况是至关重要的,并对学习投入程度过低的学习者进行有针对性的干预。本文确定了学习者2个特征指标,如表1所示。

表1 学习者特征要素

K-means是一种典型的聚类算法,该算法是基于不同对象特征值间的相似度,来确定对象的归属问题。本文使用K-means模型对预处理后的数据文件takypen.csv中数据进行聚类,以便分析成绩与学习投入之间关系。takypen.csv文件包含有4个特征,分别如下:day_mean(学习天数);play_mean(学习时长);chapters_mean(学习章节数);score(在线测试成绩)。前3个字段对应学习投入指标,score字段对应学习绩效指标,通过KMeans模型训练得到预测列type,该列即为预测出的学习投入度。

2.1 Scikit-Learn库中K-means模型的结构

sklearn.cluster.KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=0.0001,

precompute_distances='auto',verbose=0,random_state=None,

copy_x=True,n_jobs=1,algorithm='auto')

2.2 建立K-means聚类模型

kmeans=KMeans(n_clusters=3,n_init=10,tol=0.0002, random_state=0).fit(X)

2.3 模型评估

#属性Labels_是获取每个点的分类

labels=kmeans.labels_

acc = float((labels==y).sum())/len(y)

print('KMeans 准确率为:%.2f' %(acc))

3 学习行为画像的实现

3.1 基于高斯朴素贝叶斯模型的学习者分类预测

本文使用Scikit-Learn库提供的高斯朴素贝叶斯模型构建分类器,根据学习天数、学习时长、学习的章节数等行为特征来判断学习者属于哪一类,为学习者加一个分类标签。takypen.csv文件中存放了学习行为特征数据,使用GaussianNB类建立高斯朴素贝叶斯模型并进行学习者分类预测,实现方法如下。

(1)数据归一化处理,并建立训练数据集。

数据归一化处理对于大部分机器学习算法而言都是一种常规要求,如果单个特征没有或多或少地接近于标准正态分布,那么它可能并不能在模型中表现出很好的性能。利用preprocessing类的MinMaxScaler()提前对特征数据进行归一化后再使用高斯朴素贝叶斯模型做训练,模型准确率将会大大提升,即数据归一化处理对模型评分会有一定程度的提升。

data_csv = pd.read_csv('takypen.csv')

X_train = preprocessing. MinMaxScaler (data_csv.drop(['type'],axis=1))

y_train = np.ravel(data_csv[['type']])

(2)通过训练集,构建高斯朴素贝叶斯模型。

gb= GaussianNB()

model_GaussinaNB = gb.fit(X_train,y_train)

y_predict_GaussianNB= model_GaussinaNB.predict(X_test)

print("y_predict_GaussianNB: ",y_predict_GaussianNB)

(3)将一个新的测试数据(33,40,10)带入模型得到预测结果如图2所示,该模块预测出学习者的标签为简单体验者(Easy_learning),如图1所示。

图1 运行结果

z_data ={'day_mean':['33'],'play_mean':['40'],'chapters_mean':['10']}

Z_data =pd.DataFrame(z_data,columns=['day_mean','play_mean','chapters_mean'])

print('Test_data: ',Z_data)

Z_model_predict=model_GaussinaNB.predict(Z_data)

#每个标签下样本最大的概率

Z_model_proba=model_GaussinaNB.predict_proba(Z_data)

print('Test_predict:',Z_model_predict)

print('Test_probability:',Z_model_proba)

(4)预测结果的平均值和预测正确率,如图1所示。

y_test_mean=np.mean(y_predict_GaussianNB==y_test)

print('y_test_GaussianNB_mean:%.2f '%y_test_mean)

print('y_test_GaussianNB_ave_accuracy:%.2f '%gb.score(X_test,y_test))

本研究以准确性、召回率和F1这3个指标对高斯朴素贝叶斯模型在分类任务上的性能进行评估,如图2所示。

图2 分类任务评估

由图2可知,本研究通过高斯朴素贝叶斯分类器对测试样本分类,可以得到平均准确率、平均召回率以及平均F1指标,分别为0.79,0.78和0.78。

3.2 用户画像实现

本文选取了用户学习过程中12天的数据作为样本进行研究,在前端JS文件中引用echarts.js来获取学习者行为数据,使用折线图和柱状图进行展示。图3可以很直观地看出用户访问的次数和学习时长的总和及平均值分析结果。

图3 学习者画像展示

4 学习效果画像的实现

4.1 基于K-means算法的群体画像分析

采用构建的K-means模型对takypen.csv中的数据进行训练,得到的训练结果中包含4个特征值列和1个目标值列。其中,目标值列包含了3个数字0,1,2,分别对应的分类标签为:Highl-yinvestment,Moderateinvestment,Lowinvestment。本文根据107个结果样本数据中的这4个特征以及3类标签来研究学习者的学习投入度与在线测试成绩之间的关系[6],实现方法如下。

4.1.1 导入数据并提取特征值和目标值

训练数据是由107个样本和4列特征值组成,其中4列特征值为day_mean,play_mean,chapters_mean和score,学习投入度标签Highlyinvestment,Moderatei-nvestment,Lowinvestment分别用数字0,1,2表示,type列是由标签数组转换成的数字数组。

4.1.2 数据解析

本研究通过describe()函数对每一个特征列数据进行统计,包括计数、均值、标准偏差、最小值、最大值、各个分位数等,执行print(takypen.describe())后的运行结果如图4所示。

4.2 学习投入指标与学习表现

本研究以三维散点图分析各特征变量对学习成绩的影响,并借助3个维度特征来反映学习者的学习效果,这三维特征分别是:在线测试成绩、学习次数和学习时长。学习者群体画像的三维散点图如图5所示。

图4 运行结果

由图5可知,学习者的学习投入偏高时,知识点掌握水平多为优秀;学习投入中等偏低时,知识点掌握水平为中等水平;学习投入偏低时,知识点掌握水平则较差。综上,聚类为高度投入的学习者整体学习情况优秀,聚类为中度投入的学习者整体学习情况良好,聚类为低投入的学习者的整体学习情况较差。

5 结语

首先,本文通过MapReduce程序对在线学习者的痕迹数据进行数据清洗和预处理,从而得到了学习者的学习行为数据。其次,构建K-means聚类模型为学习者生成学习投入度和学习效果的画像信息,并根据学习天数、学习总时长、学习章节数等行为特征指标,使用高斯朴素贝叶斯模型构建分类器对学习者分类,并采用K-means回归方法对学习者进行了群体画像分析,形成了3类学习者的群体画像标签。最后,本文使用Echarts和Seaborn生成相关数据图表,以便对学习者画像进行可视化展示。因为采集的学习者行为数据样本数量不够,所以本文选择了高斯朴素贝叶斯的模型,该模型的特点就是对训练数据量要求不大,如果训练数据量比较大,还可以选择其他的分类模型。

图5 群体画像三维散点图

猜你喜欢

朴素画像贝叶斯
威猛的画像
“00后”画像
画像
朴素的安慰(组诗)
他是那样“笨拙”和朴素——30多年后,我们为什么还需要读路遥?
最神奇最朴素的两本书
贝叶斯公式及其应用
基于贝叶斯估计的轨道占用识别方法
一种基于贝叶斯压缩感知的说话人识别方法
IIRCT下负二项分布参数多变点的贝叶斯估计