¿Cuál es la mejor práctica para la formación y evaluación de un algoritmo de predicción en series de tiempo?
Para los algoritmos de aprendizaje que se entrenan en el modo por lotes, un programador ingenuo podría dar la cruda conjunto de datos de [(sample, expected prediction),...]
directamente para el algoritmo de train()
método. Esto suele mostrar artificialmente un alto índice de éxito debido a que el algoritmo va a ser efectivamente "trampa" por el uso futuro de muestras para informar a las predicciones realizadas en anteriores muestras. Cuando en realidad se trata de utilizar el modelo de aprendizaje para predecir nuevos datos en tiempo real, probablemente va a realizar terriblemente, ya que no tiene futuro alguno de los datos que se basan en.
Mi enfoque actual es para entrenar y evaluar como usted puede en tiempo real. Para N muestras de formación, ordenadas cronológicamente, donde cada una de las muestras es una tupla compuesta de la entrada y se espera que la predicción de la salida B, tengo Una entrada en mi algoritmo y obtener el resultado real C. comparo esto con B y registrar el error. Luego añadir la muestra al local "pasado" subconjunto y hacer un lote de entrenar a un nuevo modelo en el subconjunto. Yo, a continuación, repita este proceso para cada muestra.
O, para ponerlo en pseudo-código:
predictor = Predictor()
training_samples = []
errors = []
for sample in sorted(all_samples, key=lambda o: o.date):
input_data, expected_prediction = sample
# Test on current test slice.
actual_prediction = predictor.predict(input_data)
errors.append(expected_prediction == actual_prediction)
# Re-train on all "past" samples relative to the current time slice.
training_samples.append(sample)
predictor = Predictor.train(training_samples)
Esto parece muy completo, ya que simula lo que un usuario se vería obligado a hacer si se tuviera que hacer una predicción en cada paso de tiempo, pero es evidente que, para cualquier conjunto de datos, sería terriblemente lento, ya que estás multiplicando el algoritmo de tiempo de entrenamiento (que para muchos algoritmos y grandes conjuntos de datos es alta) por cada muestra.
Hay un método mejor?