** (Addition 1) Il a été souligné que l'utilisation des termes ("dans l'échantillon", "hors de l'échantillon") est inappropriée. [Seconde moitié de cet article](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%98%E7%94%A8%E8%AA%9E-in-sample -sortie de l'échantillon-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) J'ai ajouté ce point. ** ** ** (Addition 2) [Deuxième moitié](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%982%E7%94%A8%E8%AA%9E -en-échantillon-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) J'ai fait. ** **
Après avoir publié Qiita, même si vous remarquez une erreur dans le contenu, vous avez tendance à perdre du temps et à le laisser tel quel. Ce n'est pas grave si c'est une très petite erreur, mais si c'est une erreur théorique ou un malentendu, il faut que la mauvaise transmission continue, et nous devons y réfléchir. (Il est rapide de supprimer un article, mais s'il a un "j'aime", il est impoli de le supprimer ...)
Par ailleurs, dans la précédente Comparaison des modèles de régression - ARMA vs Random Forest Regression - Qiita, le décalage (délai) est utilisé comme quantité de caractéristiques à partir des données de la série chronologique. Présente comment le faire.
Cette fois, ce sont des données de séries chronologiques univariées, mais je les ai essayées comme modèle pour estimer la valeur actuelle en utilisant des données passées. En particulier,
Volume_current ~ Volume_Lag1 + Volume_Lag2 + Volume_Lag3
Voici le modèle. Je voulais que les données d'entraînement et les données de test soient identiques à celles de la dernière fois (70, 30), mais comme NaN apparaît dans le processus de calcul de la valeur de décalage, dropna () la première partie et définissez la longueur des données sur (67, 30). fait.
Tout d'abord, prétraitez les données.
df_nile['lag1'] = df_nile['volume'].shift(1)
df_nile['lag2'] = df_nile['volume'].shift(2)
df_nile['lag3'] = df_nile['volume'].shift(3)
df_nile = df_nile.dropna()
X_train = df_nile[['lag1', 'lag2', 'lag3']][:67].values
X_test = df_nile[['lag1', 'lag2', 'lag3']][67:].values
y_train = df_nile['volume'][:67].values
y_test = df_nile['volume'][67:].values
Utilisez le régresseur de forêt aléatoire de Scikit-learn.
from sklearn.ensemble import RandomForestRegressor
r_forest = RandomForestRegressor(
n_estimators=100,
criterion='mse',
random_state=1,
n_jobs=-1
)
r_forest.fit(X_train, y_train)
y_train_pred = r_forest.predict(X_train)
y_test_pred = r_forest.predict(X_test)
Selon la procédure typique d'apprentissage automatique, les données sont divisées en données d'entraînement / données de test, le modèle est ajusté à l'aide des données d'apprentissage, puis les réponses sont mises en correspondance avec la valeur de prédiction du modèle et le libellé des données de test. Qu'est-ce qui ne va pas? Le flux du code ci-dessus est expliqué à l'aide d'une figure.
** Fig.1 Comment prédire et vérifier des données de séries chronologiques incorrectes **
Générez 3 données de décalage à partir des données de la série chronologique d'origine avec pandas.DaraFrame.shift
. Après cela, il est divisé en données d'apprentissage (dans l'échantillon) et en données de test (hors échantillon) à un moment prédéterminé. À première vue, cela semble bon, mais dans cette procédure, la section des données de test (partie rose) de la série de données d'origine sera incorporée dans la série de données de décalage. Dans la vérification de modèle, un tel traitement peut être effectué, mais en réalité, les données (hors échantillon) après un temps prédéterminé n'existent pas pour les informations futures, de sorte que ce traitement ne peut pas être effectué.
La bonne façon de procéder consiste à remplir les valeurs de décalage requises pour la prédiction des données une par une et à avancer.
** Fig.2 Comment prédire et vérifier les données de séries chronologiques correctes **
Dans la figure ci-dessus, les informations roses doivent être exclues comme réponse lors de la validation. Au moment (xn-3), toutes les données d'entraînement peuvent être alignées sur les données bleues de l'échantillon. À la prochaine fois (xn-2), les données Lag-3 seront perdues, donc la valeur ici sera calculée à l'aide du modèle de prédiction. À la prochaine fois (xn-1), on pense que le processus de calcul consistera à remplir les parties manquantes de Lag-2 et Lag-3. C'est le code ci-dessous.
def step_forward(rf_fitted, X, in_out_sep=67, pred_len=33):
# predict step by step
nlags = 3
idx = in_out_sep - nlags - 1
lags123 = np.asarray([X[idx, 0],
X[idx, 1],
X[idx, 2]])
x_pred_hist = []
for i in range(nlags + pred_len):
x_pred = rf_fitted.predict([lags123])
if i > nlags:
x_pred_hist.append(x_pred)
lags123[0] = lags123[1]
lags123[1] = lags123[2]
lags123[2] = x_pred
x_pred_np = np.asarray(x_pred_hist).squeeze()
return x_pred_np
Dans le code ci-dessus, rf_fitted
est un modèle de forêt aléatoire pour lequel l'ajustement (apprentissage) de la régression a été effectué. En utilisant cela, la valeur future, qui correspond au hors-échantillon, est calculée pas à pas.
Vérifiez maintenant en quoi les valeurs prédites diffèrent de manière incorrecte / correcte.
** Fig.3 Mauvaise prédiction **
En se concentrant sur la ligne hors échantillon dessinée en cyan, la composante haute fréquence de la section prédite de la valeur d'entrée (ligne pointillée) qui ne doit pas être mentionnée dans la figure ci-dessus est reflétée dans la valeur prédite (ligne cyan continue). On dirait qu'il y en a. Cependant, le degré de chevauchement dans cette section semble être élevé.
** Fig.4 Prédiction par la bonne voie **
Sur cette figure, la composante haute fréquence de la valeur prédite de la section prédite semble être assez petite, et dans la seconde moitié de la section, elle semble être légèrement différente de la valeur réelle (ligne pointillée). Cependant, sur cette figure, une tendance importante à la «diminution graduelle» de la section dans l'échantillon peut être observée dans la valeur prédite hors échantillon. (De mon point de vue personnel ...)
Veuillez noter qu'il existe de tels pièges dans l'analyse des données de séries chronologiques. (Cela peut être la base des bases pour les personnes qui manipulent habituellement des données de séries chronologiques.) Vous devez trouver les données de séries chronologiques sur le site de compétition d'apprentissage automatique "Kaggle" etc. et étudier une petite partie pratique. Je sens ça.
J'espère également que les personnes qui aiment ou "stockent" mes articles postés tiendront également compte de la fiabilité des articles. (C'est un "avis" que cela peut être faux. Je serais encore plus heureux si vous pouviez commenter l'erreur.)
Pour cet article, "in-sample" est utilisé comme synonyme de "training data", mais je ne pense pas que cela signifie cela. Dans le cas de la régression uniquement, j'ai reçu un tweet disant "la valeur de la variable explicative est la même que les données d'apprentissage". Comme vous l'avez souligné, la compréhension de "in-sample" était ambiguë, alors lisez "in-sample" -> "training data" et "out-of-sample" -> "test data" dans cet article. J'espère que vous pourrez le changer. Je n'ai pas entièrement compris le concept des termes ci-dessus à ce stade, je mettrai donc à jour l'article à une date ultérieure.
J'ai vérifié le "in-sample" dans l'article, veuillez donc vous y référer ci-dessous.
Au moment de la rédaction de l'article ci-dessus, les termes "dans l'échantillon" / "hors échantillon" étaient divisés à un certain point de l'axe des temps, les données jusqu'à ce point étaient "dans l'échantillon" et les données après ce point étaient Je pensais que c'était "hors échantillon". Bien que cet usage soit inexact, il semble que le terme soit souvent utilisé de cette manière.
Par exemple, StackExchange, questions à validation croisée, Quelle est la différence entre les prévisions «dans l'échantillon» et «hors échantillon»? -entre-dans-échantillon-et-hors-échantillon-prévisions) a l'explication suivante comme réponse.
if you use data 1990-2013 to fit the model and then you forecast for 2011-2013, it's in-sample forecast. but if you only use 1990-2010 for fitting the model and then you forecast 2011-2013, then its out-of-sample forecast.
J'ai recherché dans la littérature «Les éléments de l'apprentissage statistique, 2e édition» «l'usage» exact du terme. Ce livre est un manuel standard pour la modélisation et l'apprentissage automatique, et heureusement, il est distribué gratuitement par l'Université de Stanford. (Je ne "lisais" pas, je téléchargeais juste ...)
«Dans l'échantillon» a été expliqué au chapitre 7, «Évaluation et sélection du modèle», dans l'explication des performances de généralisation et de l'erreur de généralisation.
Training set:
\mathcal{T} = \{ (x_1, y_1), (x_2, y_2), ...(x_N, y_N) \}
Lors de l'évaluation de nouvelles données (données de test) avec le modèle "\ hat {f}" obtenu à l'aide de, l'erreur de généralisation suivante se produit.
Err_{\mathcal{T}} = E_{X^0, Y^0} [L(Y^0,\ \hat{f}(X^0)) \mid \mathcal{T}] \\
Il existe divers facteurs qui réduisent la précision de la généralisation, et l'un d'eux est que les points de données (variables explicatives) diffèrent entre les données d'apprentissage et les données de test. Si les points de données correspondent, l'erreur «in-sample» suivante se produit.
Err_{in} = \frac{1}{N} \sum_{i=1}^{N} E_{Y^0} [L(Y^0_i ,\ \hat{f}(x_i)) \mid \mathcal{T} ]
Il peut être difficile de comprendre l'explication de la citation fragmentaire, mais comparez les deux formules ci-dessus. Il convient de noter l'argument de l'expression de modèle "hat {f}", où le général "X ^ 0" devient "x_i" (x dans les données d'apprentissage) dans l'expression ci-dessous. Ces données deviennent des données "in-samle". La figure ci-dessous est illustrée.
Prenons le cas où un modèle (ligne noire) est obtenu à partir de données d'entraînement (données de train) constituées de 6 points. (En fait, vous ne pouvez pas obtenir une courbe sinusoïdale comme une ligne à 6 points. Veuillez comprendre qu'il s'agit d'un diagramme explicatif.)
Les données "in-sample" sont celles dont la valeur x correspond à ces données d'apprentissage. Cette fois, les données d'apprentissage étaient x = 5, 10, 15, donc celle qui ne correspond pas à cela n'est pas "dans l'échantillon". Par conséquent, les données de x> 20 sur l'axe des x sont différentes et, en outre, les points d'intervalle tels que x = 4, 7 ne sont pas "dans l'échantillon". C'est la raison pour laquelle les citations StackExchange, validées croisées ne sont pas exactes au début. Cependant, dans l'analyse de séries chronologiques qui est souvent effectuée, les points de données sont souvent à intervalles réguliers (par exemple, quotidiennement, mensuellement), et dans ce cas, même s'ils sont séparés par un certain point sur l'axe des temps, «dans l'échantillon» / autre que cela. Parce qu'il peut être divisé en, il y a une situation dans laquelle il correspond à la définition du terme d'origine.
À l'exception du malentendu sur la façon d'utiliser ce terme, les explications dans le texte et le traitement de l'analyse des données chronologiques sont correctes à ce stade, veuillez donc vérifier.
L'usage des mots changera, comme "Vous pouvez manger de la nourriture délicieuse **" et "Vous pouvez manger de la nourriture délicieuse **", mais cette fois, "Utilisons correctement les termes techniques". La question était une leçon.
Recommended Posts