本站消息

  出租广告位,需要合作请联系站长

  今日名言-想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗 。——马克斯威尔·马尔兹

  今日名言-用谅解、宽恕的目光和心理看人、待人。人就会觉得葱笼的世界里,春意盎然,到处充满温暖。——蔡文甫


+关注
已关注

分类  

python(8)

java(2)

标签  

python(5)

java(1)

日期归档  

暂无数据

《Python数据科学》-线性回归

发布于2021-07-25 06:15     阅读(544)     评论(0)     点赞(5)     收藏(3)


1 简单线性回归

1.1 通过一个小例子入门

我非常喜欢吃披萨,每次吃披萨的时候我都记录下来披萨的直径和价格,有一次和朋友们聊天,讨论多大的披萨大概需要花多少钱的话题,我想了想,这个我有发言权啊。。。因为我吃的多啊,有经验啊,其实机器和人是一样的,给机器足够的样本数据,当机器再看到一个陌生的新数据的时候,就会根据以往的规律预测出结果。
我找到了最近5次的外卖订单:

序号直径(寸)价格(元)
167
289
31013
41417.5
51818

借助motplotlib对训练数据进行可视化:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
plt.rcParams['font.sans-serif'] = "SimHei" # 设置显示中文,防止乱码
plt.style.use('ggplot')  # 使用‘ggplot样式’ 会好看一些
# sklearn中习惯把特征向量的矩阵命名为X
# 大写字母表示矩阵,小写字母表示向量 一种习惯
X = np.array([6,8,10,12,14]).reshape((-1,1)) 
# reshape(-1,1) -1表示,将np.array对象转换成1列,行数自动转换,本例中有五个元素,最后转换成5行一列的矩阵  
y = np.array([7,9,13,17.5,18])
plt.plot(X,y,'bo')  # 画图 ‘bo’表示 [color=blue][market='o'][linstyle='-']
plt.title("披萨直径与价格散点图") # 图表标题
plt.xlabel("直径(寸)") # 图表横坐标标记
plt.ylabel("价格(元)") # 图表纵坐标标记
plt.grid(True)   # 显示背景网格
plt.show() # 显示图像

在这里插入图片描述
从上面的图中可以看的出来,披萨的直径与价格有正相关关系,这个结果和我平时吃披萨时候的经验是相符的

1.2 用sklearn写出线性模型

from sklearn.linear_model import LinearRegression
model = LinearRegression() # 创建一个线性回归实例
model.fit(X,y)  # 用训练数据拟合模型
test_pizza = np.array([[12]]) # 新建一个测试数据,披萨的直径
predicted_price = model.predict(test_pizza)[0]  # 返回一个np.array类型的测试结果集
print("12寸的披萨应该卖%.2f元"%predicted_price)
"""
OUT:
12寸的披萨应该卖15.95元
"""

简单线性模型假设响应变量(输入)和解释变量(输出)之间存在线性关系
LinearRegression是sklearn众多模型中的一种,所有的模型都实现了fit和predict方法,fit用于学习模型的参数,predict用来预测一个新的输入,给出一个预测的输出。
在这里插入图片描述

2 LinearRegression怎么写的

对于简单线性回归来说:
y = α + β x y = \alpha + \beta x y=α+βx
x 是解释变量就是pizza实例中的直径,y是预测值,是pizza实例中的价格, α \alpha α β \beta β就是模型需要训练的参数,如果有一些数学基础肯定知道, α \alpha α就是直线的截距, β \beta β就是直线的斜率,这两个参数直接影响线在平面中的位置。

在这里插入图片描述
对于模型来说可能存在多条直线,那么哪一条是最优的,这个最优的直线应该怎么找到?
对于简单线性回归使用残差平方和(RSS)作为损失函数,实例点到训练直线的垂直距离的和平方和作为残差平方和。
代价函数,也是损失函数,它用于定义和衡量一个模型的误差
在这里插入图片描述
残差平方和公式: S S r e s = ∑ i = 1 n ( y i − f ( x i ) ) 2 SS_res = \sum_{i=1}^{n} (y_i-f(x_i))^2 SSres=i=1n(yif(xi))2

np.sum((model.predict(X)-y)**2)
残差平方和计算公式

3 求解简单线性回归的OLS(最小二乘)

简单线性回归由 y = α + β x y = \alpha + \beta x y=α+βx给出,我们的目标是计算损失函数的最小值得出 α \alpha α β \beta β
为了计算 α \alpha α β \beta β
首先熟悉几个数学概念

3.1 求方差

方差 方差描述一组数据的偏离程度,如果方差为0,那么这组数据都相等,方差小意味着这组数据都接近均值,如果数据中有偏离均值很远的值那么方差会很大

