python - recurrente - completar los valores faltantes de secuencia con redes neuronales
redes neuronales python (3)
Quiero hacer un pequeño proyecto y quiero usar redes neuronales con Python. Descubrí que el cerebro es la mejor solución. Pero hasta ahora, todos los ejemplos y preguntas que he encontrado, no pueden ayudarme.
Tengo una secuencia de números. Cientos de filas. Faltan algunos valores y en lugar de un número, hay una "x".
Por ejemplo
1425234838636**x**40543485435097**x**43953458345345430843967067045764607457607645067045**x**04376037654067458674506704567408576405
y así. Esto es solo un ejemplo. No es mi secuencia
Pensé leer uno por uno los valores y entrenar mi red neuronal y cuando encuentre una ''x'' predeciré el número y continuaré entrenando con los siguientes números.
Lo que he encontrado hasta ahora es entrenar como este
trainSet.addSample([0,0,0,0],[1])
con algunas entradas y algunas salidas.
Algún consejo, ¿cómo puedo continuar con esto?
Editar: me imagino algo y me gustaría recibir comentarios, porque no sé si es correcto.
Todavía tengo el hilo para arriba. Lo dividí en una lista, así que tengo una lista donde cada entidad es un número.
for ind in range(len(myList)):
if not myList[ind] == "x" and not myList[ind+1]=="x":
ds.addSample(myList[ind],myList[ind+1])
else:
break
net = FeedForwardNetwork()
inp = LinearLayer(1)
h1 = SigmoidLayer(1)
outp = LinearLayer(1)
net.addOutputModule(outp)
net.addInputModule(inp)
net.addModule(h1)
net.addConnection(FullConnection(inp, h1))
net.addConnection(FullConnection(h1, outp))
net.sortModules()
trainer = BackpropTrainer(net, ds)
trainer.trainOnDataset(ds,1000)
trainer.testOnData(verbose=True)
lis[ind+1] = net.activate((ind,))
GO to the beggining and continue from the last "x" which replaced from the net.activate()
¿Qué piensas? ¿Crees que algo así funcionará?
Lo que está describiendo es una aplicación estadística llamada Imputación : sustituir valores perdidos en sus datos. El enfoque tradicional no involucra redes neuronales, pero ciertamente ha habido algunas investigaciones en esta dirección . Esta no es mi área, pero le recomiendo que revise la literatura.
No puedo darte una respuesta específica para esa biblioteca de Python, pero a mi modo de ver, tienes una red neuronal y le das ejemplos de la forma
[ i0 i1 ... i n ] --> [ o0 o1 ... on ] (input vector) (output vector)
Ahora entrenas a la red con vectores de muestra de longitud 1. Tu red no conoce la secuencia de los números que se le presentan, esa secuencia solo es interesante para el resultado de la red entrenada.
Para obtener una red, que sepa acerca de la secuencia, podría presentar vectores de números consecutivos como entrada y el único número que desea, como salida. Deja las secuencias que contienen el ejemplo X:
Sequence: 1 2 3 4 X 2 3 4 5 6 7 8 Training with input length 3, output length 1: [1 2 3] -> 4 [2 3 4] -> 5 (the second one, as the first one is not available) [3 4 5] -> 6 [4 5 6] -> 7 [5 6 7] -> 8
Creo que al usar esto, tu red puede adaptarse un poco a la secuencia de entrada. El "cómo" para extraer las secuencias de entrenamiento correctas como entrada, tengo que dejar al experto del dominio (usted).
En general, si está entrenando su ANN usando propagación hacia atrás, básicamente está entrenando un mapa de entrada-salida. Esto significa que su conjunto de entrenamiento debe comprender relaciones de entrada y salida conocidas (ninguno de sus valores desconocidos está incluido en el conjunto de entrenamiento). La ANN se convierte entonces en una aproximación de la relación real entre sus entradas y salidas.
A continuación, puede llamar a x = net.activate([seq])
donde seq
es la secuencia de entrada asociada con el valor desconocido x
.
Si x
es una secuencia de entrada desconocida para un resultado conocido, entonces debe llamar al inverso de la ANN. No creo que haya una forma simple de invertir una ANN en el cerebro, pero podrías entrenar una ANN con el inverso de tus datos de entrenamiento originales. En otras palabras, use sus resultados conocidos como las entradas de entrenamiento y sus secuencias asociadas como resultados de entrenamiento.
Lo principal a considerar es la idoneidad de la herramienta y los datos de capacitación para lo que está tratando de hacer. Si solo desea predecir x
como una función del número anterior, entonces creo que está entrenando correctamente. Supongo que x
va a ser una función de los n
números anteriores, en cuyo caso desea actualizar su conjunto de datos como:
n = 10
for ind in range(len(myList)):
# Don''t overrun our bounds
if ind == len(myList)-1:
break
# Check that our sequence is valid
for i in range(ind-n, ind+1):
if i >= 0 and myList[i] == "x":
# we have an invalid sequence
ind += i # start next seq after invalid entry
break
# Add valid training sequence to data set
ds.addSample(myList[ind-n:ind],myList[ind+1])