一个机器学习中线性回归的“乞丐版”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,但是当我们使用测试集数据测试的时候,会发现偏离很大,这就是过拟合。(类似奔现的网友,没了美图秀秀) - 计算复杂度和优化
由于实际应用中,训练数据量往往庞大,纬度又很多,如果用本例中的暴力穷举,肯定无法计算出结果。可以通过牛顿梯度下降法优化复杂度。
相关文章推荐
- 机器学习入门学习笔记:(2.2)线性回归python程序实现
- 机器学习python局部加权线性回归
- 通俗易懂地介绍梯度下降法(以线性回归为例,配以Python示例代码)
- 机器学习之线性回归:OLS 无偏估计及相关性python分析
- 7.4多元线性回归实例1--python机器学习
- 【机器学习】动手写一个全连接神经网络(二):线性回归
- 机器学习之线性回归 Linear Regression(二)Python实现
- 机器学习(一):线性回归_python
- python机器学习案例系列教程——线性函数、线性回归
- 机器学习之线性回归python实现
- 机器学习-线性回归2-python代码-房价预测-一维自变量
- python 线性回归示例
- Python 机器学习系列之线性回归篇深度详细
- 7.4多元线性回归实例1--python机器学习
- 【Python机器学习实战】一个案例迅速入门所有的Scikit-learn回归模型
- Python实现机器学习--实现多元线性回归
- 吴恩达机器学习第一次作业(python实现):线性回归
- python机器学习(二)线性回归
- 机器学习理论篇之线性回归(python实现)
- 机器学习-线性回归python简单实现