背景
来自Coursera上的斯坦福大学机器学习课程:现有47个房子的面积和价格,需要建立一个模型对新的房价进行预测。
- 输入数据只有一维,亦房子的面积。
- 目标数据也只有一维,亦即房子的价格。
- 需要作的,就是根据已知的房子的面积和价格的关系进行机器学习
步骤
- 获取与处理数据
- 选择与训练模型
- 评估与可视化结果
代码
# 导入需要用到的库import numpy as npimport matplotlib.pyplot as plt'''第一步:获取与处理数据'''# 定义存储输入数据(x)和目标数据(y)的数组x, y = [], []# 遍历数据集,变量sample对应的正是一个个样本for sample in open("D:/Study/2022/06/prices.txt", "r"):# 由于数据是用逗号隔开的,所以调用Python的split方法并将逗号作为参数传入_x, _y = sample.split(",")# 将字符串数据转化为浮点数x.append(float(_x))y.append(float(_y))# 读取完数据后,将他们转化为Numpy数组以方便进一步的处理x, y = np.array(x), np.array(y)# 标准化x = (x - x.mean()) / x.std()# 将原始数据以散点图的形式画出plt.figure()plt.scatter(x, y, c = "g", s = 6)plt.show()'''第二步:选择与训练模型'''# 此处选择线性回归的多项式模型,采用常见的平方损失函数,借助Numpy库实现# 在(-2,4)这个区间上取100个点作为画图的基础x0 = np.linspace(-2, 4, 100)# 利用Numpy的函数定义训练并返回多项式回归模型的函数# deg参数代表着模型参数中的n,亦即模型中多项式的次数# 返回的模型能够根据输入的x(默认是x0),返回相对应的预测的ydef get_model(deg):return lambda input_x = x0: np.polyval(np.polyfit(x, y, deg), input_x)# polyfit(x, y, deg):该函数返回使得平方损失函数最小的参数p(多项式f的各项系数),该函数就是模型的训练函数。# polyval(p, x):根据多项式的各项系数p和多项式x的值,返回多项式的值y'''第三步:评估与可视化结果'''# 根据参数n,输入的x,y返回相对应的损失def get_cost(deg, input_x, input_y):return 0.5 * ((get_model(deg)(input_x) - input_y) ** 2).sum()# 定义测试参数集并根据它进行各种实验test_set = (1, 4, 10)for d in test_set:# 输出相应的损失print(get_cost(d, x, y))# n=1:96732238800.35292# n=4:94112406641.67741# n=10:75874846680.09283# 通过损失值看出n=10优于n=4,n=1最差,通过画图直观了解是否出现过拟合# 画出相应的图像plt.scatter(x, y, c = "g", s = 20)for d in test_set:plt.plot(x0, get_model(d)(), label = "degree = {}".format(d))# 将横轴、纵轴的范围分别限制在(-2,4)、(10^5, 8x10^5)plt.xlim(-2, 4)plt.ylim(1e5, 8e5)# 调用legend方法使曲线对应的label正确显示plt.legend()plt.show()# 通过画图看出n=4开始出现过拟合现象,n=10模型已经非常不合理
结果


