html
在 Python 中实现和评估线性回归:全面指南

线性回归介绍
线性回归是机器学习和数据分析中最基本且广泛使用的算法之一。它通过拟合线性方程到观测数据,来建模一个因变量与一个或多个自变量之间的关系。在本指南中,我们将带您通过使用 scikit-learn 库在 Python 中实现线性回归,比较实际结果与预测结果,并使用 R 平方度量来评估模型的性能。
无论您是数据科学爱好者还是经验丰富的专业人士,这个全面的教程都将为您提供有效构建和评估线性回归模型的知识和实践技能。
目录
数据集概述
在这个教程中,我们将使用来自 Kaggle 的 加拿大人均收入 数据集。这个数据集提供了加拿大多年的年度人均收入信息,使我们能够分析收入趋势并构建预测模型。
环境设置
在深入代码之前,请确保您的系统上已安装 Python。建议使用虚拟环境来管理项目依赖。您可以使用 venv
或类似 conda
的工具来设置虚拟环境。
123456
# Using venvpython -m venv linear_regression_envsource linear_regression_env/bin/activate # On Windows: linear_regression_env\Scripts\activate # Install necessary packagespip install numpy pandas matplotlib seaborn scikit-learn
导入必要的库
我们首先导入进行数据操作、可视化和构建回归模型所需的基本库。
12345678910
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import r2_score # Set seaborn style for better aestheticssns.set()
加载和探索数据
接下来,我们将数据集加载到 Pandas DataFrame 中,并初步查看其结构。
12345
# Import Datadata = pd.read_csv('canada_per_capita_income.csv') # Preview the first few rows of the datasetprint(data.head())
输出:
123456
year per capita income (US$)0 1970 3399.2990371 1971 3768.2979352 1972 4251.1754843 1973 4804.4632484 1974 5576.514583
从输出中可以看出,数据集包含两列:year
和per capita income (US$)
。
数据可视化
可视化有助于理解数据中的潜在模式和关系。我们将创建一个散点图来可视化年份与人均收入之间的关系。
12345
sns.scatterplot(data=data, x='per capita income (US$)', y='year')plt.title('Per Capita Income Over Years in Canada')plt.xlabel('Per Capita Income (US$)')plt.ylabel('Year')plt.show()

散点图揭示了多年人均收入增长的趋势。然而,关系可能并非完全线性,表明数据存在潜在的波动性。
准备训练数据
在训练模型之前,我们需要通过将特征(自变量)与目标变量(因变量)分开来准备数据。
123
# Define features and target variableX = data.iloc[:, :-1] # All columns except the last oneY = data.iloc[:, -1] # The last column
在本例中,X
包含year
列,而Y
包含per capita income (US$)
。
构建线性回归模型
我们现在将数据分割为训练集和测试集,以评估模型在未见过的数据上的表现。
12
# Train-test splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=1)
解释:
- X_train & y_train: 用于训练模型。
- X_test & y_test: 用于测试模型的性能。
- test_size=0.20: 将 20% 的数据保留用于测试。
- random_state=1: 确保拆分的可复现性。
现在,让我们实例化并训练线性回归模型。
12345678
# Initialize the Linear Regression modelmodel = LinearRegression() # Fit the model to the training datamodel.fit(X_train, y_train) # Output the model detailsprint(model)
输出:
1
LinearRegression()
进行预测
通过训练好的模型,我们现在可以对测试集进行预测。
12345
# Make predictions on the test datay_pred = model.predict(X_test) # Display the predicted valuesprint(y_pred)
输出:
123
[20349.94572643 18613.49135581 33373.35350612 29900.44476487 1248.94764955 2117.17483487 24691.081653 27295.76320894 38582.716618 22086.40009706]
这些值代表了模型基于测试集中输入的年份预测的人均收入。
比较实际与预测结果
为了评估我们的模型表现,我们将比较实际值(y_test
)与预测值(y_pred
)。
1234567
# Create a DataFrame to compare actual and predicted valuescomparison = pd.DataFrame()comparison['Actual'] = y_testcomparison['Predicted'] = y_pred # Display the comparisonprint(comparison)
输出:
1234567891011
Actual Predicted24 15755.820270 20349.94572622 16412.083090 18613.49135639 32755.176820 33373.35350635 29198.055690 29900.4447652 4251.175484 1248.9476503 4804.463248 2117.17483529 17581.024140 24691.08165332 19232.175560 27295.76320945 35175.188980 38582.71661826 16699.826680 22086.400097
分析:
- 良好的预测: 当
Actual
和 Predicted
值接近时,表明模型表现良好。
- 差异: 显著的差异突出显示了模型可能需要改进的地方,或者关系并非完全线性的地方。
例如,虽然大多数预测值与实际值相当接近,但某些差异,如实际值为 4,251.18 时预测值为 1,248.95,表明模型未能捕捉到的波动性。
使用 R 平方评估模型
为了定量评估模型的性能,我们将使用 R 平方(R²)度量。R 平方表示模型中独立变量解释的因变量的方差比例。
1234
# Calculate R-squared scorer2 = r2_score(y_test, y_pred) print(f"R-squared Score: {r2:.2f}")
输出:
1
R-squared Score: 0.80
解释:
- R 平方值为 0.80 表明 80% 的人均收入方差由年份解释。
- 尽管 80% 是一个很好的拟合度,但这也意味着 20% 的方差尚未被解释,可能是由于模型中未考虑的其他因素或数据本身的波动性。
理解 R 平方值:
- 1: 完美拟合。模型解释了所有的变异性。
- 0: 无解释能力。模型未能解释任何变异性。
- 负值: 表明模型性能甚至不如一条水平线(目标变量的平均值)。
结论
在本指南中,我们成功地在 Python 中实现了一个线性回归模型,以预测加拿大多年来的人均收入。通过遵循这些步骤,您可以:
- 加载和探索数据: 了解数据集的结构和初步趋势。
- 可视化关系: 使用散点图识别潜在线性关系。
- 准备数据: 将数据分割为训练集和测试集,以进行无偏评估。
- 构建和训练模型: 利用 scikit-learn 的
LinearRegression
拟合模型。
- 进行预测: 使用训练好的模型生成预测。
- 比较结果: 分析预测值与实际数据的对齐程度。
- 评估性能: 使用 R 平方量化模型的解释能力。
虽然模型表现出了令人赞赏的 R 平方值,但仍有改进空间。探索额外的特征、转换变量或采用更复杂的算法可能会进一步提升预测性能。
进一步阅读
踏上这条线性回归之旅,您将掌握适用于各种数据驱动领域的基础技能。继续使用不同的数据集进行实践,以加深对机器学习的理解和熟练程度。
#LinearRegression #Python #MachineLearning #DataScience #ScikitLearn #R2Score #DataVisualization #PredictiveModeling #PythonTutorial