如何使用sklearn进行简单的线性回归分析
引言
线性回归是机器学习中最基本、最常用的算法之一。它用于建立目标变量和一个或多个预测变量之间的线性关系。在Python中,scikit-learn
(简称sklearn
)是一个强大的机器学习库,提供了简单易用的接口来实现各种机器学习算法,包括线性回归。本文将详细介绍如何使用sklearn
进行简单的线性回归分析,适合初学者入门。
什么是线性回归?
线性回归是一种统计方法,用于研究因变量(目标变量)和一个或多个自变量(特征变量)之间的线性关系。简单线性回归只有一个特征变量,而多元线性回归有多个特征变量。线性回归的目标是找到一条直线,使得这条直线能够最好地拟合数据点。
线性回归模型的数学公式为:
[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + … + \beta_n x_n + \epsilon ]
其中:
- ( y ) 是目标变量
- ( x_1, x_2, …, x_n ) 是特征变量
- ( \beta_0 ) 是截距
- ( \beta_1, \beta_2, …, \beta_n ) 是回归系数
- ( \epsilon ) 是误差项
环境准备
在开始之前,请确保已经安装了以下Python库:
- numpy
- pandas
- matplotlib
- scikit-learn
可以使用以下命令进行安装:
pip install numpy pandas matplotlib scikit-learn
数据集准备
为了演示如何使用sklearn
进行线性回归,我们将使用一个简单的数据集。假设我们有一个包含房屋面积和价格的数据集,我们希望建立一个模型,通过房屋面积预测房屋价格。
首先,我们使用pandas
创建一个示例数据集:
import pandas as pd
# 创建示例数据集
data = {
'Area': [50, 60, 70, 80, 90, 100, 110, 120, 130, 140],
'Price': [150, 180, 210, 240, 270, 300, 330, 360, 390, 420]
}
df = pd.DataFrame(data)
print(df)
数据预处理
在进行线性回归分析之前,我们需要对数据进行一些预处理。包括特征选择和数据拆分等步骤。
特征选择
在本例中,我们的特征是房屋面积,目标变量是房屋价格。我们可以使用pandas
提取这些列:
X = df[['Area']] # 特征变量
y = df['Price'] # 目标变量
数据拆分
为了评估模型的性能,我们需要将数据集拆分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。在sklearn
中,我们可以使用train_test_split
函数进行数据拆分:
from sklearn.model_selection import train_test_split
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train)
print(X_test)
print(y_train)
print(y_test)
训练线性回归模型
现在,我们可以使用sklearn
中的LinearRegression
类来训练线性回归模型:
from sklearn.linear_model import LinearRegression
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
模型评估
训练完成后,我们需要评估模型的性能。可以通过以下几种方法来评估:
1. R²决定系数
R²决定系数表示模型解释变量方差的比例,取值范围在0到1之间。值越接近1,模型的解释力越强。可以使用score
方法计算R²决定系数:
# 计算R²决定系数
r2_train = model.score(X_train, y_train)
r2_test = model.score(X_test, y_test)
print(f"训练集R²决定系数: {r2_train}")
print(f"测试集R²决定系数: {r2_test}")
2. 均方误差(MSE)
均方误差是预测值与真实值之间差的平方的平均值。值越小,模型的预测效果越好。可以使用mean_squared_error
函数计算均方误差:
from sklearn.metrics import mean_squared_error
# 预测测试集结果
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse}")
可视化结果
为了更直观地理解模型的效果,可以使用matplotlib
可视化结果。绘制训练集和测试集的散点图以及回归直线:
import matplotlib.pyplot as plt
# 绘制训练集散点图
plt.scatter(X_train, y_train, color='blue', label='训练集数据')
# 绘制测试集散点图
plt.scatter(X_test, y_test, color='green', label='测试集数据')
# 绘制回归直线
plt.plot(X, model.predict(X), color='red', label='回归直线')
plt.xlabel('房屋面积 (平方米)')
plt.ylabel('房屋价格 (千元)')
plt.title('房屋面积与价格的线性回归')
plt.legend()
plt.show()
完整代码
为了方便阅读,下面是上述所有步骤的完整代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 创建示例数据集
data = {
'Area': [50, 60, 70, 80, 90, 100, 110, 120, 130, 140],
'Price': [150, 180, 210, 240, 270, 300, 330, 360, 390, 420]
}
df = pd.DataFrame(data)
# 特征选择
X = df[['Area']] # 特征变量
y = df['Price'] # 目标变量
# 数据拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 模型评估
r2_train = model.score(X_train, y_train)
r2_test = model.score(X_test, y_test)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"训练集R²决定系数: {r2_train}")
print(f"测试集R²决定系数: {r2_test}")
print(f"均方误差: {mse}")
# 可视化结果
plt.scatter(X_train, y_train, color='blue', label='训练集数据')
plt.scatter(X_test, y_test, color='green', label='测试集数据')
plt.plot(X, model.predict(X), color='red', label='回归直线')
plt.xlabel('房屋面积 (平方米)')
plt.ylabel('房屋价格 (千元)')
plt.title('房屋面积与价格的线性回归')
plt.legend()
plt.show()
结论
通过本文的介绍,你应该已经掌握了如何使用sklearn
进行简单的线性回归分析。我们首先介绍了线性回归的基本概念,然后详细讲解了如何使用sklearn
进行数据预处理、模型训练、模型评估和结果可视化。希望这些内容能帮助你更好地理解线性回归,并应用到实际的机器学习项目中。如果你有任何问题或需要进一步的帮助,欢迎随时交流!