机器学习13:神经网络的反向传播实现
利用神经网络来预测学生录取情况
我们基于以下三条数据预测了加州大学洛杉矶分校 (UCLA) 的研究生录取情况:
- GRE 分数(测试)即 GRE Scores (Test)
- GPA 分数(成绩)即 GPA Scores (Grades)
- 评级(1-4)即 Class rank (1-4)
数据集来源: http://www.ats.ucla.edu/
加载数据
为了加载数据并很好地进行格式化,我们将使用两个非常有用的包,即 Pandas 和 Numpy。 你可以在这里阅读文档:
- https://pandas.pydata.org/pandas-docs/stable/
- https://docs.scipy.org/
admit |
gre |
gpa |
rank |
|
0 |
0 |
380 |
3.61 |
3 |
1 |
1 |
660 |
3.67 |
3 |
2 |
1 |
800 |
4.00 |
1 |
3 |
1 |
640 |
3.19 |
4 |
4 |
0 |
520 |
2.93 |
4 |
5 |
1 |
760 |
3.00 |
2 |
6 |
1 |
560 |
2.98 |
1 |
7 |
0 |
400 |
3.08 |
2 |
8 |
1 |
540 |
3.39 |
3 |
9 |
0 |
700 |
3.92 |
2 |
绘制数据
首先让我们对数据进行绘图,看看它是什么样的。为了绘制二维图,让我们先忽略评级 (rank)。
粗略来说,它看起来像是,成绩 (grades) 和测试 (test) 分数高的学生通过了,而得分低的学生却没有,但数据并没有如我们所希望的那样,很好地分离。 也许将评级 (rank) 考虑进来会有帮助? 接下来我们将绘制 4 个图,每个图代表一个级别。
现在看起来更棒啦,看上去评级越低,录取率越高。 让我们使用评级 (rank) 作为我们的输入之一。 为了做到这一点,我们应该对它进行一次one-hot 编码。
将评级进行 One-hot 编码
我们将在 Pandas 中使用 get_dummies
函数。
admit |
gre |
gpa |
rank |
rank_1 |
rank_2 |
rank_3 |
rank_4 |
|
0 |
0 |
380 |
3.61 |
3 |
0 |
0 |
1 |
0 |
1 |
1 |
660 |
3.67 |
3 |
0 |
0 |
1 |
0 |
2 |
1 |
800 |
4.00 |
1 |
1 |
0 |
0 |
0 |
3 |
1 |
640 |
3.19 |
4 |
0 |
0 |
0 |
1 |
4 |
0 |
520 |
2.93 |
4 |
0 |
0 |
0 |
1 |
5 |
1 |
760 |
3.00 |
2 |
0 |
1 |
0 |
0 |
6 |
1 |
560 |
2.98 |
1 |
1 |
0 |
0 |
0 |
7 |
0 |
400 |
3.08 |
2 |
0 |
1 |
0 |
0 |
8 |
1 |
540 |
3.39 |
3 |
0 |
0 |
1 |
0 |
9 |
0 |
700 |
3.92 |
2 |
0 |
1 |
0 |
0 |
admit |
gre |
gpa |
rank_1 |
rank_2 |
rank_3 |
rank_4 |
|
0 |
0 |
380 |
3.61 |
0 |
0 |
1 |
0 |
1 |
1 |
660 |
3.67 |
0 |
0 |
1 |
0 |
2 |
1 |
800 |
4.00 |
1 |
0 |
0 |
0 |
3 |
1 |
640 |
3.19 |
0 |
0 |
0 |
1 |
4 |
0 |
520 |
2.93 |
0 |
0 |
0 |
1 |
5 |
1 |
760 |
3.00 |
0 |
1 |
0 |
0 |
6 |
1 |
560 |
2.98 |
1 |
0 |
0 |
0 |
7 |
0 |
400 |
3.08 |
0 |
1 |
0 |
0 |
8 |
1 |
540 |
3.39 |
0 |
0 |
1 |
0 |
9 |
0 |
700 |
3.92 |
0 |
1 |
0 |
0 |
缩放数据
下一步是缩放数据。 我们注意到成绩 (grades) 的范围是 1.0-4.0,而测试分数 (test scores) 的范围大概是 200-800,这个范围要大得多。 这意味着我们的数据存在偏差,使得神经网络很难处理。 让我们将两个特征放在 0-1 的范围内,将分数除以 4.0,将测试分数除以 800。
admit |
gre |
gpa |
rank_1 |
rank_2 |
rank_3 |
rank_4 |
|
0 |
0 |
0.475 |
0.004513 |
0 |
0 |
1 |
0 |
1 |
1 |
0.825 |
0.004587 |
0 |
0 |
1 |
0 |
2 |
1 |
1.000 |
0.005000 |
1 |
0 |
0 |
0 |
3 |
1 |
0.800 |
0.003987 |
0 |
0 |
0 |
1 |
4 |
0 |
0.650 |
0.003663 |
0 |
0 |
0 |
1 |
5 |
1 |
0.950 |
0.003750 |
0 |
1 |
0 |
0 |
6 |
1 |
0.700 |
0.003725 |
1 |
0 |
0 |
0 |
7 |
0 |
0.500 |
0.003850 |
0 |
1 |
0 |
0 |
8 |
1 |
0.675 |
0.004237 |
0 |
0 |
1 |
0 |
9 |
0 |
0.875 |
0.004900 |
0 |
1 |
0 |
0 |
将数据分成训练集和测试集
为了测试我们的算法,我们将数据分为训练集和测试集。 测试集的大小将占总数据的 10%。
将数据分成特征和目标(标签)
现在,在培训前的最后一步,我们将把数据分为特征 (features)(X)和目标 (targets)(y)。
训练二层神经网络
已经准备数据,现在我们来训练一个简单的两层神经网络:
首先,我们将写一些 helper 函数。
误差反向传播
现在轮到你来练习,编写误差项。 记住这是由方程
计算测试 (Test) 数据的精确度
对于深度神经网络(多层神经网络),原理相同,需要通过链式法则,将错误函数反向传播到每层网络的对应节点,调整参数