Pandas中使用局部加权回归(LOESS/LOWESS)预测新数据
在本文中,我们将介绍如何在Pandas中使用局部加权回归(LOESS/LOWESS)模型预测新数据。局部加权回归是一种非线性回归方法,它在预测新数据时,可以给予离该点较近的样本点更大的权重。
阅读更多:Pandas 教程
安装依赖库
在开始本文之前,我们需要安装一些必要的Python依赖库,如下所示:
!pip install pandas numpy scipy statsmodels matplotlib
示例数据
为了演示如何在Pandas中使用LOESS/LOWESS模型预测新数据,我们使用一个虚拟数据集。该数据集包含两个特征变量(X1和X2)和一个目标变量(Y),共有100个训练样本。我们可以使用下面的代码来生成这个虚拟数据集。
import pandas as pd
import numpy as np
np.random.seed(0)
n = 100
X1 = np.random.normal(0, 1, n)
X2 = np.random.normal(0, 1, n)
Y = 5 + 2 * X1 + 3 * X2 + np.random.normal(0, 2, n)
data = pd.DataFrame({'X1': X1, 'X2': X2, 'Y': Y})
现在,我们已经准备好一个虚拟的二维数据集,其中每一行都包含两个特征值(X1和X2)和一个目标值(Y)。
LOESS模型
在Python中,我们可以使用statsmodels库中的lowess函数来实现局部加权回归模型。在本例中,我们将使用一个默认带宽(frac = 0.1)的LOESS模型拟合数据集。
下面的代码演示了如何拟合这个虚拟数据集,并绘制LOESS模型的预测结果。
from statsmodels.nonparametric.smoothers_lowess import lowess
def predict_with_loess(data, new_data):
y_pred = []
for i in range(len(new_data)):
y = lowess(data['Y'], data['X1'], frac=0.1, x0=new_data['X1'][i], return_sorted=False)
y_pred.append(y)
return y_pred
new_data = pd.DataFrame({'X1': np.linspace(-3, 3, 30)})
new_data['X2'] = 0 #设定X2的值为0
new_data['Y_pred'] = predict_with_loess(data, new_data)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,6))
ax.scatter(data['X1'], data['Y'], alpha=0.5)
ax.plot(new_data['X1'], new_data['Y_pred'], color='red')
plt.xlabel('X1')
plt.ylabel('Y')
plt.show()
在上述代码中,我们首先定义了一个函数predict_with_loess
,该函数接受一个数据集和新的要预测的数据集作为输入,并返回LOESS模型的预测值。然后,我们创建了一个新的包含30个均匀分布的X1值的数据集,并使用预测函数来计算Y值。最后,我们绘制了原始数据集以及LOESS模型的预测结果。
从上图可以看出,LOESS模型似乎很好地拟合了数据的非线性关系,并对新数据的预测结果也表现得很好。
LOESS模型带有多个特征
上面的例子中,我们只考虑了一个特征(X1),现在,我们将扩展到使用具有多个特征的数据。首先,我们可以使用与上一个数据集相同的代码创建一个新数据集,该数据集包括X1和X2的值,并使用LOESS模型预测Y。
new_data = pd.DataFrame({'X1': np.linspace(-3, 3, 30), 'X2': np.zeros(30)})
new_data['Y_pred'] = predict_with_loess(data, new_data)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['X1'], data['X2'], data['Y'], alpha=0.5)
ax.plot(new_data['X1'], new_data['X2'], new_data['Y_pred'], color='red')
ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('Y')
plt.show()
上述代码利用了Matplotlib的3D绘图功能,将原始数据集和LOESS模型预测结果在3D空间中可视化。
从上图可以看出,LOESS模型在两个特征(X1和X2)上的表现相当不错,并且可以在新的数据上进行可靠的预测。
总结
本文介绍了如何在Pandas中使用局部加权回归(LOESS/LOWESS)模型预测新数据。我们提供了一个虚拟的二维数据集,并演示了如何使用statsmodels库中的lowess函数来拟合LOESS模型。此外,我们也扩展了模型以处理带有多个特征的数据,并使用Matplotlib的3D绘图功能将预测结果可视化。
LOESS模型是一种强大的非线性回归模型,常用于处理具有复杂关系的数据,例如图像和时间序列数据。在实际应用中,我们可能需要对带宽进行不同的设置,并进行交叉验证来确定最佳的带宽值。当然,还有其他的非线性回归模型可以用来处理类似的问题,例如支持向量机回归和神经网络回归,读者可以自行研究相关内容。