基本概述
线性回归是基于输入特征预测连续目标变量的基本监督机器学习算法。顾名思义,它假设因变量和自变量之间的关系是线性的。因此,如果我们试图将因变量Y绘制为自变量X,我们将得到一条直线。这条直线的方程可以表示为:
其中,
- Y 预测输出。
- X = 多元线性回归中的输入特征或特征矩阵
- b0 = 截距(直线与Y轴的交点)。
- b1 = 斜率或决定直线陡峭程度的系数。
线性回归的核心思想是找到最佳拟合线,使得实际值和预测值之间的误差最小化。它通过估计b0和b1的值来实现这一目标。然后,我们利用这条直线进行预测。
使用Scikit-Learn实现
现在你已经了解了线性回归的理论,为了进一步巩固我们的理解,让我们使用Python中一流的机器学习库Scikit-Learn构建一个简单的线性回归模型。请跟随以下步骤以更好地理解。
1. 导入必要的库
首先,你需要导入所需的库。
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
2. 分析数据集
你可以在这里找到数据集。它包含用于训练和测试的独立的CSV文件。在继续之前,让我们显示并分析我们的数据集。
# 从CSV文件中加载训练和测试数据集
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
# 显示训练数据集的前几行以了解其结构
print(train.head())
输出:
数据集包含2个变量,我们希望根据x的值来预测y。
# 检查训练和测试数据集的信息,如数据类型和缺失值
print(train.info())
print(test.info())
输出:
RangeIndex: 700 entries, 0 to 699
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x 700 non-null float64
1 y 699 non-null float64
dtypes: float64(2)
memory usage: 11.1 KB
RangeIndex: 300 entries, 0 to 299
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x 300 non-null int64
1 y 300 non-null float64
dtypes: float64(1), int64(1)
memory usage: 4.8 KB
上面的输出显示我们的训练数据集中有一个缺失值,可以通过以下命令删除:
train = train.dropna()
此外,在将数据集输入模型之前,检查数据集是否包含任何重复项并将其删除。
duplicates_exist = train.duplicated().any()
print(duplicates_exist)
输出:
False
2. 数据集预处理
现在,通过以下代码准备训练和测试数据和目标:
# 提取训练和测试数据集的x和y列
X_train = train['x']
y_train = train['y']
X_test = test['x']
y_test = test['y']
print(X_train.shape)
print(X_test.shape)
输出:
(699, )
(300, )
您可以看到,我们有一个一维数组。虽然您可以在某些机器学习模型中使用一维数组,但这并不是最常见的做法,而且可能导致意外的行为。因此,我们将上述数组重塑为(699,1)和(300,1),以明确指定我们每个数据点有一个标签。
X_train = X_train.values.reshape(-1, 1)
X_test = X_test.values.reshape(-1,1)
当特征处于不同的尺度时,某些特征可能会主导模型的学习过程,导致不正确或次优的结果。为此,我们执行标准化,使得我们的特征具有0的均值和1的标准差。
之前:
print(X_train.min(),X_train.max())
输出:
(0.0, 100.0)
标准化:
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
print((X_train.min(),X_train.max())
输出:
(-1.72857469859145, 1.7275858114641094)
现在,我们已经完成了必要的数据预处理步骤,我们的数据已经准备好用于训练目的。
4. 可视化数据集
首先,重要的是要可视化目标变量和特征之间的关系。您可以通过制作散点图来实现此目的:
# 创建散点图
plt.scatter(X_train, y_train)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('训练数据的散点图')
plt.grid(True) # 启用网格
plt.show()
5. 创建并训练模型
现在,我们将使用Scikit Learn创建一个线性回归模型的实例,并尝试将其拟合到我们的训练数据集中。它会找到最适合您数据的线性方程的系数(斜率)。然后使用该线来进行预测。此步骤的代码如下:
# 创建线性回归模型
model = LinearRegression()
# 将模型拟合到训练数据中
model.fit(X_train, y_train)
# 使用训练好的模型对测试数据的目标值进行预测
predictions = model.predict(X_test)
# 计算均方误差(MSE)作为评估指标来评估模型性能
mse = mean_squared_error(y_test, predictions)
print(f'均方误差为:{mse:.4f}')
输出:
均方误差为:9.4329
6. 可视化回归线
我们可以使用以下命令绘制回归线:
# 绘制回归线
plt.plot(X_test, predictions, color='red', linewidth=2, label='回归线')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('线性回归模型')
plt.legend()
plt.grid(True)
plt.show()
输出:
结论
到此为止!您已成功使用Scikit-learn实现了一个基本的线性回归模型。您在这里所学到的技能可以扩展到处理具有更多特征的复杂数据集。这是一个值得在您的空闲时间探索的挑战,为数据驱动的问题解决和创新开启了大门。Kanwal Mehreen是一位有着对数据科学和医学中人工智能应用的浓厚兴趣的有抱负的软件开发者。Kanwal被选为2022年亚太地区的Google Generation Scholar。Kanwal热衷于通过撰写有关热门话题的文章分享技术知识,并致力于改善科技行业中女性的代表性。