Python 中的回归样条——初学者介绍

本文介绍了 Python 中的回归样条曲线。它应该可以帮助您入门并为进一步学习和研究该主题奠定基础。

嘿,编码员!我相信您听说过线性回归,这是最简单的算法之一,它教授了很多有关因变量和非因变量之间的关系的知识。

结果通常是一条直线。问题是,在实际场景中,并不总是可能有一条直线。

为了克服这个问题,我们有多项式曲线(平滑曲线)。但多项式曲线可能变得超级复杂,因此需要避免。

为了克服这个缺点,在本教程中,我将向您介绍 Python 中可用的回归样条。

另请阅读:Logistic 回归 – 简单的实际实现

为了创建样条回归,整个数据集被分成更小的箱。并为每个箱预测回归线,并且单独的线通过结连接在一起。

现在我们已经清楚了回归样条的工作原理,接下来让我们转向 Python 编程语言中的代码实现。

在 Python 中实现回归样条

让我们首先下载本教程的数据集。该数据集可以在此处下载该数据集涉及人们的工资以及有关获得报酬的人们的大量信息。

1. 加载数据集

我们将使用read_csvPython 中 pandas 模块的函数加载数据集。

1
2
3
import pandas as pd
df = pd.read_csv('Wage.csv')
df

让我们看看下图中的数据集是什么样子的。

工资数据集

2. 创建 X 和 Y 值

为了更好地理解样条图,我们将看一下它们之间没有任何直接关系的两列。我们来看看一个人的年龄和工资之间的关系。

年龄不会直接影响一个人的工资,因此有助于我们更好地理解其实施情况。

1
2
X = df[['age']]
y = df[['wage']]

3. 将数据拆分为训练数据和测试数据

下一步是使用 80:20 规则将数据拆分为训练和测试数据集,其中 80% 的数据用于训练,其余 20% 用于测试模型。

1
2
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 = 1)

4. 数据可视化

在此步骤中,我们将使用下面的代码可视化刚刚创建的初始数据集。我们将可视化测试和训练数据集。

1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt
import seaborn as sns 
sns.set_theme(style="ticks", rc={"axes.spines.right": False, "axes.spines.top": False})
 
plt.figure(figsize=(10,8))
sns.scatterplot(x=X_train['age'], y=y_train['wage'], color="red",alpha=0.2)
plt.title("Age vs Wage Training Dataset")
 
plt.figure(figsize=(10,8))
sns.scatterplot(x=X_test['age'], y=y_test['wage'], color="green",alpha=0.4)
plt.title("Age vs Wage Testing Dataset")
 
plt.show()

结果图如下所示。

工资和年龄列车可视化
工资和年龄测试可视化

5. 在数据集上应用线性回归

如果您之前已经实现过,那么将线性回归应用于数据集会很简单。我们还将使用训练数据集计算模型的均方误差。

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train,y_train)
 
print("Slope of the Regression Line is : ", lm.coef_)
print("Intercept of Regression Line is : ",lm.intercept_)
 
from sklearn.metrics import mean_squared_error
pred_test = lm.predict(X_test)
rmse_test =mean_squared_error(y_test, pred_test, squared=False)
 
print("Accuracy of Linear Regression on testing data is : ",rmse_test)

该模型的结果如下。

Slope of the Regression Line is :  [[0.68904221]]
Intercept of Regression Line is :  [82.09009765]
Accuracy of Linear Regression on testing data is 40.68927607250081

现在,让我们使用下面的代码绘制数据集的回归线。

1
2
3
4
plt.figure(figsize=(10,8))
sns.regplot(x=X_test['age'], y=y_test['wage'], ci=None, line_kws={"color": "red"})
plt.title("Regression Line for Testing Dataset")
plt.show()
测试数据集的回归线

6. 应用多项式回归

让我们尝试使用下面的代码将多项式回归拟合到数据集中,看看是否可以在一定程度上提高准确性。

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(2)
 
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.fit_transform(X_test)
pm = LinearRegression()
pm.fit(X_train_poly,y_train)
 
pred_test = pm.predict(X_test_poly)
rmse_test =mean_squared_error(y_test,pred_test,squared=False)
 
print("Accuracy of Polynomial Regression on testing data is : ",rmse_test)

我们还可以使用下面的代码绘制多项式回归线。

1
2
3
4
plt.figure(figsize=(10,8))
sns.regplot(x=X_test['age'], y=y_test['wage'], ci=None, line_kws={"color": "red"},order=2)
plt.title("Polynomial Regression Line for Testing Dataset")
plt.show()
用于测试数据集的多项式回归线

7. 三次样条的实现

三次样条的实现和绘制与之前的实现非常相似。理解下面的代码并不困难。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
19
20
from patsy import dmatrix
transformed_x = dmatrix("bs(train, knots=(25,40,60), degree=3, include_intercept=False)",
                        {"train": X_train},return_type='dataframe')
import statsmodels.api as sm
cs = sm.GLM(y_train, transformed_x).fit()
pred_test = cs.predict(dmatrix("bs(test, knots=(25,40,60), include_intercept=False)",
                               {"test": X_test}, return_type='dataframe'))
rmse_test =mean_squared_error(y_test, pred_test, squared=False)
print("Accuracy for Cubic Spline on testing data is : ",rmse_test)
 
import numpy as np
plt.figure(figsize=(10,8))
xp = np.linspace(X_test.min(),X_test.max(), 100)
pred = cs.predict(dmatrix("bs(xp, knots=(25,40,60), include_intercept=False)",
                          {"xp": xp}, return_type='dataframe'))
sns.scatterplot(x=X_train['age'], y=y_train['wage'])
plt.plot(xp, pred, label='Cubic spline with degree=3 (3 knots)', color='red')
plt.legend()
plt.title("Cubic Spline Regression Line for Testing Dataset")
plt.show()

结果如下所示。

用于测试数据集的三次样条回归线

恭喜!您已完成本教程。如果您喜欢本教程,我相信您也会喜​​欢以下内容:

  1. Python 中的岭回归
  2. Python 中的套索回归
  3. Python 中的相关回归分析 – 2 种简单方法!
  4. 随机森林回归:完整参考
  5. Python 中的多项式回归 – Python 中的完整实现