v a r ( x ) = ∑ i = 1 n ( x i − x ‾ ) 2 n − 1 var(x) = \frac{\sum_{i=1}^{n}(x_i- \overline x)^2}{n-1} var(x)=n1i=1n(xix)2
x ‾ \overline x x : 表示x的均值
x i x_i xi : 表示第i个值
n n n : 表示x的数据总量

肯定有人会问,为什么分母是n-1 不是n,这是贝塞尔校正,纠正了样本中总体方差估计的偏差

计算披萨直径的方差 方法一

X
"""
array([[ 6],
       [ 8],
       [10],
       [14],
       [18]])
"""
(np.sum((X - X.mean())**2)) / (X.shape[0] - 1 )
# 23.2

计算披萨直径的方差 方法二

np.var(X,doff=1) # doff是贝塞尔校正
# 23.2

3.2 求协方差

协方差 协方差用于衡量两个变量如何一同变化
如果变量一起增加,协方差为正
如果一个变量增加一个变量减少,协方差为负
如果一个变量的变化不会影响另一个变量,协方差为0

方式一 使用协方差公式计算

c o v ( x , y ) = ∑ i − 1 n ( x i − x ‾ ) ( y i − y ‾ ) n − 1 cov(x,y)=\frac {\sum_{i-1}^{n}(x_i-\overline x)(y_i-\overline y) }{n-1} cov(x,y)=n1i1n(xix)(yiy)

x,y : 必须都是一维向量
x ‾ \overline x x : x的均值
y ‾ \overline y y : y的均值
n:样本数量
i :第i个样本

np.multiply((X - np.mean(X)).transpose(),(y-np.mean(y))).sum() / (X.shape[0] - 1)
# 公式可能比较长,但是并不复杂,numpy的广播特性真的超级好用
22.65

方式二 直接使用np.cov()

# np.cov(x,y)
np.cov(X.transpose(),y)[0][1]
22.65

3.1 求 β \beta β α \alpha α

β = c o v ( x , y ) v a r ( x ) \beta= \frac {cov(x,y)}{var(x)} β=var(x)cov(x,y)

α = y ‾ − β x ‾ \alpha=\overline y - \beta\overline x α=yβx

y ‾ \overline y y是y的均值; x ‾ \overline x x是x的均值

( x ‾ \overline x x, y ‾ \overline y y)是质心的坐标,模型必须经过这个点

β = 22.65 23.2 ≈ 0.98 \beta= \frac {22.65}{23.2}\approx0.98 β=23.222.650.98

α = y ‾ − β x ‾ ≈ 1.92 \alpha=\overline y - \beta\overline x\approx1.92 α=yβx1.92

4 评价模型

首先来一组测试数据:

序号直径(寸)真实价格(元)预测价格
18119.77586207
298.510.75215517
3111512.70474138
4161817.5862069
5121113.68103448

4.1 先预测一波

x_test = np.array([8,9,11,16,12]).reshape((-1,1))
y_test = model.predict(x_test)
y_test
# OUT
"""
array([ 9.77586207, 10.75215517, 12.70474138, 17.5862069 , 13.68103448])
"""

4.2 模型靠谱吗?算一算

方式一

使用衡量方法评估模型的预测能力,R方决定系数等于皮尔森积差相关系数的平方。

R方必须是0~1之间的数

S S t o t = ∑ i = 1 n ( y i − y ‾ ) 2 SS_{tot} = \sum_{i=1}^{n}(y_i - \overline y)^2 SStot=i=1n(yiy)2

y i y_i yi : 第i个观测值
y ‾ \overline y y : 观测值的平均值

y = np.array([11,8.5,15,18,11])
np.sum((y-np.mean(y))**2)
# out 
56.8

S S r e s = ∑ i = 1 n ( y i − f ( x i ) ) 2 SS_{res}=\sum_{i=1}^{n}(y_i - f(x_i))^2 SSres=i=1n(yif(xi))2
y i y_i yi : 第i个观测值
f ( x i ) f(x_i) f(xi) : 对应的预测值

np.sum((y-y_test)**2)
#out
19.20

R 2 = 1 − S S r e s S S t o t = 1 − 19.20 56.8 ≈ 0.66 R^2=1-\frac{SS_{res}}{SS_{tot}}=1-\frac{19.20}{56.8}\approx0.66 R2=1SStotSSres=156.819.200.66

方式二 使用模型的score方法

X = np.array([6,8,10,14,18]).reshape([-1,1])
y = np.array([7,9,13,17.5,18])
model = LinearRegression()
model.fit(X,y)
x_test = np.array([8,9,11,16,12]).reshape((-1,1))
y_test = np.array([11,8.5,15,18,11])
model.score(x_test,y_test)
# OUT
0.6620052929422553

原文链接:https://blog.csdn.net/kobe_okok/article/details/119009085



所属网站分类: 技术文章 > 博客

作者:小酷狗

链接:http://www.pythonpdf.com/blog/article/426/4907f2bb4b360175149a/

来源:编程知识网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)