如何运行具有sysidentpy的外生输入的非线性自回归?



我试图在Python中运行带有外生输入(NARX)的非线性自回归。

这是我的代码

步骤1:导入库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sysidentpy.model_structure_selection import FROLS
from sysidentpy.basis_function import Polynomial, Fourier
from sysidentpy.metrics import root_relative_squared_error
from sysidentpy.utils.generate_data import get_siso_data
from sysidentpy.utils.display_results import results
from sysidentpy.utils.plotting import plot_residues_correlation, plot_results
from sysidentpy.residues.residues_correlation import compute_residues_autocorrelation, compute_cross_correlation
from sklearn.model_selection import train_test_split

步骤2:导入数据

df=pd.read_excel(r"C:UsersActionDownloadsPythonPractice_Datasorted_data v2.xlsx")

步骤3:整理数据

target_column = ['public health care services'] 
predictors = list(set(list(df.columns))-set(target_column))
df[predictors] = df[predictors]/df[predictors].max()

步骤4:加强训练和测试数据

X = df[predictors].values
y = df[target_column].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=40)
print(X_train.shape); print(X_test.shape)

步骤5:创建NARX神经网络模型

basis_function = Polynomial(degree=2)
model = FROLS(
basis_function=basis_function,
order_selection=True,
n_info_values=10,
extended_least_squares=False,
ylag=2, xlag=2,
info_criteria='aic',
estimator='least_squares',
)

步骤6:Apply fit the model

model.fit(X_train, y_train)

从步骤6开始,我遇到了一个错误

TypeError: fit()接受1个位置参数,但是给出了3个

步骤7:预测

yhat = model.predict(X_test, y_test)

我也遇到一个错误

AttributeError: 'FROLS'对象没有属性'final_model'

步骤8:计算RRSE
rrse = root_relative_squared_error(y_test, yhat)
print(rrse)

我遇到以下错误

NameError: name 'yhat' is not defined

嗯,我意识到这个错误是由于它之前的错误,所以'yhat'没有定义。

我将非常感谢任何帮助。

我是SysIdentPy的开发者,刚刚发现了这个问题。

我希望你已经解决了它,但如果没有,这里是解决方案:

第一个错误

model.fit(X_train, y_train)
TypeError: fit() takes 1 positional argument but 3 were given

是由于您必须使用关键字参数而不是位置参数。要修复它,只需使用:

model.fit(X=X_train, y=y_train)

所有其他问题都是第一个问题的结果:例如,如果不拟合模型,您将无法预测,并且您将无法访问final_model。

我将添加"check_fitted"方法向用户提供关于此类错误的更详细的消息。

在更新v0.17.0中描述了使用关键字参数而不是位置参数,并且对示例进行了调整以遵循同一更新中的此更改,但这可能是一个常见的错误,如果没有阅读文档,如果没有适当的错误消息,则很难理解。

注意:这与你的问题无关,但是你使用了来自sklearn的train_testrongplit方法来分割数据。在时间序列场景中,这通常(不是说总是)是错误的。我不知道你想做什么,但这部分也值得检查(看看https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html)

希望对你有帮助。