第3章 机器学习简单示例
为更好理解机器学习中的有关概念和流程,我们以一个实际案例来说明,这个实例需求就是根据(输入数据为房子面积,目标数据为房子价格),建立一个模型对新房价进行预测。
- 输入数据(只有一维):房子面积
- 目标数据(只有一维):房子价格
- 需要做的:就是根据已知的房子面积和价格进行机器学习,建立一个模型,找到它们之间的内在关系。
下面我们就一步步地进行操作。
1、获取与预处理数据
查看源数据:
['2104,399900', '1600,329900', '2400,369000', '1416,232000', '3000,539900']
显示前5行数据,每行数据由‘房子面积,房子价格’组成,这些数据比较大,相差也比较大,故需要对源数据进行标准化处理,使用如下公式:
其中 表示房子面积的均值、std(X)表示X的标准差,具体实现代码如下:
#导入需要的库
import numpy as np
import matplotlib.pyplot as plt
# 定义存储输入数据、目标数据的数组
x, y = [], []
#遍历数据集,变量sample对应每个样本
for sample in open("./data/python_and_ml/prices.txt", "r"):
x1, y1 = sample.split(",")
x.append(float(x1))
y.append(float(y1))
#把读取后的数据转换为numpy数组
x, y = np.array(x), np.array(y)
# 对x数据进行标准化处理
x = (x - x.mean()) / x.std()
# 可视化原数据
plt.figure()
plt.scatter(x, y, c="g", s=20)
plt.show()
这里横轴是标准化的房子面积,纵轴为房子价格,通过数据可视化,我们能很直观了解到原数据的分布情况,接下来我们开始训练模型。
2、 选择和训练模型
从数据可视化后的结果看来,我们可以通过线性回归(Linear Regression)中的多项式拟合来得到一个模型,该模型的数学表达式为:
构造模型的损失函数
其中f(x|p;n)就是我们的模型,p,n是模型参数,p是多项式f的各项系统,n是多项式的次数。L(p;n)是模型的损失函数,这里我们采用了常用的平方损失函数。x、y分别是输入向量和目标向量,它们都是47维的向量。
在确定模型后,接下来就开始编写代码训练模型。训练一般是最小化损失函数,这里就是使L(p;n)最小,从而求出相关参数。
当然,这里我们采用数理统计中的正规方程方法。具体实现代码如下:
x0 = np.linspace(-2, 4, 100)
#利用numpy的函数定义训练并返回多项式回归模型函数
# deg参数表示模型参数中的n
def get_model(deg):
return lambda input_x=x0: np.polyval(np.polyfit(x, y, deg), input_x)
其中polyval和polyfit都是numpy中的函数。
polyfit(x,y,deg):该函数返回使得上述损失函数 最小的参数p;
polyval:根据多项式的各项系统p和多项式中的x,返回多项式的y值。
3、 评估与可视化结果
模型训练好以后,接下来就要判断各种参数下模型的性能了,为简单起见,我们这里采用deg=1,4,10(即多项式最大次数分别为1,4,10),采用损失函数来衡量模型的性能。
def get_cost(deg, input_x, input_y):
return 0.5 * ((get_model(deg)(input_x) - input_y) ** 2).sum()
# 设置n的几个参数值
test_set = (1, 4, 10)
for d in test_set:
print(get_cost(d, x, y))
# Visualize results
plt.scatter(x, y, c="g", s=20)
for d in test_set:
plt.plot(x0, get_model(d)(), label="degree = {}".format(d))
plt.xlim(-2, 4)
plt.ylim(1e5, 8e5)
plt.legend()
plt.show()
损失值分别为:
96732238800.4
94112406641.7
75874846680.1
结果可视化图像:
从损失值来看,n=10时,损失值最小,当从图形来看,当n=10,显然存在过拟合。
n=4的损失值小于n=1,但从图形来看,n=4也是过拟合,所以综合来看,取n=1为一个不错选择。
通过这个简单实例,我们对机器学习的大致流程有个大致了解,对机器学习相关概念也有更具体认识,对后续更复杂的机器学习应该有了一个很好的基础。
Pingback引用通告: Python与人工智能 – 飞谷云人工智能