top of page

COSAS VEREDES

Hoy toca hablar de algo un poco más teórico que particularmente me gusta al ser creo que sencillo de entender, trataré de hacerlo de un modo algo superficial, porque creo que para problemas de corte aplicado puede tener su importancia o más bien tener un poco la visión de lo que hay por detrás de los algoritmos, esa idea geométrica que sólo aparece si uno lee un paper, pero que aparece de modo muy enmarrañado y difícil de entender en ocasiones.



En cualquier rama aplicada, donde se haga uso de modelos, con frecuencia se olvida que en la estimación de los parámetros existe una superficie en la que se aspira a encontrar su correspondiente mínimo. Es curioso cómo se olvida lo más bello de estos modelos como es la geometría subyacente ...


Así pues, en un modelo de regresión lineal, donde se cumpla al menos la condición de multicolinealidad, la superficie será una especie de paraboloide, bastante lisa, totalmente derivable en todos sus puntos y con la existencia y unidad de un mínimo que garantiza la existencia de parámetros óptimos, dado un conjunto de entrenamiento al partir del cual se desea inferir una generalidad. Claro está el dibujo superior que precede a esta entrada es uno de estos casos, donde con sólo 2 variables w1 y w2, permite una visualización como la anterior donde se ha utilizado código R muy sencillo, donde cualquiera con algún estudio de estadística, sin tener que ser DS, puede seguir lo que se hace:


# Se genera una rejilla cuadrada desde -2 hasta 2 con 50 puntos intermedios por fila

w1 = seq(-2,2,length=50)

w2 = w1


# Se crea una función de error cuadrática análoga a la que se usaría en un problema de este # estilo, pero con 5 puntos (que son los sumando que la componen)

f1 = function(w1,w2)

{(1 - (2*w1 + w2*3))^2+ (1 -(w1 + w2*4))^2 + (0 - ((-1)*w1 + w2))^2 +

(0 - ((-1)*w1 + (-1)*w2))^2 + (0 - (2*w1 + (-1)*w2))^2}

# Se crea la superficie

z = outer(w1,w2,f1)


# Se obtiene el anterior gráfico

persp(w1,w2,z, theta = 30, phi = 30, expand = 0.5, col = "lightblue")



Pues bien, ahora que está tan de moda los algoritmos de corte más avanzados, como los random forest, xgb, svm, ... conviene tener en cuenta que existen funciones de coste que pueden generar situaciones no tan claras como la figura anterior.


Supóngase que el código anterior, donde se pone f1, se cambia el interior de los sumandos al cuadrado, por una función de tipo logístico tal como sigue:


f1 = function(w1,w2)

{(1 - 1/(1+exp(2*w1 + w2*3)))^2+ (1 - 1/(1+exp(w1 + w2*4)))^2 + (0 - 1/(1+exp((-1)*w1 + w2)))^2 +

(1 - 1/(1+exp((-1)*w1 + (-1)*w2)))^2 + (0 - 1/(1+exp(2*w1 + (-1)*w2)))^2}


La superficie que se genera cambia radicalmente su forma:

Ahora no queda tan claro dónde está el mínimo, ni tampoco si ese mínimo es o no único y ni tan siquiera si existirá o no.


Aquí está un poco la razón por lo que hay que fijar semillas de aleatorización en la mayoría de los algoritmos de Machine Learning, porque dependiendo de donde se empiece, uno puede llegar a un mínimo relativo (que no sea absoluto) o quién sabe al absoluto. En el caso anterior, habría tan solo una función, pero imaginarios que hago la función, de la función, ... entonces la forma de la superficie anterior puede ser aún más retorcida y compleja, eso es justamente lo que sucede, por ejemplo, con las redes neuronales, que al poder elegirse funciones, no lineales y en ocasiones muy complejas, la probabilidad de que los algoritmos conduzcan a mínimos relativos es bastante elevada y es por lo que fuera de los problemas de visión artificial, reconocimiento de imágenes, ... cuando se tratan de aplicar a problemas con no muchos datos para temas predictivos, no siempre ofrecen los resultados que uno espera. Aunque hay que tener en cuenta que hoy en día muchos de estos algoritmos suelen mejorar los modelos tradicionales, no obstante, como sucede en la estadística, "no existen los siempres" y no hay que olvidar que a veces algoritmos sencillos pueden ser efectivos y sobre todo, rápidos en convergencia cuando hay enormes cantidades de datos también.

En el anterior post, titulado astrofotografía para cutres, hablé del equipo mínimo rudimentario para llegar a sacar unas fotos de la luna. Sin embargo, si queremos usar el mismo equipo para fotografiar estrellas, nos daremos cuenta que debido al movimiento aparente de la bóveda aparecen movidas y no quietas. Se necesita algo que permita contrarrestar ese movimiento aparente si queremos llegar a tener una fotografía, como la siguiente.

