Python中的回归样条曲线--初学者介绍

660 阅读4分钟

这篇文章是对Python中回归样条曲线的介绍。它应该能帮助你入门,并为你进一步学习和研究该主题打下基础。

嘿,编码员!我相信你已经听说过线性回归,它是最简单的算法之一,它可以教给我们很多关于因变量和非因变量之间的关系。

其结果一般为一条直线。问题是,在实际场景中,直线并不总是可能的。

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

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

为了创建一个样条回归,整个数据集被划分为更小的仓。对每个仓的回归线进行预测,并通过结将单独的线连接在一起。

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

在Python中实现回归样条曲线

让我们首先下载本教程的数据集。该数据集可以在这里下载。该数据集是关于人们的工资,以及关于人们获得报酬的大量信息。

1.加载数据集

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

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

让我们看看数据集是什么样子的,如下图所示。

Wage Dataset

工资数据集

2.创建X和Y值

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

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

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

3.将数据分割成训练数据和测试数据

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

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.数据可视化

在这一步,让我们用下面的代码将我们刚刚创建的初始数据集可视化。我们将把测试和训练数据集都可视化。

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()

由此产生的图示如下。

Wage And Age Train Visualization

工资和年龄培训可视化

Wage And Age Test Visualization

工资和年龄测试可视化

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

如果你以前实施过线性回归,对数据集的应用就很简单。我们还将使用训练数据集计算模型的平均平方误差。

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

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

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()

Regression Line For Testing Dataset

测试数据集的回归线

6.应用多项式回归

让我们试着用下面的代码将多项式回归应用于数据集,看看我们是否能在一定程度上提高准确率。

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)

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

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()

Polynomial Regression Line For Testing Dataset

测试数据集的多项式回归线

7.立体样条曲线的实现

立体样条曲线的实现和绘制与之前的实现非常相似。要理解下面的代码并不困难。

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()

结果显示如下。

Cubic Spline Regression Line For Testing Dataset

测试数据集的立方样条回归线

祝贺你!你已经走到了测试数据集的尽头。你已经来到了本教程的结尾。