回归分析
回归分析是用来评估变量之间关系的统计过程。用来解释自变量X与因变量Y的关系。即当自变量X发生改变时,因变量Y会如果变化。
线性回归
线性回归,是回归分析的一种,评估的自变量X和因变量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()
回归模型评估
,平均平方误差,为所有样本数据误差(真实值与预测值之差)的平方和,然后取均值。
,平均平方误差的平方根,即在的基础上,取平方根。
,平均绝对值误差,为所有样本数据误差的绝对值和。
为绝对系数,用来表示模型拟合性的分值,值越高表示模型拟合性越好,在训练集中,的取值范围为,在测试集中,的取值范围为。
的计算公式为1减去与的商。其中,为所有样本数据与均值的差异,是方差的m倍。而为所有样本数据误差的平方和,是的m倍。
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))