[PYTHON] Modellkomplexität und Robustheit

Überprüfen Sie die Modellkomplexität und die Verschlechterung der Modellgenauigkeit, wenn den Daten leichtes Rauschen hinzugefügt wird

Da ich der Meinung bin, dass die zum Erstellen des Modells verwendeten Daten eine Stichprobe von Ereignissen waren, die in der Vergangenheit aufgetreten sein könnten, war es auch möglich, dass die einzige Stichprobe, die in der Vergangenheit auftrat, ein leicht verschwommenes Ereignis war. Dinge, die Sie interessieren möchten. Wenn Sie sagen "Denken Sie daran, dass die Probe ein wenig unscharf wird" = "Fügen Sie der sichtbaren Probe Rauschen hinzu", können Sie damit die Robustheit (Abhängigkeit von Daten) Ihres Modells überprüfen. Ich dachte, es könnte sein und schuf es

Grob gesagt Dies ist nicht in Testdaten und Trainingsdaten unterteilt! !! Ich habe ein Modell namens erstellt, und in Wirklichkeit können die Daten leicht abweichen. Wie stark sich die Genauigkeit des Modells zu diesem Zeitpunkt verschlechtert Das Motiv war, dass ich das Phänomen bestätigen wollte

Wenn das Modell einfach und das Rauschen einfach ist, denke ich, dass die Verschlechterung der Vorhersagegenauigkeit unter Verwendung mathematischer Formeln berechnet werden kann, aber wenn es auf Simulation basiert, kann es möglich sein, mit verschiedenen Modellen umzugehen, Rauschen, das weder iid noch Normalverteilung ist. Ich weiß es nicht

Import etc.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# import statsmodels.api as sm
# from statsmodels.tsa.arima_model import ARIMA
import pandas_datareader.data as web
import yfinance as yf
from numpy.random import *

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

import seaborn as sns
import warnings
import sys

warnings.filterwarnings('ignore')

plt.style.use('seaborn-darkgrid')
plt.rcParams['axes.xmargin'] = 0.01
plt.rcParams['axes.ymargin'] = 0.01

Holen Sie sich'USDJPY' von yfinance und erstellen Sie wöchentliche Renditen

ReadDF = yf.download('JPY=X', start="1995-01-01", end="2019-10-30")
ReadDF.index = pd.to_datetime(ReadDF.index)
IndexValueReadDF_rsmpl = ReadDF.resample('W').last()['Adj Close']
ReadDF = IndexValueReadDF_rsmpl / IndexValueReadDF_rsmpl.shift(1) - 1

Erklärende Variable (X), erklärte Variable (y) Datenerstellung

ret_df = pd.DataFrame()
ret_df[mkt] = ReadDF

test = pd.DataFrame(ret_df[mkt])
for i in range(1, 5):
    test['i_' + str(i)] = test['USDJPY'].shift(1 * i)

test = test.dropna(axis=0)
X = test.ix[:, 1:]
y = test[mkt]

Erstellen eines Modells (tatsächliche Stichprobe und Rauschen)

m_ = 3  # 0.Ein Haken, der die dreifache Volatilität hat
output_degree = {}

for k in range(1, 7):
    polynomial_features = PolynomialFeatures(degree=k, include_bias=False)
    linear_regression = LinearRegression()
    pipeline = Pipeline([("polynomial_features", polynomial_features),
                         ("linear_regression", linear_regression)])

    pipeline.fit(X, y)

    k_sample = pd.DataFrame()

    for l in range(0, 300):

        #Normale Zufallszahlengenerierung
        eps_0 = pd.DataFrame(randn(X.shape[0], X.shape[1]))
        eps_1 = eps_0.apply(lambda x: x * list(X.std()), axis=1)

        eps_1.columns = X.columns
        eps_1.index = X.index

        #Zu den Originaldaten hinzufügen
        X_r = X + m_/10 * eps_1

        signal = pd.DataFrame()
        signal[mkt] = np.sign(pd.DataFrame(pipeline.predict(X_r)))[0]

        signal.index = y.index

        k_sample['s_' + str(l)] = (pd.DataFrame(signal[mkt]) * pd.DataFrame(y)).ix[:, 0]

    signal_IS = pd.DataFrame()
    # signal_IS[mkt] = np.sign(pd.DataFrame(pipeline.predict(X.ix[:, 0][:, np.newaxis])))[0]

    signal_IS[mkt] = np.sign(pd.DataFrame(pipeline.predict(X)))[0]

    signal_IS.index = y.index

    k_sample['IS'] = (pd.DataFrame(signal_IS[mkt])*pd.DataFrame(y)).ix[:, 0]
    k_sample[mkt] = pd.DataFrame(y).ix[:, 0]

    output_degree['degree_' + str(k)] = k_sample

Ausgabehistogramm (jeder Grad N)


Performance_sim = pd.DataFrame()

fig = plt.figure(figsize=(15, 7), dpi=80)
for k in range(1, 7):
    ax = fig.add_subplot(2, 3, k)

    for_stats = output_degree['degree_' + str(k)]
    Performance = pd.DataFrame(for_stats.mean()*50 / (for_stats.std()*np.sqrt(50))).T

    Performance_tmp = Performance.ix[:, 1:].T

    ax.hist(Performance.drop(['IS', mkt], axis=1), bins=30, color="dodgerblue", alpha=0.8)
    ax.axvline(x=float(Performance.drop(['IS', mkt], axis=1).mean(axis=1)), color="b")
    ax.axvline(x=float(Performance['IS']), color="tomato")
    ax.axvline(x=float(Performance[mkt]), color="gray")
    ax.set_ylim([0, 40])
    ax.set_xlim([-0.3, 2.5])
    ax.set_title('degree-N polynomial: ' + str(m_))
fig.show()

Ergebnis

Model_Complexity.png

Es ist ein natürliches Ergebnis, wenn es sich um einfache Daten handelt, aber es scheint für die Überprüfung nützlich zu sein, wenn ich ein Modell erstellt habe

Nachtrag 1

Oben ist die Komplexität des Modells auf Grad = k von PolynomialFeatures festgelegt, aber der Grad = 3, das Modell ist RandomForestRegressor und die Komplexität des Modells ist max_depth = k.

    pipeline = Pipeline([("polynomial_features", polynomial_features),
                         ("rf_regression", RandomForestRegressor(max_depth=k))])

Ergebnis

Model_Complexity_RF.png

Nachtrag 2

Wiederum wird in dem Beispiel, in dem die Komplexität des Modells auf Grad = k von PolynomialFeatures festgelegt ist, eine erklärende Variable hinzugefügt, und die erklärende Variable wird im Regressionsteil in dem Sinne verwendet, dass sie systematisch den Wunsch steuert, ein Modell zu erstellen. Eine Auswahl treffen

    pipeline = Pipeline([("polynomial_features", polynomial_features),
                         ("linear_regression", LassoCV(cv=5))])

Model_Complexity_LassoCV.png

Recommended Posts

Modellkomplexität und Robustheit
Modellbildung, Lernen und Denken lernen
Memorandum zum Speichern und Laden des Modells
Regressionsmodell mit Scikit-Learn und dessen Visualisierung
Laden und Testen des von Chainer trainierten Imagenet-Modells
Implementieren Sie ein Modell mit Status und Verhalten