python - soporte - Aprendizaje automático: encuentre los resultados más cercanos a un vector consultado
machine learning python library (1)
Tengo miles de vectores de aproximadamente 20 características cada uno.
Dado un vector de consulta, y un conjunto de posibles coincidencias, me gustaría poder seleccionar las mejores N
coincidencias.
He pasado un par de días probando la regresión (usando SVM), entrenando mi modelo con un conjunto de datos que he creado yo mismo: cada vector es la concatenación del vector de consulta y un vector de resultado, y doy una puntuación (evaluada subjetivamente) entre 0 y 1, 0 para la coincidencia perfecta, 1 para la peor coincidencia.
No he tenido buenos resultados, y creo que una razón podría ser que es muy difícil asignar subjetivamente estos puntajes. Lo que sería más fácil, por otro lado, es clasificar subjetivamente los resultados (el score
es una función desconocida):
score(query, resultA) > score(query, resultB) > score(query, resultC)
Así que creo que esto es más un problema de Aprender a clasificar y he encontrado varios enlaces para Python:
- http://fa.bianp.net/blog/2012/learning-to-rank-with-scikit-learn-the-pairwise-transform/
- https://gist.github.com/agramfort/2071994 ...
pero no he podido entender cómo funciona realmente. Estoy realmente confundido con toda la terminología, clasificación por parejas , etc. (tenga en cuenta que no sé nada sobre el aprendizaje automático, por lo tanto, mi sensación de estar un poco perdido), etc., así que no entiendo cómo aplicar esto a mi problema.
¿Podría alguien ayudarme a aclarar cosas, señalarme la categoría exacta de problema que trato de resolver, y aún mejor cómo implementar esto en Python (scikit-learn)?
Me parece que lo que intenta hacer es simplemente calcular las distancias entre la consulta y el resto de sus datos, luego devolver los N vectores más cercanos a su consulta. Este es un problema de búsqueda. No hay pedidos, simplemente mida la distancia entre su consulta y "miles de vectores". Finalmente, ordena las distancias y toma los valores N más pequeños. Estos corresponden a los vectores N más similares a su consulta.
Para aumentar la eficiencia al hacer comparaciones, puede usar KD-Trees u otras estructuras de búsqueda eficientes: http://scikit-learn.org/stable/modules/neighbors.html#kd-tree
Luego, eche un vistazo a la página de Wikipedia en el espacio Lp. Antes de elegir una métrica adecuada, debe pensar en los datos y su representación:
- ¿Con qué tipo de datos estás trabajando? ¿De dónde viene y qué representa? ¿El espacio de características está compuesto solo por números reales o contiene valores binarios, valores categóricos o todos? Wiki para datos homogéneos vs heterogéneos.
Para un espacio con características reales, la distancia euclidiana (L2) suele ser la métrica de elección utilizada, con 20 características que debería estar bien. Comience con este. De lo contrario, es posible que tenga que pensar en la distancia de bloque de ciudad (L1) u otras métricas como la correlación de Pearson, la distancia del coseno, etc. Es posible que tenga que hacer algo de ingeniería en los datos antes de poder hacer cualquier otra cosa.
- ¿Las características están en la misma escala? por ejemplo, x1 = [0,1], x2 = [0, 100]
De lo contrario, intente escalar sus características. Por lo general, se trata de una cuestión de prueba y error, ya que algunas características pueden ser ruidosas, en cuyo caso el escalado podría no ser de ayuda. Para explicar esto, piense en un conjunto de datos con dos características: altura y peso. Si la altura está en centímetros (10 ^ 3) y el peso está en kilogramos (10 ^ 1), entonces debe intentar convertir los cm en metros para que ambas características pesen por igual. En general, esta es una buena idea para espacios de funciones con una amplia gama de valores, lo que significa que tiene una gran muestra de valores para ambas funciones. Idealmente, le gustaría tener todas sus características distribuidas normalmente, con solo un poco de ruido, vea el teorema del límite central.
- ¿Son todas las características relevantes?
Si está trabajando con datos valiosos reales, puede usar el análisis de componentes principales (PCA) para clasificar las características y conservar solo las relevantes. De lo contrario, puede probar la selección de características http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection Reducir la dimensión del espacio aumenta el rendimiento, aunque no es crítico en su caso.
Si sus datos constan de valores continuos, categóricos y binarios, apunte a escalar o estandarizar los datos. Use su conocimiento sobre los datos para llegar a una representación adecuada. Este es el grueso del trabajo y es más o menos un arte negro. Prueba y error.
Como nota al margen, los métodos basados en métricas como knn y kmeans simplemente almacenan datos. El aprendizaje comienza donde termina la memoria.