La búsqueda global no está activada.
Salta al contenido principal
Foro

Foro de debate módulo 3

Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Alberto Fernández Hilario - Número de respuestas: 6

Buenos días.

Creamos este segundo hilo en el foro para todas las dudas que tengáis sobre el módulo 3, respecto a la introducción a Aprendizaje Automático. Por favor, escribir en este hilo todas las cuestiones y dudas que os asalten relacionadas con el contenido, tanto a nivel de temas de concepto como de aplicación. El tenerlo todo concentrado en este hilo facilitará a todos poder encontrar respuestas a preguntas similares que pueden tener.

Muchas gracias!

------------------------

Good morning.

We create this second thread in the forum for all the doubts you may have about module 3 with regards to introduction to Machine Learning. Please, write in this thread all the questions and doubts you may have related to the content of this module, both at the concept and application level. Having everything concentrated in this thread will make it easier for everyone to find answers to similar questions they may have.

Thank you very much!



En respuesta a Alberto Fernández Hilario

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Ester López-Aguilar -
Hola! No entiendo muy bien el concepto de semilla y para que sirve. Me lo podríais explicar de nuevo?

Muchas gracias
En respuesta a Ester López-Aguilar

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Alberto Fernández Hilario -
Hola Ester,

muchas gracias por tu pregunta, ciertamente es mucho más interesante de lo que a priori pudiera parecer, ya que involucra ciertos conceptos bastante importantes con respecto al aprendizaje automático.

En efecto, una gran parte de los algoritmos que aprenden / crean modelos supervisados y no supervisados son del tipo "no determinista". Esto implica que conllevan un cierto grado de aleatoriedad en su comportamiento interno, y por tanto crearán un modelo distinto cada vez que se ejecuten. Lo mismo pasa con los métodos de partición de datos (hold-out o validación cruzada), ya que hacen una división aleatoria entre los ejemplos / instancias del problema.

Si no controlamos esta "aleatoriedad", entonces cada vez que ejecutemos el mismo script sobre los mismos datos obtendremos resultados diferentes, lo que nos dificultará el proceso de validación de la tarea que estamos realizando. En efecto, las diferencias pueden ser relativamente grandes (entre 5 y 10 puntos) por lo que podríamos aceptar o descartar una solución solamente en función de este comportamiento.

Para controlar este aspecto, se hace uso de la denominada "semilla de generación de números aleatorios". En programación / computación no existen los números aleatorios per se, sería imposible de realizar de manera puramente determinista; en su lugar, existe una generación de números "pseudoaleatorios" mediante un proceso estadístico que, utilizando una distribución de probablidad (por ejemplo uniforme) va obteniendo diferentes valores. Eso sí, siempre se arranca desde un número determinado, que identificado como SEMILLA.

Espero que esta explicación haya aclarado un poco el concepto, pero no dudes en volver a consultar si hay algo que siga sin quedar del todo claro.

Un saludo,

Alberto.

-----

Hello Ester,

Thank you very much for your question. It is certainly much more interesting than it may seem at first, as it involves some important concepts regarding machine learning.

Indeed, a large portion of the algorithms that learn/create models, both supervised and unsupervised, are of the “non-deterministic” type. This means that they involve a certain degree of randomness in their internal behavior, and therefore, they will generate a different model each time they are run. The same happens with data partitioning methods (hold-out or cross-validation), as they make a random division between the examples/instances of the problem.

If we don’t control this “randomness,” then each time we run the same script on the same data, we will get different results, which makes the validation process of the task we are performing more difficult. Indeed, the differences can be relatively large (between 5 and 10 points), so we might accept or reject a solution based solely on this behavior.

To control this aspect, the so-called “random number generation seed” is used. In programming/computing, there are no truly random numbers per se; it would be impossible to do so purely deterministically. Instead, a “pseudo-random” number generation process exists through a statistical process that, using a probability distribution (e.g., uniform), generates different values. However, it always starts from a specific number, identified as the SEED.

I hope this explanation has clarified the concept a bit, but don’t hesitate to reach out again if there’s anything that is still unclear.

Best regards,
Alberto.
En respuesta a Alberto Fernández Hilario

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Miguel Ángel Lerma Juárez -
Hola a ambos,

