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)
- 程序展示
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)}")
- 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)
程序解释
前一元线性回归,样本点,标签值,是自己造的,
现在新引入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
Bias是偏置,默认也是0。
why?
因为线性回归不一定都是过原点的。
Noise 是噪声,影响y值波动的情况。
然后切分,生成数据集里面的实际权重,上面的make_regresstion
拟合情况,noise设定的是5.5,
训练集都不好的话,训练集也不会好;测试集的表现重要一些,把样本数据 和 样本数据对应的标签都放进去。
看到均方误差,是不是就很大了?
不是,因为数量积不一样,这里面权重打多了。
的值是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()
程序解释
接下来把这个多元线性回归进行可视化,也就是matplotlib绘制三维图。
Axes3D 这个类,可以绘制三维的图,
Qt 弹出框,可以拖动多角度观察。
Notebook是一种绘图展示风格,默认的时inline。
如果值都是一样 底面产生不了面 只有线
问题来了,如何在底面上形成一个面,
因为每个 x1 x2 都是相同的。点非常密集的话,就可以产生一条线,无限多的点,形成一个面。底下的每个点在空间中映射成面,送到方程中。
生成底下的网格,Meshgrid。X1 x2 都取一段区间
Why?
找区间 任意两两点 进行组合。
X是什么? 样本数据集上的点。
整个数组里面返回最大值,不是想要的,想要的axis为0。可以说大Xshape 1000行 2列,画成表格。
不加axis为0,就是求整个ndarray数组的最大最小值
Axis是统计方式。
求最大值 最小值why?
为了确定底面的位置,为了求底面的面积。
底面取到哪个位置,没有数据点,没有意义,乱生成。
取x1 x2 所在的位置,在哪儿呢?
分别求x1 x2 的最小值 最大值 就拿出来了,
蓝色点 x数据集 通过方程生成。
创建axes3d对象,用于绘制3d图。绘制3d 散点图,
传3个参数,X1 x2 对应空间中还有y值。
Y的值生成了,每两个x对应一个y。
等下就要绘制平面,Meshgrid 传两个一维数组,形成网状。如何进行网格的扩展的呢?
X1扩展到跟x2的元素的个数。
X2沿着列 扩展 ,扩展列数 和 x1元素个数相同。
依次对位,形成网格。
然后网格在方程里面 生成Y,程序实现。
两两形成 坐标点;送到模型中,形成面。
返回扩展之后x1 与x2。
注意:并不是就地修改,而是返回扩展之后的结果。
Surface, 它会依次取出x1 x2中的点。
所有 x 产生y
在空间中,
Predict要的是一个矩阵的形式,
模型训练:2个特征 ,
X的形状,
把x ravel 。
这里是第二种思维
又创建了
X1 RAVELE 一维数组
X2 ….
作为外面数组的第一个第二个数组
创建了一个数组
二行 900列
咱么得边为 9000 2列
把两个元素 ravel之后放到数组中
但是我们要构成坐标点
相当于x y z z得和x1 x2 形状相同
因为x1 x2 毕竟 3030的
而我们这个是 9001
行和列上前进的宽度
Y=x1^2 + x2^2?