回归模型

发布 : 2017-05-16 分类 : 深度学习 浏览 :

传统上而言,编程就是设定好每一步骤让程序实现某个结果,机器学习将它反过来了,我们先定义结果,程序进行自我学习,寻找步骤来实现它

比如,想做一个识别车牌的程序,不需要直接把代码写出来,
而是告诉机器如何识别数百种特征,
比如给机器车牌字母的形状、颜色这些样本数据,让机器自己去摸索步骤,来识别它们

机器学习分类

  • 监督学习:给模型一些带标签的数据集,如车的图片,机器收到反馈[每一步都收到反馈],哪些信息是正确的,哪些是错误的
    机器将标签和数据做映射,就能解决给定的任务,如:将图像中的汽车进行分类
  • 无监督学习:给模型一堆没有标签的数据集,机器没有获得正确与否的反馈,需要自我学习数据的结构解决给定的任务(大部分数据都没有标记且杂乱无章)[从头到尾都没有反馈]
  • 强化学习:模型并未立刻收到反馈,只有在达到目标时才收到反馈,例如创建一个强化学习机器人,让它学习下棋击败人类,它只会在它赢棋那一刻收到反馈[与环境互动、不断试错]

预测动物体重

数据地址

不同动物的测量值的数据集,要根据大脑重量来预测动物的体重,因为这些数据都已有标签,将采用监督学习,采取机器学习的方式叫做”回归”

散点图上会显示出所有的数据点,x轴代表脑重、y轴代表体重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-

# 导入pandas阅读数据集
import pandas as pd
# 使用机器学习库
from sklearn import linear_model
# matplotlib将模型和数据可视化
import matplotlib

matplotlib.use('agg')
import matplotlib.pyplot as plt

# read data
# 数据集包含平均体重和脑重,针对不同物种
# 将固定列宽格式的数据转化成pandas的dataframe对象[行和列组成的而二维数据结构]
datafram = pd.read_fwf('/data/DeepLearning/brain_body.txt')
# 将测量值读入两个单独的变量
# 脑重值
x_values = datafram[['Brain']]
# 体重值
y_values = datafram[['Body']]
# 目标:给一个新动物的体重,就能预测出它的脑容量是多少

# train model on data
# 通过线性模型对象来初始化线性回归
body_reg = linear_model.LinearRegression()
# 将模型与真实的x、y值做对比,将x、y值标在一张散点图上
body_reg.fit(x_values, y_values)

predict_result = body_reg.predict(16.760)

print("根据脑重预测动物体重:", predict_result)

# visualize results
# 做回归线
# 对于每个x值,预测它的y值,作出那条线
# plt.scatter(x_values,y_calues)
# plt.plot(x_values,body_reg.predict(x_values))
# 通过show函数来显示
# plt.show()

运行结果

1
根据脑容量预测动物体重: [[ 107.20287533]]

大脑重量和体重之间似乎有很强的关联性,根据回归线,给定任意大脑重量,我们都能相应地预测体重

传统编程是认为定义步骤来实现结果,机器学习则是定义结果,程序自己寻找实现方式

线性回归在自变量和因变量之间建立模型,构建出一条最佳拟合直线,可以用它来做预测

线性回归注意事项

线性回归会根据训练数据生成直线模型。

如果训练数据包含非线性关系,需要选择:调整数据(进行数据转换)、增加特征数量或改用其他模型

容易受到异常值影响

线性回归的目标是求取对训练数据而言的 “最优拟合” 直线。如果数据集中存在不符合总体规律的异常值,最终结果将会存在不小偏差。

但若添加若干不符合规律的异常值,会明显改变模型的预测结果

多元线性回归

如果预测结果取决于多个变量,则需相应创建更加复杂的模型

只要所选自变量/预测变量适合当前场景,增加变量有助于改善预测结果

在只有单个预测变量时,线性回归模型是一条直线,而增加预测变量,相当于增加图像维度

在仅有单个预测变量时,直线模型的公式为

1
y=mx+b

图像如下所示:

1
y=m​1x1+m​2x2+...+m​nxn+b

此时需要使用三维图像来进行展示,线性回归模型也变成了平面:

预测变量的数量可以超过两个,甚至在合适的情况下多多益善!

若使用n个预测变量,那么模型公式则为:

模型中的预测变量越多,就越难以通过图像展示

幸好线性回归的其他环节不发生变化,仍然可以用相同方式拟合模型和做出预测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding: utf-8 -*-

from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# 使用波士顿房价数据集,数据集中包含 506 栋房屋的 13 个特征与房价中值(单位为 1000 美元)
# 根据这 13 个特征拟合模型,并预测房价

boston_data = load_boston()
x = boston_data['data']
y = boston_data['target']


def product_model():
'''
# 构建线性回归模型
# 使用scikit-learn的LinearRegression创建回归模型,然后赋予model变量
# 根据数据拟合模型
:return:
'''
model = LinearRegression()
model.fit(x, y)
return model


def make_prediction(model):
sample_house = [
[2.29690000e-01, 0.00000000e+00, 1.05900000e+01, 0.00000000e+00, 4.89000000e-01, 6.32600000e+00, 5.25000000e+01,
4.35490000e+00, 4.00000000e+00, 2.77000000e+02, 1.86000000e+01, 3.94800000e+01, 1.09700000e+01]]
prediction = model.predict(sample_house)
print("预测结果:", prediction, " RMB")


if __name__ == "__main__":
md = product_model()
make_prediction(md)

本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2017/05/16/深度学习-回归模型/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