python - simple - como desarrollar un algoritmo genetico
Utilizando algoritmo genético para superar diferentes conjuntos de datos de tamaño en el modelo (5)
Comencemos por el problema: considera que el hecho de que algunas características lleven a algunas de sus clases a una "huelga". Está tomando un subconjunto de sus datos y trata de establecer una regla para las huelgas. Establece uno, pero luego observa que la precisión de su regla depende del volumen del conjunto de datos que se utilizó para establecer la tasa de "huelga" de todos modos. También está comentando el efecto de algunas muestras al sesgar su estimación de "huelga".
La respuesta inmediata es que parece que tiene mucha variación en sus datos, por lo tanto, de una u otra forma, deberá recopilar más para tener en cuenta esa variación. (Es decir, la variación que es inherente al problema).
El hecho de que en algunos casos los números terminen en "casos inutilizables" también podría deberse a valores atípicos. Es decir, las mediciones que están "fuera de los límites" por varias razones y que tendría que encontrar una manera de excluirlas o reajustarlas. Pero esto depende mucho del contexto del problema.
Las "tasas de ataque" por sí solas no ayudarán, pero quizás sean un paso hacia la dirección correcta. En cualquier caso, no puede comparar las tasas de impacto si provienen de muestras de diferentes tamaños, como también lo ha descubierto. Si su problema es puramente determinar el tamaño de su muestra para que sus resultados se ajusten a una precisión específica, le recomendaría que mire a Statistical Power y cómo lo afecta el tamaño de la muestra . Pero aún así, para determinar el tamaño de la muestra, necesita saber un poco más sobre sus datos, lo que nos lleva nuevamente al punto # 1 sobre la variación inherente.
Por lo tanto, mi intento de responder es el siguiente: si he entendido su pregunta correctamente, está tratando con un problema de clasificación en el que trata de asignar un número de elementos (pacientes) a una serie de clases (tipos de cáncer) en el evidencia de algunas características (existencia de marcadores genéticos, o la frecuencia de su aparición o cualquier otra cantidad) sobre estos elementos. Sin embargo, es posible que algunas características no existan para todos los elementos o existe un grupo central de características, pero puede que haya algunas más que no aparecen todo el tiempo. La pregunta ahora es, ¿qué clasificador usas para lograr esto? La regresión logística se mencionó anteriormente y no ha ayudado. Por lo tanto, lo que sugeriría es ir a por un clasificador bayesiano ingenuo. El clasificador puede ser entrenado con los conjuntos de datos que ha usado para derivar las "tasas de huelga" que proporcionarán las probabilidades a priori. Cuando el clasificador esté "en ejecución", utilizará las características de los nuevos datos para construir una probabilidad de que el paciente que proporcionó estos datos se asigne a cada clase. Quizás el ejemplo más común para un clasificador de este tipo son los detectores de correo electrónico no deseado donde la probabilidad de que un correo electrónico sea correo no deseado se juzga por la existencia de palabras específicas en el correo electrónico (y un conjunto de datos de entrenamiento adecuado que proporciona un buen punto de partida, por supuesto).
Ahora, en términos de probar esto prácticamente (y dado que tu publicación está etiquetada con etiquetas relacionadas con python :)), me gustaría recomendar Weka . Weka contiene una gran cantidad de funciones relacionadas, incluido el bootstrapping que podría ayudarlo con esas diferencias en el tamaño de los conjuntos de datos. Aunque Weka es Java, los enlaces también existen para Python . Definitivamente lo probaría, el paquete, el libro y la comunidad de Weka son muy útiles.
Entonces me doy cuenta de que la pregunta que hago aquí es grande y compleja.
Una solución potencial a las variedades en tamaños de
En toda mi búsqueda a través de foros y publicaciones estadísticas, no he encontrado un método científicamente sólido para tener en cuenta el tipo de datos con los que me encuentro, pero he ideado una (¿una novela?) Posibles soluciones para tener en cuenta perfectamente (en particular) mi mente) para conjuntos de datos grandes y pequeños dentro del mismo modelo.
El método propuesto implica el uso de un algoritmo genético para alterar dos números que definen una relación entre el tamaño del conjunto de datos que constituye una tasa de implied strike
y el porcentaje de la implied strike
que se utilizará, con el objetivo del modelo para maximizar la homología de Número 1
en dos columnas del siguiente csv. (ultra simplificado pero con suerte demuestra el principio)
Ejemplo de datos
Date,PupilName,Unique class,Achieved rank,x,y,x/y,Average xy
12/12/2012,PupilName1,UniqueClass1,1,3000,9610,0.312174818,0.08527
12/12/2012,PupilName2,UniqueClass1,2,300,961,0.312174818,0.08527
12/12/2012,PupilName3,UniqueClass1,3,1,3,0.333333333,0.08527
13/12/2012,PupilName1,UniqueClass2,1,2,3,0.666666667,0.08527
13/12/2012,PupilName2,UniqueClass2,2,0,1,0,0.08527
13/12/2012,PupilName3,UniqueClass2,3,0,5,0,0.08527
13/12/2012,PupilName4,UniqueClass2,4,0,2,0,0.08527
13/12/2012,PupilName5,UniqueClass2,5,0,17,0,0.08527
14/12/2012,PupilName1,UniqueClass3,1,1,2,0.5,0.08527
14/12/2012,PupilName2,UniqueClass3,2,0,1,0,0.08527
14/12/2012,PupilName3,UniqueClass3,3,0,5,0,0.08527
14/12/2012,PupilName4,UniqueClass3,4,0,6,0,0.08527
14/12/2012,PupilName5,UniqueClass3,5,0,12,0,0.08527
15/12/2012,PupilName1,UniqueClass4,1,0,0,0,0.08527
15/12/2012,PupilName2,UniqueClass4,2,1,25,0.04,0.08527
15/12/2012,PupilName3,UniqueClass4,3,1,29,0.034482759,0.08527
15/12/2012,PupilName4,UniqueClass4,4,1,38,0.026315789,0.08527
16/12/2012,PupilName1,UniqueClass5,1,12,24,0.5,0.08527
16/12/2012,PupilName2,UniqueClass5,2,1,2,0.5,0.08527
16/12/2012,PupilName3,UniqueClass5,3,13,59,0.220338983,0.08527
16/12/2012,PupilName4,UniqueClass5,4,28,359,0.077994429,0.08527
16/12/2012,PupilName5,UniqueClass5,5,0,0,0,0.08527
17/12/2012,PupilName1,UniqueClass6,1,0,0,0,0.08527
17/12/2012,PupilName2,UniqueClass6,2,2,200,0.01,0.08527
17/12/2012,PupilName3,UniqueClass6,3,2,254,0.007874016,0.08527
17/12/2012,PupilName4,UniqueClass6,4,2,278,0.007194245,0.08527
17/12/2012,PupilName5,UniqueClass6,5,1,279,0.003584229,0.08527
Así que he creado un pequeño conjunto de datos modelo, que contiene algunos buenos ejemplos de dónde se quedan cortos mis métodos actuales y cómo creo que se puede usar un algoritmo genético para solucionar este problema. Si nos fijamos en el conjunto de datos de arriba, contiene 6 clases únicas, el objetivo final del algoritmo es crear una correspondencia lo más alta posible entre un rango de x/y
achieved rank
en la columna 3 (referencia basada en cero). En uniqueclass1
tenemos dos valores x/y
idénticos, ahora son valores x/y
comparativamente grandes si se compara con el promedio (tenga en cuenta que el promedio no se calcula a partir de este conjunto de datos) pero sería de sentido común esperar que el 3000/9610 sea más significativo y, por lo tanto, es más probable que tenga un achieved rank
de 1
que el 300/961. Entonces, lo que quiero hacer es hacer un adjusted x/y
para superar estas diferencias en el tamaño de los conjuntos de datos utilizando una relación de crecimiento logarítmica definida por la ecuación:
adjusted xy = ((1-exp(-y*α)) * x/y)) + ((1-(1-exp(-y*α)))*Average xy)
Donde α
es el único número dinámico
Si puedo explicar un poco mi lógica y abrirme a (con suerte) la crítica constructiva. La siguiente gráfica muestra una relación de crecimiento exponencial entre el tamaño del conjunto de datos y el% de x / y que contribuye al x / y ajustado. Esencialmente, lo que dice la ecuación anterior es que a medida que el conjunto de datos aumenta, el porcentaje del x/y
original utilizado en el adjusted x/y
. Cualquiera que sea el porcentaje restante está compuesto por el xy promedio. Hipotéticamente podría ser un 75% x/y
aa y un 25% de average xy
para 300/961 y 95% / 5% para 3000/9610, creando un x / y ajustado que demuestre claramente
Para obtener ayuda para comprender la reducción de α
generaría la siguiente relación en la que se requeriría un conjunto de datos más grande para lograr el mismo "% de xy contribuido"
Aumentar a la inversa α
produciría la siguiente relación en la que se requeriría un conjunto de datos más pequeño para lograr el mismo "% de xy contribuido"
Así que he explicado mi lógica. También estoy abierto a los fragmentos de código para ayudarme a superar el problema. Tengo planes de hacer una gran cantidad de algoritmos genéticos / evolutivos en el futuro y realmente podría usar un ejemplo funcional para desarmarlo y jugar con el fin de ayudarme a comprender cómo utilizar esas habilidades de python. Si se requieren detalles adicionales o una aclaración adicional sobre el problema o los métodos, pregunte, realmente quiero poder resolver este problema y los problemas futuros de esta naturaleza.
Entonces, después de mucha discusión sobre los métodos disponibles para superar el problema presentado aquí, he llegado a la conclusión de que el mejor método sería un algoritmo genético para iterar α para maximizar la homología / correspondencia entre un rango de x / y ajustado y el rango alcanzado en la columna 3. ¿Le agradecería mucho que alguien pudiera ayudar en ese departamento?
Así que para aclarar, este post ya no es una discusión sobre metodología.
Espero que alguien pueda ayudarme a producir un algoritmo genético para maximizar la homología entre los resultados de la ecuación.
adjusted xy = ((1-exp(-y*α)) * x/y)) + ((1-(1-exp(-y*α)))*Average xy)
Donde se adjusted xy
aplica a cada fila del csv. La maximización de la homología podría lograrse minimizando la diferencia entre el rango de la adjusted xy
(donde el rango es solo por cada Unique class
) y el Achieved rank.
Minimizar este valor maximizaría la homología y, esencialmente, resolvería el problema que se me presenta a los conjuntos de datos de diferentes tamaños. Si necesita más información, pregunte, reviso esta publicación unas 20 veces al día en este momento, por lo que debo responder con prontitud. Muchas gracias SMNALLY.
El problema al que te enfrentas me suena como "Bias Variance Dilemna" desde un punto de vista general. En pocas palabras, un modelo más preciso favorece la varianza (sensibilidad al cambio en un solo conjunto de entrenamiento), un modelo más general favorece el sesgo (el modelo funciona para muchos conjuntos de entrenamiento)
Puedo sugerir que no se centre en GA, sino que analice Instance Base Learning y las técnicas avanzadas de regresión. La página de Andrew Moore en CMU es un buen punto de entrada .
Y particularmente esas diapositivas .
[EDITAR]
Después de una segunda lectura, aquí está mi segundo entendimiento:
- Tiene un conjunto de datos de ejemplo con dos atributos relacionados X e Y.
- No desea que X / Y domine cuando Y es pequeño, (considerado como menos representativo).
- Como consecuencia, desea "ponderar" los ejemplos con un valor ajustado_xy ajustado.
Desea que adjust_xy esté relacionado con un tercer atributo R (rango). Relacionado como, por clase, ajustada_xy se ordena como R.
Para ello, sugiere ponerlo como un problema de optimización, buscando PARAMS de una función dada F (X, Y, PARAMS) = impresos_xy.
- Con la restricción de que D = Distancia (rango alcanzado para esta clase, rango de ajustados por esta clase) es mínimo.
Su pregunta, al menos para mí, está en el campo de la selección de atributos / adaptación de atributos. (Supongo que el conjunto de datos se usará más adelante para aprendizaje supervisado).
Un problema que veo en su enfoque (si se entiende bien) es que, al final, el rango estará altamente relacionado con el ajuste_xy que, por lo tanto, no aportará información adicional interesante.
Una vez dicho esto, creo que seguramente sabes cómo funciona GA. Tienes que
- define el contenido del cromosoma: este parece ser tu parámetro alfa.
- definir una función de aptitud apropiada
La función de aptitud para un individuo puede ser una suma de distancias en todos los ejemplos del conjunto de datos.
Cuando se trata de valores reales, otras metaheurísticas como Evolution Strategies (ES) o Simulated Anealing pueden ser más adecuadas que GA.
Como la resolución de problemas de optimización es un uso intensivo de la CPU, puede que finalmente considere C o Java en lugar de Python. (Como la aptitud al menos será interpretada y por lo tanto costará mucho).
Alternativamente, consideraría el uso de Y como un peso para algún algoritmo de aprendizaje supervisado (si el objetivo es el aprendizaje supervisado).
No. No uses un algoritmo genético.
Cuanto más grande sea el espacio de búsqueda de modelos y parámetros, mayores serán sus posibilidades de encontrar un buen ajuste para sus puntos de datos. Pero menos significará este ajuste. Especialmente ya que para algunos grupos el tamaño de sus muestras es pequeño y, por lo tanto, las mediciones tienen un alto componente aleatorio. Esta es la razón por la que, en cierto modo contraintuitivo, a menudo es más difícil encontrar un buen modelo para sus datos después de recopilarlos que antes.
Has llevado la pregunta a la guarida del programador. Este no es el lugar para ello. Resolvemos puzzles.
Esto no es un rompecabezas para encontrar la mejor línea a través de los puntos. Está buscando un modelo que tenga sentido y aporte comprensión sobre el tema. Un algoritmo genético es muy creativo en el dibujo de línea a través de puntos, pero le traerá poca comprensión.
Retire el problema a donde pertenece y pregunte a los estadísticos.
Para un buen modelo se debe basar en la teoría detrás de los datos. Tendrá que coincidir con los puntos en el lado derecho de la gráfica, donde (si lo entiendo bien) la mayoría de las muestras son. Será capaz de explicar con probabilidad las probabilidades de que existan las desviaciones de la izquierda y decirle si son significativas o no.
Si desea hacer algo de programación, le sugiero que tome el modelo lineal más simple, agregue un poco de ruido aleatorio y realice un par de simulaciones para una población como sus sujetos. Vea si los datos se parecen a los datos que está viendo o si generalmente ''parecen'' diferentes, en cuyo caso realmente hay algo no lineal (y posiblemente interesante) a la izquierda.
Siguiendo la afeitadora de Occam , debe seleccionar un modelo más simple para un conjunto de datos pequeño y es posible que desee cambiar a un modelo más complejo a medida que su conjunto de datos crezca.
No hay [buenas] pruebas estadísticas que le muestren si un modelo determinado, en forma aislada, es un buen predictor de sus datos. O más bien, una prueba puede decirle que un modelo dado es N
, pero nunca puede decir cuál es el valor aceptable de N
Por lo tanto, cree varios modelos y elija uno con una mejor compensación de poder predictivo y simplicidad utilizando el criterio de información de Akaike . Tiene propiedades útiles y no es demasiado difícil de entender. :)
Por supuesto, hay otras pruebas , pero AIC debería ayudarte a comenzar.
Para una prueba simple, echa un vistazo a p-value
Una vez abordé un problema similar (como lo son problemas similares a este), en el que había muchas clases y una gran variación en las características por punto de datos. Personalmente utilicé un clasificador de bosque aleatorio (que escribí en Java). Debido a que sus datos son altamente variables y, por lo tanto, difíciles de modelar, puede crear múltiples bosques a partir de diferentes muestras aleatorias de su gran conjunto de datos y colocar una capa de control en la parte superior para clasificar los datos contra todos los bosques, y luego tomar la mejor puntuación. No escribo python, pero encontré este enlace http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html que puede darle algo para jugar.