线性回归是众多回归算法中的基础,它是研究1个或多个自变量对因变量的影响程度及关系的研究方法。
1、算法原理
在线性回归领域,最基础的就是最小二乘法,也是应用最多的。它在sklearn科学计算包中已经有了完整的模型,可以直接使用。这里,我仅简单说明最小二乘法的原理。
图说明了我们期望通过点获取的目标函数y=ax+b。右侧是样本数据集,下面是按照该样本建立的优化模型。到这里,我们只需要找到使得f(a,b)最小的解就行了。到此打住,因为我们不需要再深入理解,我们的目标使用,而不是解题(涉及到高数内容,不是谁都能看懂的)。至于如何计算这里不做公式探讨,毕竟计算机可以帮我们实现,下面就来看看如何用。
2、算法演示
下面使用sklearn的数据集进行演示,如下:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
数据预处理,并将数据切分为训练和测试数据,如下:
diabetes_X = diabetes_X[:, np.newaxis, 2]
diabetes_X_train = diabetes_X[:-30]
diabetes_X_test = diabetes_X[-30:]
diabetes_y_train = diabetes_y[:-30]
diabetes_y_test = diabetes_y[-30:]
plt.scatter(diabetes_X_train, diabetes_y_train, color="black")
plt.show()
训练数据的散点图,如下:
从散点图上,可以观测到数据是从左下角向右上角的一个走势,具有一定的规律,可以进行线性回归分析。使用sklearn中的LinearRegression()模型进行拟合,如下:
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train)
diabetes_y_pred = regr.predict(diabetes_X_test)
print(f"系数: {regr.coef_[0]:.2f}\n截距: {regr.intercept_:.2f}\n回归方程:y = {regr.coef_[0]:.2f}*x + {regr.intercept_:.2f}")
print("MSE: %.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred))
print("拟合优度R^2: %.2f" % r2_score(diabetes_y_test, diabetes_y_pred))
数据输出结果,如下:
系数: 941.43
截距: 153.40
回归方程:y = 941.43*x + 153.40
MSE: 3035.06
拟合优度R^2: 0.41
可以看到,模型使用训练数据拟合的回归方程的均方差为3035.06,拟合优度为0.41,说明其线性相关性较高。那我们再画一个图来比较下:
plt.scatter(diabetes_X_test, diabetes_y_test, color="black")
plt.plot(diabetes_X_test, diabetes_y_pred, color="blue", linewidth=2)
plt.title(f'formula : $y = {regr.coef_[0]:.2f}*x + {regr.intercept_:.2f}$')
plt.show()
回归曲线和测试散点效果图,如下:
经过原理讲解和实例演示,相信小伙伴已经可以使用LinearRegression做回归分析了,期望小伙伴可以用到实际数据分析中。特别的,回归分析是一种有监督学习,在使用中如果样本质量越高,拟合效果越好。
参考文献:
[1] scikit-learn developers.User Guide : Linear Regression v1.5.0 [S/OL].[2024-5-27]
---------知识需要分享,需要传播---------
这里是Python知识驿站,致力于知识传播,让更多人了解Python、使用Python、爱上Python。如果你是一名程序员、业余开发者、IT从业者,或者任何一名对Python感兴趣的人,都可以加入Python知识驿站,让我们一同畅享在知识的海洋中。
---------关注我,获得更多知识---------