01 Introduccion - Python - paraML - Ipynb - Colaboratory
01 Introduccion - Python - paraML - Ipynb - Colaboratory
ipynb - Colaboratory
Introduccion
Visualizacion de datos
Algebra lineal
Feature engineering
Machine Learning
Visualización de Datos
La visualización de datos es esencial para entender nuestros datasets. Nos permite detectar patrones, identificar anomalías y validar modelos.
Con bibliotecas como Matplotlib y Seaborn, podemos crear gráficos y visualizaciones detalladas y personalizables.
Álgebra Lineal
El Álgebra Lineal es la base de muchas técnicas y algoritmos de Machine Learning. Conceptos como vectores, matrices y operaciones entre
ellos son fundamentales para entender y aplicar estos algoritmos. La biblioteca Numpy nos proporciona las herramientas para trabajar con
estos conceptos en Python.
Feature Engineering
Feature Engineering es el proceso de transformar los datos brutos en características que mejor representen el problema a los algoritmos de
Machine Learning, mejorando así su rendimiento. Pandas es una biblioteca muy útil para esta tarea, permitiéndonos manipular datos
fácilmente.
Machine Learning
El Machine Learning nos permite aprender de los datos y hacer predicciones o decisiones sin ser explícitamente programados para hacerlo. Es
una parte fundamental de muchas aplicaciones modernas. Sklearn es una de las bibliotecas más populares para Machine Learning en Python,
proporcionando una gran variedad de algoritmos y herramientas.
Aunque cada uno de estos temas puede ser una disciplina en sí misma, juntos forman las habilidades fundamentales que necesita un
practicante de Machine Learning. Al dominar estos temas, estarás bien preparado para adentrarte en el emocionante campo del Machine
Learning.
Visualización de datos
Importancia de la Visualización de Datos en Machine Learning
La visualización de datos es un componente fundamental en el campo del Machine Learning. Permite entender mejor los datos con los que
estamos trabajando, detectar patrones, identificar anomalías y validar nuestras hipótesis. La visualización es una herramienta poderosa para la
exploración y análisis de datos, así como para la presentación de los resultados de nuestras predicciones y modelos de Machine Learning.
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 1/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Numpy: Es la biblioteca fundamental para la computación científica con Python. Proporciona un objeto de matriz multidimensional y
herramientas para trabajar con estas matrices.
Pandas: Es una biblioteca que proporciona estructuras de datos y funciones de alto nivel para facilitar la manipulación y análisis de
datos. Pandas se integra bien con otras bibliotecas de Python como Numpy y Matplotlib.
Matplotlib: Es la biblioteca de trazado más utilizada en Python. Permite crear una gran variedad de gráficos y visualizaciones con control
completo sobre los estilos y propiedades de los gráficos.
Seaborn: Basado en Matplotlib, Seaborn proporciona una interfaz de alto nivel para crear gráficos estadísticos atractivos. Seaborn trabaja
bien con los DataFrames de Pandas, lo que facilita la visualización de datos.
Estas bibliotecas juntas forman una poderosa caja de herramientas para cualquier científico de datos o profesional de Machine Learning.
Aleatoriedad
Cuando lidiamos con data, siempre es importante tener a manos maneras de generar numeros aleatorios, ya sea para elegir muestras y no
generar sesgos, o por otra razón. En python, tenemos modulos específicos para hacer eso, pero también dentro de numpy tenemos el
submodulo random.
array([4])
seaborn y pyplot
Podemos pasar todo el dia viendo las distintas cosas que se pueden hacer con seaborn y pyplot, pero usemos el poder de google, y por que no,
de chatGPT (u otros LLMs). Como guia genera, aqui estan algunas de las funcionalidades básicas de seaborn: seaborn
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 2/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
# Ahora les damos esos datos empiricos a sns.histoplot. Estamos reemplazando la lista "teorica": [1,2,3,4,5,6]
# con la lista generada
sns.histplot(x, bins=list(range(1,8)), stat='probability').set_title(f'Distribution from {num_samples} samples')
plt.show()
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 3/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Pueden probar generando varias veces, y jueguen con el numero de parametros. Mientras menos tenemos, mas azarozo sera.
# 100000 muestras
rng = np.random.RandomState(seed=1)
num_samples = 100000
x = rng.choice([1,2,3,4,5,6], num_samples)
sns.histplot(x, bins=list(range(1,8)), stat='probability').set_title(f'Distribution from {num_samples} samples')
plt.show()
###
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 4/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
hp['Neighborhood'].mode()[0]
'East'
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 5/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
hp.head()
# Podemos hacer un boxplot, que nos da una idea del rango, de los cuartiles, la mediana, etc.
sns.boxplot(data=hp, y='Price')
plt.show()
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 6/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
No quiero perder mas el tiempo, ni tentarme con mas ejemplos pero les urjo que jueguen con algunos de las siguientes funciones, que pueden
buscarlas en seaborn. Tambien tenemos ejemplos en algunos de los notebooks que subimos en otro lugar del curso:
Feature engineering
A diferencia de metodos estadisticos que pueden funcionar con relativamente pocos datos el ML es muy hambrientos de datos.
Pero, una vez obtenidos los datos, es suficiente? Por lo general, no. Los datos en el mundo real suelen tener diversas fuentes, estar "sucios", no
ser adecuados.
Es comun, por ejemplo, que tengamos datos en distintos formatos (string, en vez de int, datos incompletos, etc).
Consideremos los datos con los que venimos trabajando, por ejemplo. Que hubiera sucedido si alguien hubiera puesto un cero de mas en el
precio? Tendriamos un precio exorbitante que puede cambiar radicalmente nuestros resultados. Y si en vez de un cero de mas hubiera
introducido un signo menos? o una coma. Todas estas cosas y mas tenemos que tener en cuenta al hacer feature engineering.
El Feature Engineering puede incluir técnicas como la normalización, la discretización, la creación de características interactivas, la
codificación de variables categóricas, la imputación de valores perdidos y muchas otras. La elección de las técnicas a utilizar depende en gran
medida de la naturaleza de los datos y del problema a resolver.
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 7/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
En el curso siguiente veran mas en profundidad tecnicas para visualizar y preprocesar datos, pero introduzcamos algunos conceptos basicos, y
modulos de python.
Sklearn facilita el proceso de preprocesamiento de datos y el Feature Engineering gracias a su consistencia en la interfaz y a su eficiencia. Los
métodos de sklearn están diseñados para integrarse de manera eficiente con otras bibliotecas de Python como NumPy y Pandas, lo que facilita
la manipulación de datos.
Entre los submódulos de sklearn que pueden ser útiles para el preprocesamiento de datos y el Feature Engineering, se incluyen:
sklearn.preprocessing: Este módulo incluye métodos para la estandarización, normalización, codificación de variables categóricas, etc.
sklearn.impute: Este módulo proporciona métodos para la imputación de valores perdidos.
sklearn.feature_extraction: Este módulo puede ser útil para convertir datos textuales o categóricos en representaciones numéricas que
pueden ser usadas por los algoritmos de Machine Learning.
sklearn.decomposition: Este módulo incluye métodos para la reducción de dimensionalidad, como PCA.
En resumen, el Feature Engineering es esencial para obtener el máximo rendimiento de nuestros modelos de Machine Learning, y sklearn es
una herramienta excelente que nos ayuda a realizar esta tarea de manera eficiente y efectiva.
# La base de datos con la que habiamos estado trabajando ya tenia datos preprocesados.
# Intentemos con una algo mas imperfecta
movies = pd.read_csv('https://raw.githubusercontent.com/anyoneai/notebooks/main/datasets/imdb_dataset.csv')
print(f"La longitud de esta base de datos es de {len(movies)}")
movies.head()
[u'Marlon Brando',
1 NaN The Godfather R Crime 175.0 u'Al Pacino', u'James
Caan']
[u'Al Pacino',
The Godfather:
2 91 R NaN 200 0 u'Robert De Niro'
Valores faltantes
Inicialmente, ya vemos un valor Nan, en la linea 3, en la columna duration. Esto indica que no hay un valor alli. Hay diferentes formas de tratar
los valores Nan.
# isna, de pandas, nos da una lista de verdaderos y falsos para cada lugar. Falso significa:
# "aqui hay un valor" verdadero indica "aqui hay un Nan", o "aqui no hay ningun valor"
movies.isna()
# Esto es demasiado para leer, con el metodo sum, vemos cuantos nan hay en cada columna.
movies.isna().sum()
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 8/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
star_rating 1
title 0
content_rating 1
genre 1
duration 19
actors_list 0
dtype: int64
# Podemos utilizar un metodo comun, aunque poco sofisticado de tratar a los valores nan:
# reemplazarlos con el valor de la media para esa columna
numericas = movies.select_dtypes(include=['int','float']).columns
print(numericas)
# obtenemos las medias de las numericas
movies[numericas]
star_rating duration
0 9.3 NaN
1 NaN 175.0
2 9.1 200.0
3 9.0 NaN
4 8.9 154.0
medias = movies[numericas].mean()
medias
star_rating 7.888446
duration 120.844792
dtype: float64
star_rating 0
title 0
content_rating 1
genre 1
duration 0
actors_list 0
dtype: int64
Normalizacion de datos
En el contexto del aprendizaje automático, la transformación de datos implica modificar la información para que sea más adecuada y útil para
los modelos de machine learning. Por ejemplo:
Estas transformaciones nos permiten entrenar modelos más efectivos y tomar decisiones inteligentes basadas en los datos.
MinMaxScaler
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 9/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Una técnica popular de normalización es MinMax Scaler. Esta técnica lleva todas las características a una escala entre 0 y 1 , donde el valor
minimo es igual a 0 y el valor maximo es igual a 1. Esta es la formula:
with plt.style.context('dark_background'):
sns.boxplot(data= movies, palette='viridis')
plt.title("Variables sin estandarizar")
plt.xlabel("Categorias")
plt.ylabel("Valores")
plt.show()
Oh no! 😟
with plt.style.context('dark_background'):
sns.boxplot(data= movies, palette='magma')
plt.title("Variables estandarizadas")
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 10/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
plt.xlabel("Categorias")
plt.ylabel("Valores")
plt.show()
Mejor!!!!! 😄
ML (Finalmente)
Conjunto de Datos
El conjunto de datos que utilizaremos se puede encontrar en la siguiente URL:
'https://raw.githubusercontent.com/anyoneai/notebooks/main/datasets/house-prices.csv'
Este conjunto de datos contiene información sobre varias casas, incluyendo su metraje cuadrado y precio. Usaremos estos datos para entrenar
nuestros modelos de aprendizaje automático.
1. Modelo de Regresión Lineal: Este es un modelo simple pero poderoso que asume una relación lineal entre las variables de entrada
(metraje cuadrado) y la única variable de salida (precio).
2. Regresor Ingenuo: Este modelo siempre predecirá el precio mediano de nuestro conjunto de datos de entrenamiento. Es un modelo
simple que usaremos como base para comparar con nuestro modelo de Regresión Lineal.
Clases en Python
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 11/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Como parte de este tutorial, crearemos una clase en Python. Si eres nuevo en las clases en Python, ¡no te preocupes! Revisaremos un poco de
teoría y te guiaremos a través del proceso. Esencialmente, una clase es un plano para crear objetos en Python. Nos permite encapsular datos y
funciones relacionadas en una sola entidad.
Visualización de Datos
Para ayudarnos a entender nuestros datos y el rendimiento de nuestros modelos, utilizaremos Seaborn, una poderosa biblioteca de
visualización de datos en Python. Crearemos gráficos que nos ayudarán a visualizar la distribución de los precios de las casas, la relación entre
el metraje cuadrado y el precio, y el rendimiento de nuestros modelos de aprendizaje automático.
¡Empecemos!
# %matplotlib notebook
%matplotlib inline
plt.rcParams['figure.figsize'] = [8, 6]
hp
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 12/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Una clase es como un plano para crear un objeto. Por ejemplo, podríamos tener una clase Casa que define las propiedades que todas las
casas tienen en común, como el número de habitaciones, el color, el tamaño, etc. También podría definir comportamientos comunes, como
abrir y cerrar puertas o ventanas.
¿Qué es un Objeto?
Un objeto es una instancia de una clase. Siguiendo con el ejemplo anterior, si Casa es una clase, entonces cada casa que construyamos a
partir de esa clase es un objeto. Cada objeto Casa tendría sus propias propiedades únicas, como el número de habitaciones, el color, el
tamaño, etc.
class Casa:
def __init__(self, habitaciones, color, dimensiones):
# Con init, inicio automaticamente ciertas 'atributos' de la clase
# self hace referencia a la instancia de la clase
self.habitaciones = habitaciones
self.color = color
self.dimensiones = dimensiones
self.puerta = "cerrada" #Noten que los 3 atributos anteriores se los pase como parametros, pero self.puerta
# lo pongo por default como "cerrada"
def status_puerta(self):
print(f"La puerta esta {self.puerta}")
# puedo definir metodos en la clase, como cerrar y abrir una puerta, segun su estado actual
def cerrar_abrir_puerta(self):
if self.puerta == "abierta":
self.puerta = "cerrada"
else:
self.puerta = "abierta"
self.status_puerta() # Un metodo dentro de una clase puede llamar a otros dentro de la clase
mi_casa.puerta
'cerrada'
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 13/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
Finalmente, tengan en cuenta que podemos construir varias instancias de una misma clase, cada una de las cuales sera un objeto distinto
<class '__main__.Casa'>
<class '__main__.Casa'>
mi_casa == tu_casa
False
False
Bueno, volvamos a los nuestro. Vamos a crear nuestra primera clase en Python que posta hace algo con nuestros datos. Nuestra clase es un
predictor del valor de una casa, pero no uno muy bueno.
Si no tengo muchas ganas de laburar, puedo organizar todos los precios de las casas de menor a mayor y elegir el del medio, cualquier sean
los datos que me den.
De esta forma, si los datos estan normalmente distribuidos, no le voy a errar por mucho ...
Este valor, el medio, se llama mediana, pero eso quizas ya lo sabian. No confundir con media.
Podria simplemente llamar el metodo de pandas, df.median(), pero tengo ganas de probar las clases de Python.
init: simplemente inicializa la clase con algunos atributos. Recuerdan los pesos?
funcion de fit: En este caso, solo me va a dar la mediana de los datos
funcion predict: Ahora puedo introducir un dato, y me va a dar la prediccion del precio.
funcion cost: Ahora queremos evaluar como nos fue con las predicciones. El costo es una forma de expresar el error de un monton de
predicciones con un solo valor. Hay diferentes calculos que se pueden hacer, pero resumiendo, a menor costo, mejor fueron nuestras
predicciones, y mejor funciona el modelo. Si quieren, pueden cambiar la forma de predecir el error, tomando por ejemplo el error
promedio.
class NaiveRegressor():
"""
Este modelo calcula la mediana y lo usa como el valor predicho
"""
def __init__(self):
self.w0 = 0
self.w1 = 0
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 14/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
# Entrenamos el modelo
nv_regressor.fit(X=hp["SqFt"], y=hp["Price"])
125950.0
# Pero tambien predigo que una casa de 25000 pies cuadrados tendra:
nv_regressor.predict(25_000)
125950.0
125950.0
🤔 hmmmmm.....teniendo en cuenta que el palacio de Buckingham tiene 400_000 pies cuadrados es sospechoso ...
x1 = hp["SqFt"].min()
x2 = hp["SqFt"].max()
y1 = nv_regressor.predict(x1)
y2 = nv_regressor.predict(x2)
plt.xlabel('Pies cuadrados')
plt.ylabel('Precio en dolares')
sns.lineplot(x=[x1, x2], y=[y1, y2], color='r') # mostramos nuestra prediccion en rojo
# sns.lineplot(x=[x1,x2],y=[hp['Price'].mean()]*2, color='b')
plt.show()
x1 = hp["SqFt"].min()
x2 = hp["SqFt"].max()
y1 = nv_regressor.predict(x1)
y2 = nv_regressor.predict(x2)
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 15/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
plt.xlabel('Pies cuadrados')
plt.ylabel('Precio en dolares')
sns.lineplot(x=[x1, x2], y=[y1, y2], color='r') # mostramos nuestra prediccion en rojo
plt.show()
Ahora, sin entrar en detalles, vemos que puede hacer un modelo simple, pero real, de sklearn
lr1 = LinearRegression()
X = hp.SqFt.values.reshape(-1, 1)
y = hp.Price.values
▾ LinearRegression
LinearRegression()
Veamos como se compara con nuestro modelo un poco peresozo. La libreria sklearn.metrics tiene distintos funciones para evaluar a
nuestros modelos. La funcion de costo que usamos previamente se llama "error cuadrado medio", o mean_squared_error, y es ampliamente
utilizada en modelos de regresion lineal.
import warnings
warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning)
# Primero, obtengamos una intuicion de lo que hace el modelo y como se compara con lo que hicimos anteriormente:
sns.scatterplot(x='SqFt', y='Price', data=hp).set_title('Precio vs Superficie')
x1 = hp["SqFt"].min()
x2 = hp["SqFt"].max()
y1 = lr1.predict(np.array([[x1]]))[0] # Ojo, aca predict de skearn espera siempre un array de 2 dimensiones
y2 = lr1.predict(np.array([[x2]]))[0] # Ojo, nos devuelve tambien un array (o vector)
plt.xlabel('Pies cuadrados')
plt.ylabel('Precio en dolares')
sns.lineplot(x=[x1, x2], y=[y1, y2], color='r') # mostramos nuestra prediccion en rojo
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 16/17
20/6/23, 15:03 Introduccion_Python_paraML.ipynb - Colaboratory
plt.show()
Mejoramos nuestro error al predecir una linea que se ajusta mas a los datos. En las proximas clases, entraremos en detalle con el modelo de
regresion lineal
https://colab.research.google.com/drive/1NN0ujvf1zIJNqtey4Ve6DyMwslbfb8Ak?usp=sharing#scrollTo=97902dbd&printMode=true 17/17