11. 多元线性回归程序示例(with codes)

类似的,我们也可以实现多元线性回归。这里,我们需要创建多个特征(x),我们也可以像之前程序那样,随机生成多个特征,不过,这里,我们使用sklearn库提供的更方面的方法。

  • make_regression
from sklearn.datasets import make_regression
make_regression(n_samples=5, n_features=2, coef=False, bias=5.5, random_state=0, noise=10)

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics

  • 程序展示
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
# 可以生成用于回归分析的样本数据与对应的标签。
from sklearn.datasets import make_regression

# 参数说明:
# n_samples:生成的样本数量。
# n_features:生成的特征数量。(有几个x)
# coef:是否返回方程的权重(w)。如果该值为True,则返回X,y与coef。
# 如果该值为False,仅返回X与y。默认为False。
# bias:偏置值(截距),也就是方程中的b。
# random_state:设置随机种子。
# noise:噪声的值。该值会影响数据的波动情况。值越大,波动性越大。
X, y, coef = make_regression(n_samples=1000, n_features=2, coef=True, bias=5.5, random_state=0, noise=10)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"实际权重:{coef}")
lr = LinearRegression()
lr.fit(train_X, train_y)
print(f"权重:{lr.coef_}")
print(f"截距:{lr.intercept_}")
y_hat = lr.predict(test_X)
print(f"均方误差:{mean_squared_error(test_y, y_hat)}")
print(f"训练集R^2:{lr.score(train_X, train_y)}")
print(f"测试集R^2:{lr.score(test_X, test_y)}")

多元线性回归模型python代码 多元线性回归模型程序_可视化_02

  • meshgrid的演示
# meshgrid的演示
x1 = np.array([2, 3, 4])
x2 = np.array([2, 3, 4, 5])
X1, X2 = np.meshgrid(x1, x2)
display(X1)
display(X2)

多元线性回归模型python代码 多元线性回归模型程序_可视化_03

程序解释

多元线性回归模型python代码 多元线性回归模型程序_可视化_04

前一元线性回归,样本点,标签值,是自己造的,
现在新引入make_regression

调用make regression,有几个参数,
N_samples 生成的样本数量,默认是100,
N_features 生成的特征数量,有几个x 指定为2 就是二元,
coef是否返回生成的权重,也就是w的值
根据什么进行随机
因为里面是有方程的
比如y=w1x1+w2x2

Coef True的话
X
Y
w

Coef False的话

X

y

多元线性回归模型python代码 多元线性回归模型程序_多元线性回归程序_05


Bias是偏置,默认也是0。

why?

因为线性回归不一定都是过原点的。

多元线性回归模型python代码 多元线性回归模型程序_可视化_06

Noise 是噪声,影响y值波动的情况。
然后切分,生成数据集里面的实际权重,上面的make_regresstion

拟合情况,noise设定的是5.5,

多元线性回归模型python代码 多元线性回归模型程序_可视化_07


训练集都不好的话,训练集也不会好;测试集的表现重要一些,把样本数据 和 样本数据对应的标签都放进去。

多元线性回归模型python代码 多元线性回归模型程序_可视化_08


看到均方误差,是不是就很大了?

不是,因为数量积不一样,这里面权重打多了。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_09的值是0.97,上一个才0.92。

12. 多元线性回归模型可视化(with codes)

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
#Axes3D 用来绘制3D图形的类。
from mpl_toolkits.mplot3d import Axes3D

# 设置绘图后,以弹出框的形式显示。因为嵌入显示(默认)的形式,图像为一张图片,
# 无法进行拖动而转换角度。这在三维图中不利于观察。
%matplotlib qt

# 分别返回x1与x2两个特征的最大值。
max1, max2 = np.max(X, axis=0)
# 分别返回x1与x2两个特征的最小值。
min1, min2 = np.min(X, axis=0)
# 在x1轴的区间上取若干点。
x1 = np.linspace(min1, max1, 30)
# 在x2轴的区间上取若干点。
x2 = np.linspace(min2, max2, 30)
# 接收两个一维数组。进行网格扩展。过程:将x1沿着行进行扩展,扩展的行数与x2含有的元素
# 个数相同。将x2沿着列进行扩展,扩展的列数与x1含有的元素个数相同。返回扩展之后的X1与X2(并非
# 就地修改)。X1与X2的形状(shape)是相同的。
# 扩展的目的:依次对位取出X1与X2中的每个元素,就能够形成x1与x2(原始的一维数组x1与x2)中任意
# 两个元素的组合,进而就能够形成网格的结构。
X1, X2 = np.meshgrid(x1, x2)
# 创建一个画布对象,用于绘制图像。
fig = plt.figure()
# 创建Axes3D对象,用于绘制3D图。参数指定画布对象,表示要在哪个
# 画布上进行绘制。(要绘制图像,就不能离开画布对象的支持。)
ax = Axes3D(fig)
# 绘制3D散点图。
ax.scatter(X[:, 0], X[:, 1], y, color="b")
# 绘制3D空间平面(曲面)。预测的y_hat值需要与X1或X2的形状相同。
# rstride 在行(row)的方向上前进的距离。
# cstride 在列(column)的方向上前进的距离。
# 距离越大,网格越宽。
# cmap colormap,指定绘制的风格。可以通过plt.cm.颜色图对象进行指定。
# alpha 指定透明度。
surf = ax.plot_surface(X1, X2, lr.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
        rstride=5, cstride=5, cmap=plt.cm.rainbow, alpha=0.5)