muchas gracias por la explicación extra, yo tampoco digerí de primeras el concepto de semilla, ahora me ha quedado mucho más claro. Curiosamente, conforme estaba estudiando el módulo (concretamente en la parte de k-fold cross validation) me preguntaba: ¿pero los modelos, partiendo de los mismos datos y usando las mismas herramientas, siempre llegan a la misma conclusión? Ahí me hizo "click" el concepto de semilla y la disminución de la aleatoriedad interna en los modelos machine learning.

A nota de curiosidad, me pregunté: ¿por qué se usa siempre 42? Resulta que es una "convención" que muchos informáticos hacen al escoger un número (que debe ser aleatorio) a modo de homenaje del famoso libro "Guía del autoestopista galáctico", de Douglas Adams. En él, el sentido de la vida, el universo y todo lo demás es buscado por un superordenador llamado «Pensamiento Profundo» (Deep Thought), llegando a una respuesta simple: 42.

Gracias de nuevo por la explicación y por el curso, me está sirviendo muchísimo en mi transición a biólogo computacional.

Un saludo,
Miguel.
En respuesta a Miguel Ángel Lerma Juárez

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Alberto Fernández Hilario -
Hola Miguel Ángel,

precisamente el hecho de utilizar una validación cruzada es porque no se puede dar rigor estadístico a un modelo único para su posterior implementación y despliegue. Puede estar sesgado o condicionado a los datos que se han utilizado para entrenamiento vs. test, y por tanto tener una valoración positiva o negativa no por sus características internas, si no simplemente por cómo se han repartido los ejemplos en los dos subconjuntos.

Hay que considerar que cuando realmente se va a poner en uso la herramienta / modelo de ML, sí se entrena con todos los datos disponibles para que "absorba" el mayor conocimiento posible del problema. Lo que se hace con el proceso de validación es simplemente "estimar el comportamiento" en la etapa de uso real. Debido por tanto a la aleatoriedad de las particiones de datos, y de la propia configuración inicial del modelo, es necesario repetir este proceso un buen número de veces para darle ese rigor estadístico.

Finalmente, comentar que el tema del "42" es efectivamente debido a la Guía del autoestopista galáctico. ¿Alguien sabe por qué la respuesta es exactamente 42? Otros números que se utilizan frecuentemente son la siempre recurrente contraseña 123456 o incluso he visto otros números "famosos" como 666 sonrisa

Un saludo,

Alberto.
---
Hello Miguel Ángel,

The reason for using cross-validation is precisely because a single model cannot be given statistical rigor for its subsequent implementation and deployment. It may be biased or conditioned by the data used for training vs. testing, and therefore, its positive or negative evaluation may not be based on its internal characteristics, but simply on how the examples were split between the two subsets.

It is important to note that when the machine learning tool/model is actually put to use, it is trained with all available data to “absorb” as much knowledge as possible about the problem. The validation process is simply meant to “estimate the behavior” during real-world usage. Due to the randomness of the data partitions and the initial model configuration, it is necessary to repeat this process a good number of times to give it statistical rigor.

Finally, I should mention that the “42” topic is indeed due to The Hitchhiker’s Guide to the Galaxy. Does anyone know why the answer is exactly 42? Other frequently used numbers include the ever-present password 123456, or even other “famous” numbers like 666 sonrisa

Best regards,
Alberto.
En respuesta a Alberto Fernández Hilario

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Santiago Rios -
Hola,

No sési estoy a tiempo (no he podido dediarle el tiempo que he querido y voy un poco lento) pero me gustaria preguntar una duda sobre uno de los códigos del Modulo3Capsula2.

En el punto 5.5 se usa la función np.bincount para contar el número de ocurrencias. Es un paso que no acabo de entender. Me gustaria que me volvierais a explicar en que consisten los 2 valores que se muestran en el código.

print('train - {} | test - {}'.format(np.bincount(y_train.iloc[:,0]), np.bincount(y_test.iloc[:,0])))

Gracias de antemano.
Santiago
-------------------------------------------------------------------------------------------------------------------------------------------------------

Hi,

I'm not sure if I'm still on time (I could not dedicate as much time as I wanted), but I’d like to ask a question about one of the codes in Module 3, Capsule 2.

In section 5.5, the np.bincount function is used to count the number of occurrences. It's a step I don’t fully understand. I would appreciate it if you could explain again what the two values shown in the code represent.

print('train - {} | test - {}'.format(np.bincount(y_train.iloc[:,0]), np.bincount(y_test.iloc[:,0])))

Thanks in advance,
Santiago


En respuesta a Santiago Rios

Re: Hilo para consultas, dudas y preguntas / Thread for queries, doubts and questions

de Alberto Fernández Hilario -
Hola Santiago,

No te preocupes, todavía estás a tiempo de resolver las dudas, ¡y no te preocupes si vas un poco más lento, lo importante es que vayas comprendiendo los conceptos!

Respecto a tu pregunta sobre la función np.bincount , te explico:

La función np.bincount se utiliza para contar el número de ocurrencias de valores enteros en un array. En este caso, y_train.iloc[:, 0] y y_test.iloc[:, 0] son las etiquetas de clase en los conjuntos de entrenamiento y test, respectivamente. Cuando se aplica np.bincount, esta función devuelve un array con el número de veces que aparece cada valor entero (en este caso, las clases) en el array de entrada.

En un problema binario (como en este caso, que tiene 2 clases), el resultado será un array con dos valores:
• El primer valor representa la cantidad de veces que aparece la clase 0 (por ejemplo, la clase negativa).
• El segundo valor representa la cantidad de veces que aparece la clase 1 (por ejemplo, la clase positiva).

La línea de código:

print('train - {} | test - {}'.format(np.bincount(y_train.iloc[:, 0]), np.bincount(y_test.iloc[:, 0])))

Lo que hace es imprimir cuántas instancias de cada clase hay tanto en el conjunto de entrenamiento como en el de test. Esto es útil para ver si la distribución de las clases es similar entre ambos conjuntos, ya que en algunos casos podría haber un desbalance de clases (por ejemplo, muchas más muestras de una clase que de la otra). En ese caso, puede ser necesario aplicar técnicas para tratar el desbalance o, como se hace en este caso, para determinar si existe una "ruptura" en la distribución de clases entre ambas particiones.

Aunque np.bincount es muy útil, si quieres usar algo más sencillo, podrías utilizar value_counts de pandas, que también cuenta las ocurrencias de los valores en una columna de un DataFrame. El código equivalente con value_counts sería algo así:

print('train - {} | test - {}'.format(y_train.iloc[:, 0].value_counts(), y_test.iloc[:, 0].value_counts()))

Ambos métodos hacen lo mismo, pero np.bincount puede ser más eficiente para arrays numéricos puros.

Espero que ahora haya quedado más claro. Si tienes más dudas o necesitas más explicaciones, no dudes en preguntar.

¡Ánimo con el curso!
Alberto
----------
Hello Santiago,

Don’t worry, you’re still on time to resolve any doubts, and don’t worry if you’re going a little slower—what’s important is that you’re understanding the concepts!

Regarding your question about the np.bincount function, let me explain:

The np.bincount function is used to count the number of occurrences of integer values in an array. In this case, y_train.iloc[:, 0] and y_test.iloc[:, 0] are the class labels in the training and test datasets, respectively. When np.bincount is applied, it returns an array with the number of times each integer value (in this case, the classes) appears in the input array.

In a binary problem (like in this case, which has 2 classes), the result will be an array with two values:
• The first value represents the number of times class 0 appears (for example, the negative class).
• The second value represents the number of times class 1 appears (for example, the positive class).

The line of code:

print('train - {} | test - {}'.format(np.bincount(y_train.iloc[:, 0]), np.bincount(y_test.iloc[:, 0])))

What it does is print how many instances of each class are in both the training set and the test set. This is useful to see if the class distribution is similar between both sets, as sometimes there could be an imbalance in the classes (for example, many more samples of one class than the other). In that case, it may be necessary to apply techniques to address the imbalance, or, as done here, to determine if there’s a “break” in the class distribution between the two partitions.

Although np.bincount is very useful, if you want something simpler, you could use value_counts from pandas, which also counts the occurrences of values in a DataFrame column. The equivalent code with value_counts would look something like this:

print('train - {} | test - {}'.format(y_train.iloc[:, 0].value_counts(), y_test.iloc[:, 0].value_counts()))

Both methods do the same thing, but np.bincount may be more efficient for pure numerical arrays.

I hope this makes it clearer now. If you have more questions or need further explanations, feel free to ask.

Keep up the good work with the course!
Alberto