La estrella que se ve es la maravillosa Vega de la constelación de Lyra. Es una constalación pequeña pero que ofrece numerosos objetos que están al alcance sin necesidad de telescopio.

Para llegar a la foto anterior hace falta:


-Alejarse de Madrid unos 20 o 30 km al menos (aunque cuanto más lejos y menos luz mejor)

-Invertir en un star tracker, la versión adventurer que es la que yo tengo que es una montura que permite contrarestar el movimiento de la bóveda y permitir exposiciones de 20 segundos, dicha montura está al rededor de los 350€


Si queremos aprovechar el dinero en algo más podemos buscar M57 que está en la misma constelación y que dejo que la descubráis. Ahora mismo tengo un churro de foto, porque aún no la he tratado apenas, pero ya sabéis es astrofotografía de muy bajo presupuesto. Iré poco a poco mejorando todo esto





Antes de comenzar esta entrada, a diferencia de las otras, veis que hay curvas y números raros en la entrada Don't panic!!!! Para los que no estáis muy seguros de vuestro dominio matemático, no os preocupéis no voy a "entrar en tripas" como diría el amigo Jack.


Resulta que haciendo un barrido sobre este tema (cosa que de vez en cuando hago), me he encontrado con una biblioteca de funciones en python, que permite una construcción muy sencilla de esos modelos con los que los bancos nos conceden o rechazan hipotecas, o préstamos para comprar un coche, etc.


Pues bien, resulta que los modelos más utilizados por el momento, no son aquellos super complejos y para mucho no entendibles con nombres sugerentes y en inglés como xgbosst, random forest, etc; son precisamente modelos bastante más sencillos y comprensibles donde a partir de un cuestionario, se nos pregunta por la edad, el nivel de ingresos, la antigüedad laboral, el tipo de trabajo, etc. Cada vez que damos respuesta a esas cuestiones o aportamos documentos para contrastarlas, el banco nos concede unos puntos por respuesta y la suma de todos esos puntos se denomina scoring y si se supera determinado nivel se nos da la hipoteca y si no, pues se deniega y "es lo que hay"


Además, para crear esos modelos aparentemente sencillos, los bancos tradicionalmente han gastado y gastan pastizales en software y en consultoría de desarrollo, sin saber (o más bien si querer saber, porque la gente técnica me consta que está bastante bien preparada pero siempre hay otros intereses, ...) que hace unos 3 años (27 de Mayo del 2018), apareció en python, una librería denominada: scorecard que permite la generación de un modo muy sencillo de gran parte del proceso. Por tanto cabe rebajar el gasto en software y trabajar más la parte de puro desarrollo open-source, más customizable y económica. Yo hasta hace poco conocía bien la parte de R, pero desde que uso python, ahora que me ha tocado repasar, reconozco que está muy bien.


La librería la he probado siguiendo el ejemplo de su web que está en https://pypi.org/project/scorecardpy y posteriormente añadiendo un conjunto de datos por fuera que leí usando pandas veo que funciona y permite todo el recorrido de este tipo de modelos, incluidas las manipulaciones manuales, hasta llegar a crear esas modelos de scoring o tarjetas de puntuación con modelos de regresión logística subyacentes como mandan los cánones (la gente más relacionada con el mundo DS entenderá este párrafo mejor).


Así pues cogiendo un conjunto de datos libre como es el archiconocido fichero "GermanData.csv" se genera, variable a variable los tramos óptimos para asignar puntuaciones, como en el ejemplo de la imagen de abajo, donde se expresa como a mayor duración del crédito, mayor tasa de impago y por tanto menos puntos se nos otorgaría, significando esto que, en este caso, un crédito a 40 años por ejemplo, tiene más dificultad de ser concedido que uno de 30:



Aunque de gráficos mejorables porque están con la estética matplotly de python, genera todos los conjuntos de datos necesarios para que se pueda mejorar tanto estos gráficos como para poder hacer lo que sea preciso.


Y finalmente indicar, que a partir de ahora me reviso, por culpa de esto, el cómo estaba impartiendo en los cursos la parte de Credit Scoring y considero seriamente la potencia de python a la vez que recomiendo, a los que necesitéis este tipo de modelos y no conozcáis la librería, que la instaléis con el típico "pip install", es fácil, funciona estupendamente y parece que ya es bastante estable. Lo único que me falta es para ver en grandes conjuntos de datos como respira, eso os lo dejo a vosotros, pero es prometedora.

© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page