第3章 机器学习简单示例

为更好理解机器学习中的有关概念和流程,我们以一个实际案例来说明,这个实例需求就是根据(输入数据为房子面积,目标数据为房子价格),建立一个模型对新房价进行预测。

  • 输入数据(只有一维):房子面积
  • 目标数据(只有一维):房子价格
  • 需要做的:就是根据已知的房子面积和价格进行机器学习,建立一个模型,找到它们之间的内在关系。

下面我们就一步步地进行操作。

1、获取与预处理数据

查看源数据:

system head -5 ./data/python_and_ml/prices.txt
['2104,399900', '1600,329900', '2400,369000', '1416,232000', '3000,539900']

显示前5行数据,每行数据由‘房子面积,房子价格’组成,这些数据比较大,相差也比较大,故需要对源数据进行标准化处理,使用如下公式:

其中  表示房子面积的均值、std(X)表示X的标准差,具体实现代码如下:

%matplotlib inline
#导入需要的库
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)最小,从而求出相关参数。

当然,这里我们采用数理统计中的正规方程方法。具体实现代码如下:

#在(-2,4)这个区间上取100个点作为画图的基础
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为一个不错选择。

通过这个简单实例,我们对机器学习的大致流程有个大致了解,对机器学习相关概念也有更具体认识,对后续更复杂的机器学习应该有了一个很好的基础。

 

 

 

 

机器学习简单示例》有1个想法

  1. Pingback引用通告: Python与人工智能 – 飞谷云人工智能

评论已关闭。