大数据线性回归预测学生成绩
大数据线性回归预测学生成绩
本文通过训练集训练和测试集测试来生成多个线性模型,从而预测学生成绩。所有代码已上传至GitHub,读者可以点击访问。
1. 实验数据背景
1.1 数据来源
本项目的数据来源于kaggle.com,数据集的名称为Student Grade Prediction,由Paulo Cortez提供,数据来自葡萄牙Minho大学。数据集的详细信息可以在以下链接找到:http://www3.dsi.uminho.pt/pcortez
1.2 数据简介
该数据集包含了两所葡萄牙学校的中学学生的学习成绩。数据属性包括学生成绩、人口统计学、社会和与学校相关的特征,数据通过学校报告和调查表进行收集。提供了两个关于两个不同学科表现的数据集:数学(mat)和葡萄牙语(por)。
该数据集共有396条记录,每条记录包含33个属性,属性简介如下:
- 学校 - 学生学校(二进制:“GP”-加布里埃尔·佩雷拉或“MS”-Mousinho da Silveira)
- 性别 - 学生的性别(二进制:“F”-女性或“M”-男性)
- 年龄 - 学生的年龄(数字:15至22)
- 地址 - 学生的家庭住址类型(二进制:“U”-城市或“R”-农村)
- famsize - 家庭大小(二进制:“LE3”-小于或等于3或“GT3”-大于3)
- Pstatus - 父母的同居状态(二进制:“T”-同居或“A”-分开)
- Medu - 母亲的教育(数字:0-无,1-初等教育(四年级),2 – 5至9年级,3 –中等教育或4 –高等教育)
- Fedu - 父亲的教育(数字:0-无,1-初等教育(四年级),2 – 5至9年级,3 –中等教育或4 –高等教育)
- Mjob - 母亲的工作(名义:“教师”,“与健康”有关的,民事“服务”(例如行政或警察),“在家”或“其他”)
- Fjob - 父亲的工作(名义:“教师”,“与健康”相关的,民事“服务”(例如行政或警察),“在家”或“其他”)
- 理由 - 选择这所学校的理由(名义:接近“家”,学校“声誉”,“课程”偏好或“其他”)
- 监护人 - 学生的监护人(名词:“母亲”,“父亲”或“其他”)
- traveltime - 学校到学校的旅行时间(数字:1-<15分钟,2-15至30分钟,3-30分钟至1小时或4-> 1小时)
- 学习时间 - 每周学习时间(数字:1-<2小时,2-2至5小时,3-5至10小时或4-> 10小时)
- 失败 - 过去类失败的次数(数字:如果1 <= n ❤️,则为n,否则为4)
- schoolsup - 额外的教育支持(二进制:是或否)
- famsup - 家庭教育支持(二进制:是或否)
- paid - 课程主题内的额外付费课程(数学或葡萄牙语)(二进制:是或否)
- activities - 课外活动(二进制:是或否)
- nursery - 上托儿所(二进制:是或否)
- higher - 想要接受高等教育(二进制:是或否)
- internet - 在家上网(二进制:是或否)
- romantic - 具有浪漫关系(二进制:是或否)
- family - 家庭关系的质量(数字:从1-非常差到5-极好)
- freetime - 放学后的空闲时间(数字:从1-非常低到5-非常高)
- goout - 与朋友外出(数字:从1-非常低到5-非常高)
- Dalc - 工作日酒精消耗(数字:从1-非常低到5-非常高)
- Walc - 周末酒精消耗(数字:从1-非常低至5-非常高)
- health - 当前的健康状况(数字:从1-非常差到5-非常好)
- absences - 缺勤人数(数字:0到93)
这些成绩与课程主题(数学或葡萄牙语)相关: - G1 - 第一期成绩(数字:0至20)
- G2 - 第二学期成绩(数字:0至20)
- G3 - 最终成绩(数字:0到20,输出目标)
2. 研究思路
数据集中存在不少非数值型数据,所以在进行建模之前要进行数据清洗,主要是抛弃掉一些非相关性数据以及缺失值处理,对数据进行分析的时候要注意其中是否有缺失值。
一些机器学习算法能够处理缺失值,比如神经网络,一些则不能。对于缺失值,一般有以下几种处理方法:
(1)如果数据集很多,但有很少的缺失值,可以删掉带缺失值的行;
(2)如果该属性相对学习来说不是很重要,可以对缺失值赋均值或者众数。
(3)对于标称属性,可以赋一个代表缺失的值,比如‘U0’。因为缺失本身也可能代表着一些隐含信息。
(4)使用回归 随机森林等模型来预测缺失属性的值。因为Age在该数据集里是一个相当重要的特征(先对Age进行分析即可得知),所以保证一定的缺失值填充准确率是非常重要的,对结果也会产生较大影响。一般情况下,会使用数据完整的条目作为模型的训练集,以此来预测缺失值。对于当前的这个数据,可以使用随机森林预测也可以使用线性回归预测。这里使用随机森林预测模型,选取数据集中的数值属性作为特征(因为sklearn的模型只能处理数值属性,所以这里先仅选取数值特征,但在实际的应用中需要将非数值特征转换为数值特征)
数据规范化后方可进行数据分析,本项目将首先拿出一些特定属性,通过绘制图标的形式单独分析该属性反映出来的信息,试图分析该属性对结果的影响。
最后将对全部数据建立线性模型,并把数据集分为训练集和测试集,以测试模型的准确性。
3. 具体步骤
3.1 数据总体分析
利用padans库的read_csv函数,可以读取数据集:
# 初始化数据
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei') # 解决Seaborn中文显示问题
student = pd.read_csv('student-mat.csv')
格式化后展示如图3-1-1
图3-1-1数据格式化读取数据后,可以利用describe方法对单个属性分析,分析结果包括平均值,最值,标准差等,以G3属性为例,结果如图3-1-2所示
图3-1-2 describe函数对单个属性分析
3.2 利用图表分析属性
3.2.1各分数段学生计数
对学生期末成绩直接分析,可以得出成绩的大致分布,那么后文在分析其他因素对成绩的影响时也会更有针对性
# 根据人数多少统计各分数段的学生人数
grade_counts = student['G3'].value_counts().sort_values().plot.barh(width=.9,color=sns.color_palette('inferno',40))
grade_counts.axes.set_title('各分数值的学生分布',fontsize=30)
grade_counts.set_xlabel('学生数量', fontsize=30)
grade_counts.set_ylabel('最终成绩', fontsize=30)
plt.show()
绘制出的图像如图3-2-1所示:
图3-2-1 各分数段学生统计图
3.2.2 学生成绩分布直方图
3.2.1节中的图像并没有告诉我们有价值的信息,也许我们真正需要的是成绩分布直方图,即把成绩作为一个坐标轴,代码如下:
# 从低到高展示成绩分布图
grade_distribution = sns.countplot(student['G3'])
grade_distribution.set_title('成绩分布图', fontsize=30)
grade_distribution.set_xlabel('期末成绩', fontsize=20)
grade_distribution.set_ylabel('人数统计', fontsize=20)
plt.show()
绘制出的图像如图3-2-2所示:
图3-2-2 期末成绩分布图
可以看出得10分和11分的学生数量很多,虽然这只是一个中等成绩,大部分学生的成绩分布在8-15分之间。更值得注意的是,居然有接近40个人得了0分,不由得让我怀疑0其实是null值,但是在检查之后发现,确实是0值,外国学生这么菜?
3.2.3 年龄因素分析
中学生正处在身体机能快速发育的时期,大脑亦是如此,不同智力水平的学生势必会得到不同的分数,因此有必要分析一下年龄对成绩的影响,并且考虑到性别因素。
以下代码可以得出性别的相关数据:
# 分析性别比例
male_studs = len(student[student['sex'] == 'M'])
female_studs = len(student[student['sex'] == 'F'])