线性回归模型
在机器学习中,线性回归模型是一种基础的模型算法,其数学原理通过最小二乘法使欧式距离(均方误差)最小化来求出w和b。
本篇文章将介绍一些数学原理,给定几个数据并通过scikit-learn库中集成的LinearRegression进行代码实现,再使用matplotlib进行可视化展示。
数学原理
线性回归模型的数学表达式:
其中线性回归模型就是通过一堆数据(x和y)来求出w和b,对于如何求出w和b,就需要求出均方误差(欧式距离):
然后分别对w和b求偏导:
分别令偏导为0,可以求出w和b的闭式解:
这个过程可能会有一点复杂,主要考察数学知识,联立两个偏导为0的式子和y = wx+b,既可以求出解来。
代码实现
根据python语言的天然优势,有很多可以拿来科学计算的库,比如scikit-learn,numpy,pandas,matplotlib,我们可以很快速的使用python代码来进行我们的科学计算和模型训练。
本篇文章使用scikit-learn库来实现一个简单的线性回归模型的训练和可视化展示,首先,如果之前没有安装过scikit-learn库,可以使用pip3进行安装。
pip3 install scikit-learn
安装之后导入scikit-learn库:
from sklearn.linear_model import LinearRegression#线性回归模型类 from sklearn.model_selection import train_test_split #区分训练集和测试集 from sklearn.metrics import r2_score #R2评估 import matplotlib.pyplot as plt #绘制图像专用库 import numpy as np #生成数据点专用
导入库之后输入数据集:
x = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13]]#注意必须要是二维数组 y = [1,4,9,16,25,36,49,64,81,100,121,144,169]
导入数据集之后区分训练集和测试集:
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 42,train_size = 0.8)
创建一个LinearRegression模型,并使用训练集进行训练
model = LinearRegression()
model.fit(x_train,y_train)
这样我们就训练得到了一个model模型,运用这个模型我们可以进行未知数据的预测
y_pred = model.predict(x_test)
接下来我们使用r2系数去评估这个模型
r2 = r2_score(y_test,y_pred) print(r2)
运行结果如下:
r2的值为0.2非常接近于1,说明模型训练很成功,接下来我们使用matplotlib库进行图像绘制。
plt.figure(figsize=(10,6)) plt.xlabel("x") plt.ylabel("y") x_plot = np.linspace(0,13,100)#创建100个0-13的点 y_plot = model.predict(x_plot.reshape(-1,1))#重新将x_plot数组转换为二维数组 plt.plot(x_plot,y_plot) plt.scatter(x_train,y_train) plt.scatter(x_test,y_test) plt.show()
运行之后的结果:
我们可以看到有一个直线去拟合了我们的数据点,这就是利用最小二乘法进行线性回归模型的最基础应用,具体的线性模型在生产生活中还有广泛应用。
完整代码展示:
from sklearn.linear_model import LinearRegression#线性回归模型类 from sklearn.model_selection import train_test_split #区分训练集和测试集 from sklearn.metrics import r2_score #R2评估 import matplotlib.pyplot as plt import numpy as np x = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13]]#注意必须要是二维数组 y = [1,4,9,16,25,36,49,64,81,100,121,144,169] x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 42,train_size = 0.8)model = LinearRegression() model.fit(x_train,y_train) y_pred = model.predict(x_test) r2 = r2_score(y_test,y_pred) print(r2) plt.figure(figsize=(10,6)) plt.xlabel("x") plt.ylabel("y") x_plot = np.linspace(0,13,100)#创建100个0-13的点 y_plot = model.predict(x_plot.reshape(-1,1))#重新将x_plot数组转换为二维数组 plt.plot(x_plot,y_plot) plt.scatter(x_train,y_train) plt.scatter(x_test,y_test) plt.show()