您的位置:首页 > 编程语言 > Python开发

一个机器学习中线性回归的“乞丐版”Python示例

2020-07-13 05:40 363 查看

通过一个机器学习中线性回归的简单例子,演示机器学习原理

机器学习的本质
利用数据,找到数学模型,进行预测,解决问题

一个简化的问题举例
张三在某个地段看了几套不同大小的二手房,得到的报价如下:

现在他又看中了一套120平的房子,那么这套房子的报价应该在多少比较合适呢?

利用数据训练模型
假设房价(y)和面积(x)符合一元线性关系:y=kx+b,利用现有的数据,找到最佳的参数值k和b,也就是在下图中确定一条直线,“拟合”图中的点,就找到了我们的预测模型:

为简化示例,我们目测估计斜率k在(0,100)之间,截距b也大概在(0,100)之间,我们利用暴力穷举的方式,以0.1为步长,尝试每一个每一个k和b,寻找最佳的那个。

问题是,如何判断k和b的好坏呢?从意识上讲,我们要让图中的点尽量“靠近”这条直线,从数学上,我们需要一个概念:
损失函数:简单的讲,损失函数是模型和实际值之间的差距。例如在本例中,对于不同的k和b,每代入一组x,会得到一组y’,这组y’和实际值y必然存在差距,用一个函数来计算这个差距,就是损失函数。例如,我们如果计算y’和y之间的距离的平均值,就是MAE(平均绝对误差):

在不考虑过拟合的情况下,我们需要找到使得MAE最小的k和b,以下是python代码:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([80, 90, 110, 130, 150])# 训练数据x:房子大小
y = np.array([100, 110, 115, 130, 160]) # 训练数据y:房子价格
plt.scatter(x, y)

#损失函数MAE
def MAE_los(y, y_hat):
return np.mean(np.abs(y_hat - y))

#一元函数的计算
def linear(x, k, b):
y = k * x + b
return y

min_los = float('inf') # 当前损失值
for k in np.arange(0, 100, 0.1): # 穷举k
for b in np.arange(0, 100, 0.1): # 穷举b
y_hat = [linear(xi, k, b) for xi in list(x)]
current_lost = MAE_los(y, y_hat)
if current_lost < min_los: # 寻找最小的损失值
min_los = current_lost
best_k, best_b = k, b
print('best k is {},best b is {}'.format(best_k, best_b))

#画出结果
y_hat = best_k * x + best_b
plt.plot(x, y_hat, color='red')
plt.grid()
plt.show()

输出:
best k is 0.6000000000000001,best b is 52.0

利用模型预测
通过上面的计算,我们找到了最佳的模型:
y=0.8x+36
回到开始的问题本身,张三看到一套120平的房子,价格应该在多少比较合适?将数字代入模型
y=0.6*120+52=124

实际应用中的若干概念和问题

  • 特征维度
    现实生活中的,决定房价不仅仅是面积,还有区域、房型、交通情况,因此需要 x1,x2,x3…,这些特征的值,构成了模型中的权重,模型训练的目标,就是找到合适的权重值
  • 特征编码
    对于模型计算来说,计算的对象必然是数值型,因此像“区域”、“房型”这样的数据,我们需要对其进行编码,编码方式有:独热编码(One-Hot Encoding)、标签编码(label Encoding)等
  • 训练集、验证集、测试集
    实际使用中,一般拥有的数据量比较大(太少的数据也没有意义),会将数据划为3部分:
    训练集(training data set,约60%):用于训练模型(如本例中全部用作训练集)
    验证集(validation data set,约20%):模型训练完成后,验证模型性能,调整模型参数,如在神经网络中选择隐藏单元数
    测试集(test data set, 约20%):测试最终模型的性能和能力
  • 过拟合和欠拟合
    在本例中,如果最后得到的直线距离所有的点都很远,就是欠拟合。
    如果不选择线性函数,而是高次幂的曲线函数,或者分区间的一次函数,可以令曲线经过所有的点,从而达到损失值等于0,但是当我们使用测试集数据测试的时候,会发现偏离很大,这就是过拟合。(类似奔现的网友,没了美图秀秀)
  • 计算复杂度和优化
    由于实际应用中,训练数据量往往庞大,纬度又很多,如果用本例中的暴力穷举,肯定无法计算出结果。可以通过牛顿梯度下降法优化复杂度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: