Scikit-learn: Familia de funciones de pérdida de Poisson, gamma y tweedie

Creado en 7 dic. 2015  ·  57Comentarios  ·  Fuente: scikit-learn/scikit-learn

Me gustaría sklearn para admitir Poisson, gamma y otras funciones de pérdida de la familia Tweedie. Estas distribuciones de pérdidas se utilizan ampliamente en la industria para el conteo y otros datos de cola larga. Además, se implementan en otras bibliotecas como R: GLM, GLMNET, GBM ext. Parte de la implementación de estas distribuciones sería incluir una forma de pasar las compensaciones a las funciones de pérdida. Esta es una forma común de manejar la exposición cuando se usa una función de enlace de registro con estas distribuciones.

¿La comunidad de sklearn estaría abierta a agregar estas funciones de pérdida? Si es así, yo o (con suerte otros) estaríamos dispuestos a investigar la viabilidad de implementar estas funciones de pérdida y compensaciones en la API de sklearn. Gracias

New Feature

Comentario más útil

@thenomemac Tienes toda la razón acerca de que la función de pérdida cambia debido a la exposición, me equivoqué. De hecho, creo que lo resolví. Tengo un WIP muy temprano (más de solo jugar): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (mira la función _poisson_loss() ).

@ josef-pkt Gracias, miré la implementación de statsmodels, en realidad es bastante buena (excepto por la API, de la que no soy fanático). En realidad, es un poco más general donde su modelo de "conteo" admite otras regresiones basadas en conteo como binomial negativo. La implementación de statsmodel ya tiene en cuenta la exposición y la regularización (que es lo que también estaba buscando).

Dado que statsmodels tiene una implementación, ¿crees que todavía es valioso tener algo como esto en sklearn ? Si es así, puedo intentar esforzarme un poco más para ponerlo en una forma utilizable. He estado bastante ocupado con el trabajo, así que no he tenido mucho tiempo.

Todos 57 comentarios

Creo que al menos deberíamos agregar una regresión de Poisson, aunque no estoy muy familiarizado con ella.
¿Tiene conjuntos de datos de ejemplo abiertos?
¿En qué tipo de datos se utiliza la pérdida gamma?

¿Puedes dar más detalles sobre el desplazamiento?

Todos estos serían modelos separados en linear_model , creo. No estoy seguro de si generalmente se aprenden usando l-bfgs o si las personas usan solucionadores de CD. ¿Tal vez @mblondel o @larsmans o @agramfort saben más?

La distribución de Poisson se usa ampliamente para modelar datos de conteo. Se puede demostrar que es la distribución límite para una aproximación normal a un binomio donde el número de intentos tiende a infinito y la probabilidad tiende a cero y ambos suceden a una tasa tal que np es igual a alguna frecuencia media para su proceso. Se puede demostrar teóricamente que Gamma es el tiempo hasta que ocurre un evento de veneno. Entonces, por ejemplo, la cantidad de accidentes que tendrá este año puede demostrarse teóricamente que es veneno. Y el tiempo esperado hasta su próximo accidente es o tercera extensión es un proceso gamma. Tweedie es un padre generalizado de estas distribuciones que permite un peso adicional en cero. Piense en tweedie como un modelo de pérdida de dólares y el 99 por ciento de todos los clientes tienen peso cero, el resto tiene una pérdida positiva de cola larga o gamma. En la práctica, estas distribuciones se utilizan ampliamente para problemas de regresión en seguros, modelos de peligros, modelos de desastres, finanzas, economía y ciencias sociales. Siéntase libre de hacer referencia a wikipedia. Me gustaría tener estas funciones de pérdida como opciones en glmnet, GBM y random forest. Esto significa que en GBM, por ejemplo, el algoritmo de refuerzo de Freedman usaría esta pérdida en lugar de la pérdida gaussiana o del cuartil. Gamma y poisson (beta tweedie) ya están en los paquetes Rs GBM y glm y xgboost tiene cierto soporte. Los profesionales utilizan las compensaciones para ponderar sus datos por exposición. Por lo general, un modelo de Poisson tiene una función de enlace, por ejemplo: yhat=offset x exp (resultado del modelo de regresión) se denomina enlace de registro y es el más común. Aquí, el desplazamiento permite capturar la exposición de manera diferente para diferentes unidades de observación. Los procesos de Poisson son aditivos, pero es posible que se hayan tomado diferentes ejemplos en un espacio o tiempo no igual o conteos de clientes y, por lo tanto, se necesita el vector de compensación para cada observación. Estoy dispuesto a abordar la programación de esto, pero no estoy muy familiarizado con la API, por lo que agradecería sugerencias, así que lo hago bien y lo incluyo en el lanzamiento.

Bien, estoy trabajando en implementar esto. Estoy agregando las tres distribuciones mencionadas anteriormente y las compensaciones. Agradecería los comentarios de la audiencia general de Sklearn sobre cómo implementar las compensaciones. Estoy planeando agregar un nuevo argumento a la llamada GradientBoostedRegression 'offset = None' donde el desplazamiento sería un objeto similar a un vector con una longitud n (número de muestras). Mi pregunta principal es si debo agregar compensaciones a todas las funciones de pérdida (Gaussian, Huber, Quantile) como se hace en la implementación de GBM de R o si solo debo agregar habilitar las compensaciones para trabajar con la familia tweedie y lanzar una advertencia si intenta utilizar la compensación con una función de pérdida no admitida?

Estaba más pidiendo casos prácticos de uso, como conjuntos de datos o publicaciones. Sé lo que hacen las distribuciones ;)

Probablemente sería una buena adición, aunque no puedo garantizarle que su contribución se fusionará. Probablemente sería bueno discutirlo más ampliamente antes de saltar. A menos que solo quiera implementarlo por sí mismo y no le importe si lo fusionamos;)

Entonces, ¿supongo que está interesado principalmente en el aumento de gradiente, no en los modelos lineales?

ping @pprett @glouppe @arjoly

Estoy interesado en integrarlo todo, pero sobre todo en conjuntos de árboles.
primero. De cualquier manera, serán una buena cantidad de trabajo duplicado como bosque aleatorio
y GBM tienen diferentes ABC para cada función de pérdida. Entonces solo puedo hacer
el trabajo una vez y hacer que funcione en ambos desafortunadamente. tambien puedo conseguir unos
conjuntos de datos ¿Qué aspecto tiene el proceso para fusionar este qué proceso?
debo seguir Soy nuevo en contribuir, así que quiero asegurarme de que esté hecho.
Correcto. Pero como dije, GBM trata las clases de pérdida independientemente de cualquier otra cosa.
en sklearn, por lo que mis cambios en GBM podrían ser independientes fácilmente. solo tengo que
edite el código en el script .py.
El 10 de diciembre de 2015 a las 4:57 p. m., "Andreas Mueller" [email protected] escribió:

Estaba más pidiendo casos prácticos de uso, como en conjuntos de datos o
publicaciones. Sé lo que hacen las distribuciones ;)

Probablemente sería una buena adición, aunque no puedo garantizar que
su contribución se fusionará. Probablemente sería bueno discutirlo.
más ampliamente antes de saltar. A menos que solo desee implementarlo para
tú mismo y no te importa si lo fusionamos;)

Así que supongo que está más interesado en el aumento de gradiente, no en el lineal.
modelos?

haga ping a @pprett https://github.com/pprett @glouppe
https://github.com/glouppe @arjoly https://github.com/arjoly


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-163761067
.

Sería bueno tener algunos aportes de nuestros expertos en GBM a los que hice ping anteriormente, pero también puede escribir a la lista de correo preguntando si la gente estaría interesada en la adición.

¿También planea admitir solucionadores de coordenadas con penalizaciones L1/L2?
como _glmnet
?_

¿Alguna actualización sobre este tema? Me gustaría ver una regresión de Poisson agregada a linear_models para no tener que aventurarme fuera de usar sklearn . Si nadie está trabajando activamente en ello, puedo intentar implementarlo.

nadie AFAIK.

no dude en probarlo y compartir una implementación WIP.

Iba a trabajar en esto y todavía voy también. Si lo hago aunque yo
necesita una forma limpia de agregar compensaciones a la API. Estaba pensando en agregar un
compensar kwarg y el valor predeterminado podría ser Ninguno y arrojar una advertencia si se pierde
no es veneno Principalmente uso poisson para el modelado de seguros donde el
la compensación es log (exposición ganada) Lo sé por experimentación y distribución
teoría de que para datos de conteo dispersos obtendrá un modelo muy inferior
sin compensaciones. Actualmente, el modelo lineal de R y GBM son compatibles con Poisson
con compensaciones. Así que esa es mi herramienta de acceso actual. Me gustaría agregar esto a
Sin embargo, sklearn si otros quieren que se agregue.
El 1 de mayo de 2016 a las 4:03 a. m., "Alexandre Gramfort" [email protected]
escribió:

nadie AFAIK.

no dude en probarlo y compartir una implementación WIP.


Usted está recibiendo esto porque usted fue el autor del hilo.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-216024458

@thenomemac ¿Tiene una implementación WIP que pueda ver?

Para las compensaciones, ¿no podría simplemente requerir que el usuario divida sus conteos por la compensación/exposición para hacer que el valor "y" sea una tasa en lugar de un conteo (https://en.wikipedia.org/wiki/Poisson_regression#. 22Exposición.22_y_compensación)? El paquete GLM de R tiene una excelente interfaz para especificar modelos (incluida la especificación de compensaciones), pero no estoy seguro de cómo encajaría en la API de modelos lineales existente.

@bjlkeng Todavía no tengo una implementación WIP completa. Empecé hace un tiempo y luego me distraje. No creo que dividir por exposiciones para obtener una tasa de poisson sea una derivación correcta del algoritmo GBM para la pérdida de poisson. El offset=log(exposición) en el gradiente es un factor aditivo. Por lo tanto, efectivamente le está dando más peso a las "áreas" con una mayor exposición. No estoy 100% seguro si puede volver al gradiente correcto en cada iteración de ajuste del alumno base (árbol) porque el esquema actual para pasar pesos al alumno del árbol es multiplicativo, no aditivo. Intentaré escribir una derivación matemática más rigurosa de lo que me refiero. Puedo decir que en la práctica sí importa. En los conjuntos de datos del mundo real que he modelado donde esperaría que los datos de conteo fueran poisson, el uso de gbm de R convergerá más rápido y obtendrá un mejor resultado porque está manejando las compensaciones de la manera "matemáticamente" correcta. Y otras implementaciones de gbm como xgboost con una función de pérdida de Poisson no pueden modelar los datos usando una tasa de Poisson como se sugiere.

(aparte, encontré el enlace a este problema en stats.stackexchange

statmodels GLM tiene compensación y exposición (exposición solo para enlace de registro)

En maestro, ahora hay una opción de red elástica para GLM y algunos otros modelos, implementada a través de un bucle de Python para el descenso de coordenadas (usa la máxima verosimilitud genérica con compensación)

En master ahora también está la familia Tweedie para GLM. Sin embargo, no usa la función de pérdida logarítmica completa porque es una suma infinita de términos y calcular una versión truncada es lento y las aproximaciones comúnmente utilizadas no son muy precisas en algún rango del espacio de parámetros.

Entonces, si necesita una implementación de referencia, statsmodels tiene estas partes. Nunca escuché o busqué GBM para GLM. Tampoco sé lo suficiente sobre el código scikit-learn para saber cómo encajaría.
)

@thenomemac Tienes toda la razón acerca de que la función de pérdida cambia debido a la exposición, me equivoqué. De hecho, creo que lo resolví. Tengo un WIP muy temprano (más de solo jugar): https://github.com/bjlkeng/scikit-learn/blob/poisson_regression/sklearn/linear_model/poisson.py (mira la función _poisson_loss() ).

@ josef-pkt Gracias, miré la implementación de statsmodels, en realidad es bastante buena (excepto por la API, de la que no soy fanático). En realidad, es un poco más general donde su modelo de "conteo" admite otras regresiones basadas en conteo como binomial negativo. La implementación de statsmodel ya tiene en cuenta la exposición y la regularización (que es lo que también estaba buscando).

Dado que statsmodels tiene una implementación, ¿crees que todavía es valioso tener algo como esto en sklearn ? Si es así, puedo intentar esforzarme un poco más para ponerlo en una forma utilizable. He estado bastante ocupado con el trabajo, así que no he tenido mucho tiempo.

Creo que esto todavía sería valioso.

@bjlkeng ¡ Gracias por el comentario! ¿Está interesado en tomarlo y hacer una solicitud de extracción? Si no, puedo tratar de tomar este problema e intentar hacer una PR... Primero para poisson y luego para gamma... @agramfort ¿Te parece bien? :)

Hola @raghavrv , perdón por la respuesta tardía. El trabajo estuvo bastante ocupado y también me di cuenta de que tomaría más tiempo del que tenía. Así que por favor siéntete libre de continuar. Echaría un vistazo a la implementación de statsmodel porque tienen la mayor parte de la funcionalidad que creo que querrías aquí.

@raghavrv ¿Empezaste a trabajar en esto? También puedo contribuir para que tengamos al menos una regresión de Poisson en sklearn.

@btabibian @raghavrv ¿Cuál es el estado de esto? Necesito una implementación de regresión de Poisson para un proyecto y estaría dispuesto a contribuir.

Adelante, por favor :) No he tenido tiempo para esto, lo siento...

Igual no he tenido tiempo. También he estado luchando con la API y cómo
integrar compensaciones. Podría mostrar las matemáticas o un ejemplo de código en statsmodels.
Pero TLDR necesita compensaciones si desea usar la regresión de Poisson con
exposiciones desiguales (área o tiempo), entonces necesita compensaciones. El modelo no
dé la ponderación correcta si solo divide sus conteos por exposiciones.

El 1 de abril de 2017 a las 14:49, "(Venkat) Raghav (Rajagopalan)" <
[email protected]> escribió:

Adelante, por favor :) No he tenido tiempo para esto, lo siento...


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-290939521 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AOeuWjVGf3-VmeasNHMLQAB1dnd4zuUQks5rrpw4gaJpZM4Gwd6-
.

Empezaré a investigarlo entonces. @thenomemac gracias por el consejo! Revisaré la implementación de statsmodels para ver cómo manejan la exposición.

Hola, hay alguna actualización? ¿Sería posible también agregar una verosimilitud binomial negativa? Esto no debería suponer una gran diferencia para Poisson. De lo contrario, podría investigar esto ...

Mejor,
Simón

Hola @dirmeier , desafortunadamente no. Cambié a un modelo bayesiano jerárquico y nunca llegué a implementar la regresión de Poisson.

@dirmeier , @jakobworldpeace , ¿hay algún trabajo en progreso que pueda señalarnos? ¿También puedo echar un vistazo a esto?

Hola @NickHoernle ,
Actualmente estoy usando R para la regresión NB, porque no tengo tiempo. Me alegraría si quieres implementar esto :)

@NickHoernle No hay WIP, pero la implementación de la regresión de Poisson de statsmodels debería ayudarlo a comenzar.

Excelente. Voy a empezar a echar un vistazo a esto y ver a dónde llegamos.

He estado trabajando en GLM aquí: https://github.com/madrury/py-glm.

No tengo la intención de que esto se fusione con sklearn, es realmente para que mis alumnos lo usen en clase, pero me gustaría señalar el trabajo en caso de que sea útil para cualquiera que trabaje en este tema.

su solucionador en un método de newton que tendrá dificultades para escalar en alto
dimensión. Tampoco admite penalizaciones de tipo L1. También verifique su API
consistencia con sklearn. El ajuste solo debe tomar X, y y sample_weights

para solucionar los problemas de escalabilidad, lo primero que debe hacer es usar l-bfgs. Ver
nuestro código de regresión logística

HTH

Como dije, mi objetivo no es la consistencia total con sklearn, es solo tener una implementación simple que siga a MuCullagh y Nelder y proporcione algunas de las herramientas inferenciales (lo que creo que lo deja fuera del alcance de sklearn). Está destinado a ser utilizado en un entorno de aula en conjuntos de datos de tamaño mediano. Solo quería vincular el código aquí en caso de que alguna idea sea útil para cualquiera que trabaje en esta función para sklearn (y para obtener un poco de exposición, nunca está de más).

No estoy pensando en las penalizaciones L1 como en el alcance, para eso solo usaría glmnet . L2 es lo suficientemente simple como para incorporarlo al marco GLM clásico que seguí adelante y lo agregué.

En cuanto al método fit , aventuro un pequeño comentario aquí, espero que no esté fuera de lugar. La falta de offset como se proporcionó para encajar fue una gran parte de por qué sklearn no se dio cuenta en mi último trabajo. Realmente necesita eso para hacer un modelo de seguro adecuado. Los reguladores esperan que los modelos de Poisson y Tweedie se ajusten de esa manera y pueden ser bastante rígidos en sus expectativas.

gracias por aclarar la vision.

con respecto a la compensación, ¿es específica para los modelos Poisson y Tweedie?
si es un valor específico de la muestra, entonces puede ser un sample_prop en el ajuste
parámetros
Es solo max_iter o tol que no dependen de los datos que deberían estar en
el inicio

¿Tienes que compararlo con el #9405?

@agramfort Tienes razón sobre max_iter y tol, los moveré a __init__.

¿Tiene una referencia de lo que quiere decir con sample_prop ?

consulte https://github.com/scikit-learn/enhancement_proposals/pull/6

todavía se está discutiendo cuál es la mejor manera de hacerlo...

Una breve nota sobre las compensaciones: AFAIK, los pesos de muestra son suficientes para lidiar con la exposición, es decir, ajustar y = valores / exposición con sample_weight = exposición debería hacer el trabajo y generalizarse bien a otras distribuciones y enlaces que no sean Poisson con log-link.

@madrury Gracias por compartir. Echaré un vistazo a tu implementación y compararé con la mía.

¿La gente todavía está interesada en esto? Estaría interesado en contribuir.

Todavía estoy interesado en la función en caso de que alguien la agregue sklearn.

El jueves 21 de diciembre de 2017 a las 6:04 p. m., Jared Samet [email protected]
escribió:

¿La gente todavía está interesada en esto? Estaría interesado en contribuir.


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-353479618 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AOeuWtvi4Um_o_ERuVe1ob86201G-ASdks5tCuP4gaJpZM4Gwd6-
.

@oracleofnj @thenomemac

Tengo una implementación glm general validada en mi biblioteca py-glm, pero no tengo planes de intentar fusionarla con sklearn (tomé algunas decisiones de diseño que la hacen incompatible con la de sklearn). Está configurado para que sea muy fácil agregar otras familias exponenciales.

También tengo una implementación glmnet de python pura y completa que admite las mismas familias exponenciales en la misma biblioteca, pero me quedé atascado en un error y lo dejé. Me encantaría que me ayudaran a razonar sobre el error, solo necesito algo de motivación para recuperarlo.

@madrury Feliz de intentar ayudarte con ese error.

Hola, algo construido para estas distribuciones? Curioso acerca de cualquier actualización. Gracias.

Estaría personalmente de acuerdo con cerrar este problema para ayudar a los contribuyentes.
enfocar. Razones:

  • El panorama de Python ha cambiado

  • statsmodels ahora es mucho más maduro e incluye estas distribuciones con
    ponderación adecuada de la exposición

  • Las implementaciones basadas en jit a través de pytorch o tensorflow facilitan la
    implementar cualquier pérdida esotárica sin penalización de rendimiento o paquete
    recopilación

¿Pensamientos?

actualmente estamos asignando recursos para ayudar con
https://github.com/scikit-learn/scikit-learn/pull/9405
y hacer que (al menos algunas partes) aterrice en maestro. Debería abordarse
los próximos meses.

Impresionante trabajo !

El sábado 13 de abril de 2019 a las 3:27 Alexandre Gramfort [email protected]
escribió:

actualmente estamos asignando recursos para ayudar con
https://github.com/scikit-learn/scikit-learn/pull/9405
y hacer que (al menos algunas partes) aterrice en maestro. Debería abordarse
los próximos meses.


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/5975#issuecomment-482784732 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AOeuWj8PD0nfltM7Acg12Pfhl4sG5n7Fks5vgYbogaJpZM4Gwd6-
.

Sería genial tener GLM en sciki-learn. Esto reducirá la necesidad de ir a otros idiomas. Estoy deseando que llegue.

Acordado. Viniendo del mundo R, me sorprendió que sklearn aún no tuviera la funcionalidad GLM. Espero que lo haga pronto.

Agregaré otro voto para incluir GLM en sklearn. Es una clase básica de modelos que se enseña en los programas de estadísticas de pregrado. Además, me sorprende el hecho de que haya una sección de "Modelos lineales generalizados" en el manual del usuario que no incluye ninguna discusión sobre funciones de enlace o distribuciones de errores.

@patrickspry Statsmodels tiene una buena implementación de la mayoría de los GLM que aprendería un estudiante universitario.

@patrickspry Hay un PR bastante completo en https://github.com/scikit-learn/scikit-learn/pull/9405 y se está trabajando para fusionar esa funcionalidad.

¡Fantástico! ¡Gracias por el aviso!

¿Algún cronograma estimado para fusionar el PR? Gracias.

@Jiang-Li Ver aquí

Para modelos lineales, hay #14300. Luego está el tema abierto #15123. Personalmente, me gustaría mucho ver modelos basados ​​en árboles con funciones de pérdida de tweedie.

Para los modelos lineales, el #14300 ahora está fusionado, aunque aún se pueden agregar funciones adicionales https://github.com/scikit-learn/scikit-learn/pull/9405#issuecomment -594553953

Personalmente, me gustaría mucho ver modelos basados ​​en árboles con funciones de pérdida de tweedie.

De hecho, ese podría ser el siguiente paso (por ejemplo, https://github.com/scikit-learn/scikit-learn/issues/15123#issuecomment-542090766)

Es impresionante ver el gran trabajo en sklearn 0.23, que incluye el Poisson, gamma y tweedie. Espero ver más mejoras en el futuro.
Al leer la Guía del usuario, la regresión logística está fuera de la regresión lineal generalizada. Tal vez debería haber al menos algunas palabras que indiquen en la sección de regresión lineal generalizada que la regresión logística es un tipo de GLM y se puede resolver usando la misma función de pérdida de desviación.

¿Parece que podemos cerrar el problema ahora que #14300 está fusionado?

Al leer la Guía del usuario, la regresión logística está fuera de la regresión lineal generalizada. Tal vez debería haber al menos algunas palabras que indiquen en la sección de regresión lineal generalizada que la regresión logística es un tipo de GLM y se puede resolver usando la misma función de pérdida de desviación.

¡Gracias por los comentarios @magicmathmandarin ! Si, absolutamente. El PR original https://github.com/scikit-learn/scikit-learn/pull/9405 en realidad incluía la desviación de BinomialDistribution para la regresión logística binaria. La razón por la que no incluimos eso en el primer PR fusionado es que incluso si son parte del mismo marco teórico, la implementación especializada LogisticRegression en la actualidad aún se recomienda (mejor probada por los usuarios, maneja más opciones, por ejemplo, multiclase), y no queríamos confundir a los usuarios. Ahora que está fusionado, estoy de acuerdo en que esa parte se puede formular mejor.

¿Parece que podemos cerrar el problema ahora que #14300 está fusionado?

Por supuesto. Hay algunas discusiones de seguimiento en https://github.com/scikit-learn/scikit-learn/issues/16668 , https://github.com/scikit-learn/scikit-learn/pull/16692 y https: //github.com/scikit-learn/scikit-learn/issues/15123.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

thomasjpfan picture thomasjpfan  ·  60Comentarios

jorisvandenbossche picture jorisvandenbossche  ·  63Comentarios

jwkvam picture jwkvam  ·  73Comentarios

mikeroberts3000 picture mikeroberts3000  ·  102Comentarios

amueller picture amueller  ·  70Comentarios