回归分析

回归分析是用来评估变量之间关系的统计过程。用来解释自变量X与因变量Y的关系。即当自变量X发生改变时,因变量Y会如果变化。

线性回归

线性回归,是回归分析的一种,评估的自变量X和因变量Y之间是一种线性关系、

简单线性回归

我们以房屋面积(x)与房屋价格(y)为例,两者是一种线性关系,我们假设比例为\omega

\hat{y}=\omega *x

为了能够让方程具有更广泛的适应性,增加一个截距,设为b

\hat{y}=\omega *x+b

多元线性回归

现实中的数据比较复杂,自变量也很可能不只一个。例如,影响房屋价格也很有可能不止房屋面积一个因素,可能还有房间数量,房屋所在的层数,房屋建筑年代等诸多因素。但是各个因素对房屋价格影响的力度(权重)是不同的。因此,我们使用多个权重来表示多个因素与房屋价格的关系:

\hat{y}=\omega_{_{1}} *x_{1}+\omega_{_{2}} *x_{2}+\omega_{_{3}} *x_{3}+\cdot \cdot \cdot +\omega_{_{n}} *x_{n}+b

  • x:影响因素,即特征。
  • \omega:每个x的影响力度。
  • n:特征的个数。
  • \hat{y}:房屋的预测价格。

我们也可以使用向量的表示方法,设\vec{x}\vec{\omega}为两个向量:

\vec{\omega}=(\omega_{1}, \omega_{2},\omega_{3},...,\omega_{n})^{T}

\vec{x}=(x_{1}, x_{2},x_{3},...,x_{n})^{T}

则方程可以表示为:

\hat{y}=\sum_{j=1}^{n}\omega _{j}*x_{j}+b =\vec{\omega }^{T}*\vec{x}+b

我们可以进一步简化,为向量\vec{\omega}\vec{b}各加入一个分量\omega _{0}b_{0},并且令:

x_{0}=1

\omega _{0}=b

于是

\vec{\omega}=(\omega_{0},\omega_{1}, \omega_{2},\omega_{3},...,\omega_{n})^{T}

\vec{x}=(x_{0},x_{1}, x_{2},x_{3},...,x_{n})^{T}

这样

\hat{y}=\sum_{j=0}^{n}\omega _{j}*x_{j}+b =\vec{\omega }^{T}*\vec{x}

损失函数

损失函数,也称目标函数或代价函数,简单的说,就是关于误差的一个函数。损失函数用来衡量模型预测值与真实值之间的差异。机器学习的目标,就是要建立一个损失函数,使得该函数的值最小。

损失函数我们习惯使用J来表示,例如,J(\omega )则表示以\omega为自变量的函数。在线性回归中,我们使用平方损失函数(最小二乘法),定义如下:

J(\omega )=\frac{1}{2}\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{(i)})^{2}=\frac{1}{2}\sum_{i=1}^{m}(y^{(i)}-\vec{\omega}^{T}*\vec{x}^{(i)} )^{2}

  • m:样本的个数。
  • \hat{y}:预测值。
  • y:真实值。

简单线性回归程序

import numpy as  np
from sklearn.linear_model import LinearRegression ###线性回归的类
from sklearn.model_selection import train_test_split###切分训练集与测试集
from sklearn.datasets import load_iris

import warnings

warnings.filterwarnings('ignore')
##设置输出的精度  默认为8

np.set_printoptions(precision=2)

iris = load_iris()


###花瓣长度作为X,花瓣宽度作为y
X, y = iris.data[:, 2].reshape(-1,1), iris.data[:, 3]
###
lr = LinearRegression()
####random_state 随机种子 用来产生相同的随机数序列
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state=0)
###训练
lr.fit(X_train, y_train)
print("权重", lr.coef_)
print("截距", lr.intercept_)
y_hat = lr.predict(X_test)
print("实际值", y_test[:5])
print("预测值", y_hat[:5])

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 15
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, c = 'orange', label='训练集')
plt.scatter(X_test, y_test, c = 'g', marker = 'D', label='测试集')
plt.plot(X, lr.predict(X), 'r-')
plt.legend()

plt.figure(figsize=(15,6))
plt.plot(y_test, label='真实值', color='r', marker='o')
plt.plot(y_hat, label = '预测值', ls='--', color = 'g', marker='o')
plt.xlabel('预测集数据序号')
plt.ylabel('数据值')
plt.legend()

回归模型评估

  • MSE
  • RMSE
  • MAE
  • R^{2}

MSE,平均平方误差,为所有样本数据误差(真实值与预测值之差)的平方和,然后取均值。

MSE=\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{​{i}})^{2}

RMSE,平均平方误差的平方根,即在MSE的基础上,取平方根。

RMSE=\sqrt{MSE}=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{​{i}})^{2}}

MAE,平均绝对值误差,为所有样本数据误差的绝对值和。

MAE=\frac{1}{m}\sum_{i=1}^{m}\left |y^{(i)}-\hat{y}^{​{i}} \right |

R^{2}为绝对系数,用来表示模型拟合性的分值,值越高表示模型拟合性越好,在训练集中,R^{2}的取值范围为\left [ 0,1 \right ],在测试集中,R^{2}的取值范围为\left [ -\infty,1 \right ]

R^{2}的计算公式为1减去RSSTSS的商。其中,TSS为所有样本数据与均值的差异,是方差的m倍。而RSS为所有样本数据误差的平方和,是MSE的m倍。

R^{2}=1-\frac{RSS}{TSS}=1-\frac{\sum_{i=1}^{m}(y^{(i)}-\hat{y}^{​{i}})^{2}}{\sum_{i=1}^{m}(y^{(i)}-\bar{y})^{2}}

\bar{y}=\frac{1}{m}\sum_{i=1}^{m}y^{(i)}

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

print("均方误差", mean_squared_error(y_test, y_hat))
print("根均方误差", np.sqrt(mean_squared_error(y_test, y_hat)))
print("平均绝对值误差", mean_absolute_error(y_test, y_hat))
print("训练集R^2", r2_score(y_train, lr.predict(X_train)))
print("测试集R^2", r2_score(y_test, y_hat))


###score其实求解的就是r^2的值,但是r2_score方法与score方法传递参数的内容不同的

print("训练集R^2", lr.score(X_train, y_train))
print("测试集R^2", lr.score(X_test, y_test))


版权声明:本文为qq_21573621原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_21573621/article/details/105941070