# 显示颜色条。可以观察到每种颜色所对应的值。参数指定为那个图像对象所设定。
fig.colorbar(surf)
plt.show()

多元线性回归模型python代码 多元线性回归模型程序_多元线性回归程序_10


多元线性回归模型python代码 多元线性回归模型程序_可视化_11

程序解释

接下来把这个多元线性回归进行可视化,也就是matplotlib绘制三维图。

Axes3D 这个类,可以绘制三维的图,
Qt 弹出框,可以拖动多角度观察。
Notebook是一种绘图展示风格,默认的时inline。

如果值都是一样 底面产生不了面 只有线

多元线性回归模型python代码 多元线性回归模型程序_可视化_12


问题来了,如何在底面上形成一个面,

因为每个 x1 x2 都是相同的。点非常密集的话,就可以产生一条线,无限多的点,形成一个面。底下的每个点在空间中映射成面,送到方程中。

多元线性回归模型python代码 多元线性回归模型程序_可视化_13


生成底下的网格,Meshgrid。X1 x2 都取一段区间

Why?

找区间 任意两两点 进行组合。

多元线性回归模型python代码 多元线性回归模型程序_多元线性回归程序_14


X是什么? 样本数据集上的点。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_15


整个数组里面返回最大值,不是想要的,想要的axis为0。可以说大Xshape 1000行 2列,画成表格。

不加axis为0,就是求整个ndarray数组的最大最小值
Axis是统计方式。

求最大值 最小值why?
为了确定底面的位置,为了求底面的面积。

底面取到哪个位置,没有数据点,没有意义,乱生成。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_16


取x1 x2 所在的位置,在哪儿呢?

分别求x1 x2 的最小值 最大值 就拿出来了,

蓝色点 x数据集 通过方程生成。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_17


创建axes3d对象,用于绘制3d图。绘制3d 散点图,

传3个参数,X1 x2 对应空间中还有y值。

多元线性回归模型python代码 多元线性回归模型程序_可视化_18


Y的值生成了,每两个x对应一个y。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_19


等下就要绘制平面,Meshgrid 传两个一维数组,形成网状。如何进行网格的扩展的呢?

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_20


X1扩展到跟x2的元素的个数。

多元线性回归模型python代码 多元线性回归模型程序_可视化_21


X2沿着列 扩展 ,扩展列数 和 x1元素个数相同。

多元线性回归模型python代码 多元线性回归模型程序_可视化_22


依次对位,形成网格。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_23


然后网格在方程里面 生成Y,程序实现。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_24


两两形成 坐标点;送到模型中,形成面。

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_25


返回扩展之后x1 与x2。

注意:并不是就地修改,而是返回扩展之后的结果。

Surface, 它会依次取出x1 x2中的点。

所有 x 产生y

多元线性回归模型python代码 多元线性回归模型程序_可视化_26


在空间中,

Predict要的是一个矩阵的形式,

模型训练:2个特征 ,

X的形状,

把x ravel 。

多元线性回归模型python代码 多元线性回归模型程序_多元线性回归程序_27


这里是第二种思维

又创建了

X1 RAVELE 一维数组

X2 ….

作为外面数组的第一个第二个数组

创建了一个数组

二行 900列

咱么得边为 9000 2列

把两个元素 ravel之后放到数组中

但是我们要构成坐标点

相当于x y z z得和x1 x2 形状相同

多元线性回归模型python代码 多元线性回归模型程序_可视化_28


因为x1 x2 毕竟 3030的
而我们这个是 900
1

多元线性回归模型python代码 多元线性回归模型程序_sklearn.metrics_29


行和列上前进的宽度

多元线性回归模型python代码 多元线性回归模型程序_多元线性回归程序_30


Y=x1^2 + x2^2?