--- template: overrides/main.html title: Modelos NARX Gerais --- # Modelos NARX Gerais Exemplo criado por Wilson Rocha Lacerda Junior > **Procurando mais detalhes sobre modelos NARMAX?** > Para informações completas sobre modelos, métodos e uma ampla variedade de exemplos e benchmarks implementados no SysIdentPy, confira nosso livro: > [*Nonlinear System Identification and Forecasting: Theory and Practice With SysIdentPy*](https://sysidentpy.org/book/0%20-%20Preface/) > > Este livro oferece orientação aprofundada para apoiar seu trabalho com o SysIdentPy. Neste exemplo, criaremos modelos NARX usando diferentes estimadores como GradientBoostingRegressor, Bayesian Regression, Automatic Relevance Determination (ARD) Regression e Catboost. ```python pip install sysidentpy ``` ```python import matplotlib.pyplot as plt from sysidentpy.metrics import mean_squared_error from sysidentpy.utils.generate_data import get_siso_data from sysidentpy.general_estimators import NARX from sklearn.linear_model import BayesianRidge, ARDRegression from sklearn.ensemble import GradientBoostingRegressor from catboost import CatBoostRegressor from sysidentpy.basis_function import Polynomial, Fourier from sysidentpy.utils.plotting import plot_residues_correlation, plot_results from sysidentpy.residues.residues_correlation import ( compute_residues_autocorrelation, compute_cross_correlation, ) ``` ```python # dataset simulado x_train, x_valid, y_train, y_valid = get_siso_data( n=10000, colored_noise=False, sigma=0.01, train_percentage=80 ) ``` ## Importância da arquitetura NARX Para ter uma ideia da importância da arquitetura NARX, vamos observar o desempenho dos modelos sem a configuração NARX. ```python catboost = CatBoostRegressor(iterations=300, learning_rate=0.1, depth=6) ``` ```python gb = GradientBoostingRegressor( loss="quantile", alpha=0.90, n_estimators=250, max_depth=10, learning_rate=0.1, min_samples_leaf=9, min_samples_split=9, ) ``` ```python def plot_results_tmp(y_valid, yhat): _, ax = plt.subplots(figsize=(14, 8)) ax.plot(y_valid[:200], label="Data", marker="o") ax.plot(yhat[:200], label="Prediction", marker="*") ax.set_xlabel("$n$", fontsize=18) ax.set_ylabel("$y[n]$", fontsize=18) ax.grid() ax.legend(fontsize=18) plt.show() ``` ```python catboost.fit(x_train, y_train, verbose=False) plot_results_tmp(y_valid, catboost.predict(x_valid)) ``` ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_9_0.png) ```python gb.fit(x_train, y_train.ravel()) plot_results_tmp(y_valid, gb.predict(x_valid)) ``` ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_10_0.png) ## Introduzindo a configuração NARX usando SysIdentPy Como você pode ver, basta passar o estimador base desejado para a classe NARX do SysIdentPy para construir o modelo NARX! Você pode escolher os lags das variáveis de entrada e saída para construir a matriz de regressores. Mantemos o método fit/predict para tornar o processo direto. ### NARX com Catboost ```python basis_function = Fourier(degree=1) catboost_narx = NARX( base_estimator=CatBoostRegressor(iterations=300, learning_rate=0.1, depth=8), xlag=10, ylag=10, basis_function=basis_function, model_type="NARMAX", fit_params={"verbose": False}, ) catboost_narx.fit(X=x_train, y=y_train) yhat = catboost_narx.predict(X=x_valid, y=y_valid, steps_ahead=1) print("MSE: ", mean_squared_error(y_valid, yhat)) plot_results(y=y_valid, yhat=yhat, n=200) ee = compute_residues_autocorrelation(y_valid, yhat) plot_residues_correlation(data=ee, title="Residues", ylabel="$e^2$") x1e = compute_cross_correlation(y_valid, yhat, x_valid) plot_residues_correlation(data=x1e, title="Residues", ylabel="$x_1e$") ``` MSE: 0.00024145290395678653 ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_13_1.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_13_2.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_13_3.png) ### NARX com Gradient Boosting ```python basis_function = Fourier(degree=1) gb_narx = NARX( base_estimator=GradientBoostingRegressor( loss="quantile", alpha=0.90, n_estimators=250, max_depth=10, learning_rate=0.1, min_samples_leaf=9, min_samples_split=9, ), xlag=2, ylag=2, basis_function=basis_function, model_type="NARMAX", ) gb_narx.fit(X=x_train, y=y_train) yhat = gb_narx.predict(X=x_valid, y=y_valid) print(mean_squared_error(y_valid, yhat)) plot_results(y=y_valid, yhat=yhat, n=200) ee = compute_residues_autocorrelation(y_valid, yhat) plot_residues_correlation(data=ee, title="Residues", ylabel="$e^2$") x1e = compute_cross_correlation(y_valid, yhat, x_valid) plot_residues_correlation(data=x1e, title="Residues", ylabel="$x_1e$") ``` 0.0011824693986863938 ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_15_1.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_15_2.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_15_3.png) ### NARX com ARD ```python from sysidentpy.general_estimators import NARX ARD_narx = NARX( base_estimator=ARDRegression(), xlag=2, ylag=2, basis_function=basis_function, model_type="NARMAX", ) ARD_narx.fit(X=x_train, y=y_train) yhat = ARD_narx.predict(X=x_valid, y=y_valid) print(mean_squared_error(y_valid, yhat)) plot_results(y=y_valid, yhat=yhat, n=200) ee = compute_residues_autocorrelation(y_valid, yhat) plot_residues_correlation(data=ee, title="Residues", ylabel="$e^2$") x1e = compute_cross_correlation(y_valid, yhat, x_valid) plot_residues_correlation(data=x1e, title="Residues", ylabel="$x_1e$") ``` 0.0011058934497373794 ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_17_1.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_17_2.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_17_3.png) ### NARX com Bayesian Ridge ```python from sysidentpy.general_estimators import NARX BayesianRidge_narx = NARX( base_estimator=BayesianRidge(), xlag=2, ylag=2, basis_function=basis_function, model_type="NARMAX", ) BayesianRidge_narx.fit(X=x_train, y=y_train) yhat = BayesianRidge_narx.predict(X=x_valid, y=y_valid) print(mean_squared_error(y_valid, yhat)) plot_results(y=y_valid, yhat=yhat, n=200) ee = compute_residues_autocorrelation(y_valid, yhat) plot_residues_correlation(data=ee, title="Residues", ylabel="$e^2$") x1e = compute_cross_correlation(y_valid, yhat, x_valid) plot_residues_correlation(data=x1e, title="Residues", ylabel="$x_1e$") ``` 0.0011077874945734536 ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_19_1.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_19_2.png) ![png](../../../en/user-guide/tutorials/general-NARX-models_files/general-NARX-models_19_3.png) # Nota Lembre-se que você pode usar predição n-steps-ahead e modelos NAR e NFIR agora. Confira como usá-los em seus respectivos exemplos.