如果您正在开始您的数据科学或机器学习之旅,线性回归可能是您可能正在学习的第一个机器学习算法或统计模型。它可能是机器学习和统计学中最简单和最著名的算法之一。在这里,我们将直观地探索简单的线性回归及其关键思想以及伪代码和 python 实现。
在开始线性回归或任何类型的回归之前,了解回归建模的概念至关重要。在统计领域,回归建模是一种用于制定 因变量和一组自变量之间的数学关系的方法。例如,您想估计某些人的体重,这受他们的饮食、身高和运动习惯的影响。这里,权重是因变量(结果),其余三个是自变量(预测变量)。
线性回归是一种统计算法吗?
机器学习的目标,更具体地说是预测建模,是通过在略读可解释性的同时做出最佳预测来最小化错误。在应用机器学习中,我们利用来自各个领域(主要是统计数据)的算法来实现这些目的。因此,线性回归起源于统计学领域,目的是为了理解输入和输出数值变量之间的关系,但工程学已将其借用于机器学习。因此,除了是一种统计算法之外,它还是一种机器学习算法。现在,让我们了解它的全部内容。
定义线性回归
线性回归是一种强大的监督机器学习算法,它假设因变量和自变量之间存在线性关系。它只是寻找最佳拟合线的处理器,它最准确地解释了依赖特征和独立特征之间的可变性。让我们假设线性回归是一台自动售货机,它接受一个输入变量(预测变量)x并返回一个输出变量(结果)y。如果只有一个输入变量或特征,我们称之为简单线性回归,如果有多个输入变量,我们称之为多元线性回归。有许多方程式可以表示一条直线,但我们将坚持使用以下方程式:
这里 βo 是 y 截距,β1 是斜率。让我们尝试借助图表来理解它。
在上图中:
- x 轴绘制我们的自变量x,y 轴绘制我们的因变量y
- 数据点(实际值)在这里用灰点表示
- βo 是 10 的截距,β1 是 x 变量的斜率。
- 根据我们的模型,蓝线是最佳拟合线,对应于预测值
- 误差或残差衡量数据点与回归线的距离,即它只是与我们的模型的偏差
正如我们从理论中知道的那样,线性回归方程包含两个系数,即βo 是截距,β1 是斜率。为了得到最佳拟合线,我们必须计算这些系数,下面会提到这个算法。
简单线性回归的伪代码
1. Start
2. Read Number of Data (n)
3. For i=1 to n:
Read Xi and Yi
Next i
4. Initialize:
sumX = 0
sumX2 = 0
sumY = 0
sumXY = 0
5. Calculate Required Sum
For i=1 to n:
sumX = sumX + Xi
sumX2 = sumX2 + Xi * Xi
sumY = sumY + Yi
sumXY = sumXY + Xi * Yi
Next i
6. Calculate Required Constant a and b of y = a + bx:
b = (n * sumXY - sumX * sumY)/(n*sumX2 - sumX * sumX)
a = (sumY - b*sumX)/n
7. Stop
使用 Python 实践线性回归算法
了解了理论之后,让我们学习如何在实践中使用 python 来做到这一点。Python 的优势在于我们不必从头开始实现流行的机器学习算法。从机器学习到数据可视化,都有 Python 库,拥有非常活跃的开发者社区。我们将使用 Scikit Learn 库来开发我们的线性回归模型。
SciKit 学习库的一个重要功能是它包含玩具数据集,使新用户在解决更复杂的问题之前可以轻松练习。我们将使用糖尿病数据集来演示线性回归模型。
第 1 步:导入库
我们将从导入相关库开始,其中一些非常重要的是:
- NumPy(执行某些数学运算)
- pandas(将数据存储在 pandas DataFrames 中)
- matplotlib.pyplot(我们将使用 matplotlib 与 seaborn 一起绘制数据)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
第 2 步:加载数据集
我们的下一步是将数据导入 DataFrame。DataFrame 是 python 中的一个对象,它将帮助我们以表格格式组织数据。现在让我们从 sklearn 的糖尿病数据集中加载数据并创建我们的数据框。
# Load the diabetes dataset
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
# Create dataframe and add column names
features = pd.DataFrame(diabetes_X, columns=["age","sex","bmi","bp", "tc", "ldl", "hdl","tch", "ltg", "glu"])
target = pd.DataFrame(diabetes_y, columns=["disease_progression"])
df = pd.merge(features,target, left_index=True, right_index=True)
第 3 步:可视化
现在让我们为所有变量绘制一个热图,以便在我们的数据集中找到一些相关性以获得直觉。
correlation_matrix = df.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(correlation_matrix, vmax=.8, square=True);
从热图中我们可以看出,与其他变量相比,年龄和疾病进展具有更高的相关性。您可以继续使用可视化,并可以从数据中找到有趣的见解。
第 4 步:执行简单的线性回归
首先,我们需要将数据集拆分为训练和测试数据集。我们将使用训练数据集训练我们的模型,然后使用测试数据集验证我们的模型。
# Split into validation and training data
diabetes_X_train, diabetes_X_test, diabetes_y_train, diabetes_y_test = train_test_split(features, target, test_size=0.1, random_state=1)
现在我们有了训练和测试数据集,我们将使用 sklearn 的 linear_model 创建一个 LinearRegression 对象,并使用训练数据集训练我们的模型。
# Create linear regression object
regr = linear_model.LinearRegression()
# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)
在我们的模型经过训练后,我们将通过针对测试数据集对其进行验证来评估我们的模型,如下所示
# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)
# The coefficients
print("Coefficients: \n", regr.coef_)
# The mean squared error
print("Mean squared error: %.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print("Coefficient of determination: %.2f" % r2_score(diabetes_y_test, diabetes_y_pred))
在上面的示例中,均方误差衡量回归线与一组数据点的接近程度,即观察到的数据点与预测值的接近程度。均方误差是通过取与函数相关的数据平方误差的平均值,特别是平均值来计算的。在数学上它可以表示为,
均方误差和r2 分数密切相关,但并不完全相同。它可以定义为“(模型解释的总方差)/总方差”。R平方比MSE更好。因为均方误差的值取决于变量的单位(即它不是标准化的量度),它可以随着变量单位的变化而变化。
结论
在介绍了线性回归和机器学习的最基本概念之后,是时候拿起一个数据集并将您的学习付诸实践了。