Fundamentos pr谩cticos

1

Aplica Platzidoro en este curso y asegura el 茅xito de tu aprendizaje

2

Los fundamentos de machine learning que aprender谩s

3

Introducci贸n a Numpy

4

Introducci贸n y manipulaci贸n de datos con Pandas

5

Introducci贸n a ScikitLearn

6

Comandos b谩sicos de las librer铆as usadas en el curso (Numpy, Pandas y ScikitLearn)

Regresi贸n Lineal y Log铆stica

7

驴Qu茅 es la predicci贸n de datos?

8

Sobreajuste y subajuste en los datos

9

Regresi贸n lineal simple y regresi贸n lineal m煤ltiple

10

Regresi贸n lineal simple con Scikit-Learn: divisi贸n de los datos

11

Regresi贸n lineal simple con Scikit-Learn: creaci贸n del modelo

12

Regresi贸n log铆stica con Scikit-Learn: definici贸n y divisi贸n de datos

13

Regresi贸n log铆stica con Scikit-Learn: evaluaci贸n del modelo

14

Matriz de confusi贸n

15

PlatziDoro C谩psula 1

脕rboles de decisi贸n

16

驴Qu茅 es un 谩rbol de decisi贸n y c贸mo se divide?

17

Comprendiendo nuestro data set para la creaci贸n de un 谩rbol de decisi贸n

18

Creando un clasificador con Scikit-Learn

19

Entrenamiento del modelo de clasificaci贸n

20

Visualizaci贸n del 谩rbol de decisi贸n

K-Means

21

驴Qu茅 es K-Means?

22

Cargando el data set de Iris

23

Construcci贸n y evaluaci贸n del modelo con K-Means

24

Graficaci贸n del modelo

25

PlatziDoro C谩psula 2

Aprendizaje profundo

26

Introducci贸n al aprendizaje profundo

27

Conceptos b谩sicos de Tensor Flow

28

Red neuronal convolucional

29

Conociendo el set de datos para la creaci贸n de la red neuronal

30

Crea y entrena tu primera red neuronal convolucional con Tensor Flow

31

Evaluaci贸n de la red convolucional

32

PlatziDoro C谩psula 3

Despedida

33

Recomendaciones para analizar correctamente tu problema

34

Siguientes pasos para continuar aprendendiendo de Machine Learning

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Creando un clasificador con Scikit-Learn

18/34
Recursos

Aportes 37

Preguntas 12

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

algunas cosas que comentar que pueden ser utiles

  • cuando se hace el drop intentando eliminar algunas variables que no ser谩n de inter茅s, axis = 1 indica que estas variables son "columnas ", axis = 0 , indicar铆a que son filas.
  • las dummy variables que se mencionan ligeramente convierten las variables categ贸ricas en indicadoras como 0,1,2,鈥tc
  • cuando se completaron los valores faltantes en las variables edad y la clase del pasajero (embarked), falt贸 mencionar un comando muy util para saber en que variables se tienen valores faltantes. Se puede usar train_df.isnull.any().

Cuando se llenan los espacios con vac铆os (fillna), para el caso de datos num茅ricos se utiliza la mediana porque es una de las medidas de tendencia central que menos se afecta por los datos at铆picos.

Para el caso de los datos categ贸ricos relacionados con el embarque, se utiliza la letra S porque representa el embarque en la ciudad de South Hampton, en donde m谩s personas se unieron al viaje.

Estos datos se obtienen de un an谩lisis previo a los datos trabajados.

  • 脡sta l铆nea: encoder_sex = label_encoder.fit_transform(data_set_train[鈥楽ex鈥橾) , transforma una etiqueta textual a un equivalente num茅rico.
  • 脡sta l铆nea: categorical_cols = [cname for cname in train_predictors.columns if
    train_predictors[cname].nunique() <10 and
    train_predictors[cname].dtype == 鈥榦bject鈥
    ]
    Encuentra las columnas que contiene informaci贸n no num茅rica.
  • 脡sta l铆nea: numerical_cols = [cname for cname in train_predictors.columns if
    train_predictors[cname].dtype in [鈥榠nt64鈥, 鈥榝loat64鈥橾
    ]
    Encuentra las columnas con datos num茅ricos.

Estoy bien? o entend铆 algo mal. Quedo a la espera de sus comentarios. gracias.

Tratamiento de Datos

  • Para transformar datos cualitativos a un c贸digo que entienda la m谩quina podemos usar un label encoder, se encuentra en el m贸dulo preprocessing:
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
encoder_sex = label_encoder.fit_transform(train_df['Sex'])

Obtenemos as铆 un encoder para la columna Sexo (no usaremos este encoder, usaremos el m茅todo de dummies)

  • Completaremos los valores nulos de Age (con la media de edades) y Embarked (con 鈥楽鈥; embarcados en Southampton)
train_df.Age = train_df.Age.fillna(train_df.Age.median())
train_df.Embarked = train_df.Embarked.fillna('S')
  • Eliminamos la columnas que no consideramos necesarias
train_predictors = train_df.drop(['PassengerId','Survived','Name','Ticket','Cabin'], axis=1) #axis=1 se refiere a las columnas (axis=0 鈫 filas)
  • Separamos las columnas categ贸ricas de las num茅ricas:
    • Para detectar la columnas categ贸ricas analizamos la columna con dtype (debe ser igual a 鈥榦bject鈥), consideramos adem谩s que no haya mas de 10 diferentes valores (como factor de seguridad)
categorical_cols = [cname for cname in train_predictors.columns if train_predictors[cname].nunique() <10
                    and train_predictors[cname].dtype=='object']
- Para detectar la columnas num茅ricas analizamos la columna con dtype (debe ser igual a 'int64' o 'float64')
numerical_cols = [cname for cname in train_predictors if
                  train_predictors[cname].dtype in ['int64','float64']]
-  Unimos nuevamente las columnas en una sola variable pero con los datos num茅ricos separados de los categ贸ricos
my_cols = categorical_cols+numerical_cols
train_predictors = train_predictors[my_cols]
  • Usamos el m茅todo get_dummies para codificar las variables num茅ricas
dummy_encoded_train_predictors = pd.get_dummies(train_predictors)
  • Ahora tenemos nuestra data sin valores vac铆os y codificada, lista para entrenar nuestro algoritmo

Si a alguno de ustedes no les quedo muy en claro c贸mo funciona la instrucci贸n ". get_dummies() " , en este video lo esplican muy bien.

https://www.youtube.com/watch?v=0s_1IsROgDc

Una manera mas sencilla de filtrar las columnas a mi parecer, parece un poco mas enredoso por que todo se hace con funciones y propiedades de pandas, pero les recomiendo mucho aprender ha usar esta libreria.

number_cols = df_train.select_dtypes(include = 'number').columns.tolist()

categorical_cols = ( df_train.select_dtypes(include='object').nunique() < 10 )
categorical_cols = categorical_cols[categorical_cols == True].index.tolist()
number_cols, categorical_cols
<h3>Explicacion del codigo:</h3>

Con la funcion select_dtypes puedes muestra el valor de las columnas que tengan ese tipo ( Los tipos de todas columnas se puede ver con el metodo info o con la propiedad dtypes), puedes incluir o excluir los tipos, como en ese caso solo nos interesan las columnas usamos la propiedad columns del DataFrame y lo convertimos a una lista con la funcion tolist


Para las variables categoricas es un poco mas complejo ya que la primer parte devuelve un objeto de tipo Series de pandas como indices tiene todas las columnas del tipo seleccionado y como valor es un valor booleano ( True o False ) depende de si cumple la condicion ( En ese caso, que el numero de datos unicos sea menor a 10 ) y al final solo filtro la Serie para quedarme con los valores que cumplen con la condicion ( valor True ) y como los indices son las columnas me quedo solo con los indices y lo convierto a una lista

No entend铆 realmente por qu茅 despu茅s de separar los datos categ贸ricos y los n煤mericos, a train_predictors se le asigna los mismos datos pero organizados diferente, pero sigue siendo lo mismo.

import pandas as pd 
import matplotlib.pylot as plt
import seaborn as sns
import re
import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split

%matplotlib inline  
sns.set()

test_df = pd.read_csv('/content/titanic-test.csv')
train_df = pd.read_csv('/content/titanic-train.csv')

train_df.head()


train_df.info()

train_df.Sex.value_counts().plot(kind='bar', color =['b', 'r'])
plt.title('Distribucion de sobrevivientes')
plt.show()


from skelearn preprocessing
label_encoder = preprocessing.LabelEcoder()
encoder_sex = label_encoder.fit_transform(train_df['sex'])
train_df.head()
train_df['Age'] = train_df['Age'].fillna(train_df['Age'].median())
train_df['Embarked'] = train_df ['Embarked'].fillna('S')

#Eliminar datos inensarios
train_predictors = train_df.drop(['PassengerId','Survived', 'Name','Tciket', 'Cabin'], axis = 1)

categorical_cols = [cname for in train_predictos.columns if 
                    train_predictors[cname].nunique() < 10 and 
                    train_predcitors[cname].dtype  == 'object'  
                                       
                    ]            

numerical_cols [cname for cname in train_predictors.columns if train_predictors[cname].dtype in ['int64', 'float64']]
my_cols = categorical_cols + numeric_cols
train_predictors = Train_predictors ['my_cols']

dummy_encoded_train_predictors = pd.get_dummies(train_predictors)
train_df ['Pclass'].value_counts()

#variable predictora
y_target = train_df ['Survived'].values
x_features_one = dummy_encoded_train_predictors

x_train, x_validation, y_train, y_validation = train_test_split(x_features_one, y_target, test_size = .25, random_state = 1)

#prediccion
tree_one = tree.DecisionTreeClassifier()
tree_one = tree_one.fit(x_features_one, y_target)

#que tan cercano predice
tree_one_accuracy = round (tree_one.score(x_features_one, y_target), 4)
print('Accuracy:  %0.4f' % (tree_one_accuracy))

from io import StringIO
from IPython.display import Image, display
import pydotplus

out = StringIO
tree.export_graphviz(tree_one, out_file=out)
graph = pydotplus.graph_from_dot_data(out.getvalue())
graph.write_png('titanic.png')```

No entend铆 para que se hace el LabelEncoder en la columna Sex, pero nunca se lo utiliza.

Para saber si tenemos elementos nulos en nuestro dataset y en que columnas, usamos

trainTitanicDataset.isnull().any()

Que da como resultado:

PassengerId    False
Survived       False
Pclass         False
Name           False
Sex            False
Age             True
SibSp          False
Parch          False
Ticket         False
Fare           False
Cabin           True
Embarked        True
dtype: bool

Recordemos que la columna Cabin fue descartada con la funcion .drop, por lo que no fue necesario rellenar sus valores nulos.

Un error en el min 3:31 escribi贸 la mediana en lugar de la media

Una manera de llenar los datos faltantes de la edad, es, utilizar una nube de datos alrededor de la media, para ser m谩s preciso, una desviaci贸n est谩ndar de la media, de esta meneara nos adherimos un poco m谩s a la distribuci贸n de los datos.

mean = np.mean(train_df.append(test_df)['Age'])
    std  = np.std(train_df.append(test_df)['Age'])
    nans = dataset['Age'].isna().sum()
    
    
ramdom_age = np.random.randint(mean - std , mean + std , size=nans)
    copy = dataset['Age'].copy()
    copy[copy.isna()] = ramdom_age
    dataset['Age'] = copy
    dataset['Age'] = dataset['Age'].astype(int)


no entend铆 muy bien el paso de categorical_cols y numerical_cols

Me sent铆 s煤per perdido en esta clase
Realmente creo que buscar茅 m谩s inofrmaci贸n aparte鈥
驴Alguna recomendaci贸n?

Dummies, lo que hace es dividir las columnas de 鈥渃ategorias鈥 que tengan un valor no numerico (como por ejemplo una letra), si revisan la tabla van a ver que tiene 3 columnas mas

Se puede hacer exactamente lo mismo con este c贸digo:

cat_col = ['Sex','Embarked']
df_cat = pd.get_dummies(train[cat_col])
df_cat

#Concatenar dos dataframes
train_dummies = pd.concat([train_predictors, df_cat], axis=1)
train_dummies.drop(['Sex','Embarked'], axis = 1, inplace = True)
train_dummies

Algo que no me parece correcto es eliminar variables porque si. Entiendo que para facilitar el curso es mucho mejor borrar estas variables del dataframe, pero al hacerlo no se menciona que se pierde informaci贸n VALIOSA.

Error en su codigo, al hacer get_dummies() solo ejecuta el metodo en la ultima columna 鈥淓mbarked鈥(lo clasifica en embarked_C,embarked_Q y embarked_S ), hagan un print para verificar.
Si quieren aplicar get_dummies a una tabla con varias columnas seria asi:
pd.get_dummies(data = table_name , columns = columns_names ), o sea

pd.get_dummies(data = train_predictors, columns = my_cols )

Que mal que cometan estos errores, confunden cuando uno no se da cuenta.

Aunque la columna Pclass es de tipo entero, yo creo que deber铆a de ser una variable categ贸rica y no num茅rica

  • Los datos categ贸ricos aparecen cuando una variable se mide en una escala que solo incluye a los posibles encuestados en un n煤mero limitado de grupos. Por ejemplo, una encuesta donde se recoge informaci贸n sobre variables como el g茅nero, estado civil o afiliaci贸n pol铆tica. Fuente: Tema 1: Introducci贸n al An谩lisis de datos Categ贸ricos

  • Una variable ficticia o dummy variable es aquella para reemplazar una variable no cuantificable y que toma solo el valor 0 o 1 para indicar la ausencia o presencia de alg煤n efecto categ贸rico que se puede esperar que cambie el resultado. Fuentes: Dummy variable y Variable ficticia

Escoge los mejores features

Es importante realizar un an谩lisis estad铆stico para saber cuales variables independientes (features) son significativos en tu modelo, ya que en varias ocasiones muchos de ellos no aportan nada al modelo. De igual forma, es importante ver si existen correlaciones entre ellos, puesto que en ocasiones una variable podr铆a representar el comportamiento de las demas. Esto es 煤til para optimizar recursos computacionales y tiempos de entrenamiento.

TODO HASTA EL MOMENTO CON COMENTARIOS
EN ALGUNOS CASOS SI DESEA MAS INFORMACION ELIMINE COMENTARIO

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re
import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split

#datos prueba / entrenamiento
test_df = pd.read_csv(鈥榯itanic-test.csv鈥)
train_df = pd.read_csv(鈥榯itanic-train.csv鈥)

#Exploracion
train_df.info()
train_df.head()
train_df.dtypes

#Si desea explorar por Sexo sin grafica

train_df.Sex.value_counts()

Explore visualizacion de sobrevivientes x Sexo

train_df[train_df[鈥楽urvived鈥橾 == 1 ][鈥楽ex鈥橾.value_counts().plot(kind=鈥榖ar鈥, color=[鈥榖鈥,鈥榬鈥橾)

plt.title(鈥楧istribucion de sobrevivientes鈥)

#Para ser entendido un dato
#por la maquina, se crea un label encoder
#el modelo usara campo Sex de tipo 鈥榦bject鈥
#el cual puede ser modificado a tipo categoria

from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
encoder_sex = label_encoder.fit_transform(train_df[鈥楽ex鈥橾)
train_df[鈥楽ex鈥橾 = encoder_sex

#Limpiar informacion
#===================

#Manejo de nulos
train_df[鈥楢ge鈥橾 = train_df[鈥楢ge鈥橾.fillna(train_df[鈥楢ge鈥橾.median() )
train_df[鈥楨mbarked鈥橾 = train_df[鈥楨mbarked鈥橾.fillna(鈥楽鈥)

#Los campos que no se pueden predecir eliminelos
#y cree nuevo dataframe
train_predictors = train_df.drop([鈥楶assengerId鈥, 鈥楽urvived鈥, 鈥楴ame鈥, 鈥楥abin鈥橾, axis=1)

#Crear lista de columnas categoricas del dataFrame
#Condiciones unicos < 10 y tipo objeto

TENGO DUDA DE PORQUE nunique< 10 ???

categorical_cols = [cname for cname in train_predictors.columns if
train_predictors[cname].nunique() < 10 and
train_predictors[cname].dtype ==鈥榦bject鈥
]

print(categorical_cols)

-> Resultado [鈥楨mbarked鈥橾

#Si desea explorar valores posibles de Embarked

train_df.Embarked.value_counts()

#Crear lista de columnas numericas del dataFrame
#Condicion int64, float64
numerical_cols = [cname for cname in train_predictors.columns if
train_predictors[cname].dtype in [鈥榠nt64鈥,鈥榝loat64鈥橾
]
#print(numerical_cols)

-> Resultado [鈥楶class鈥, 鈥楽ex鈥, 鈥楢ge鈥, 鈥楽ibSp鈥, 鈥楶arch鈥, 鈥楩are鈥橾

Muchas cosas en el aire鈥 Pero bueno, algo sacamos, ah铆 vamos avanzando.

pd.get_dummies(train_predictors)
estamos convirtiendo datos categ贸rigos en datos num茅ricos

Me siento iluminado al ver el curso por segunda vez 馃槃

Para saber cual es la cantidad de nulos que se tienen con pandas es:

df.isna().sum()

El resultado indicar谩 la cantidad de nulos por columna

La definici贸n de las variables en el data set del titanic:
https://www.kaggle.com/c/titanic/data

Compa帽eros, no entend铆 exactamente que es cname y como funciona la siguiente estructura
cname for cname in 鈥
Recuerdo que la estudie en cursos anteriores, pero no recuerdo donde
Si alguien me pudiera ayudar estar铆a muy agradecido
Saludos

Recomiendo leer esto para entender mejor preprocessing.LabelEncoder

otra forma de obtener las columnas categoricas y numericas:

numerical_cols = train_predictors.select_dtypes(include=['int64','float64']).columns

Dummies, lo que hace es dividir las columnas de 鈥渃ategorias鈥 que tengan un valor no numerico (como por ejemplo una letra), si revisan la tabla van a ver que tienen nuevas columnas.
Esto es util porque reemplaza lo de usar 鈥渆ncoders鈥 todo el rato

Algunos puntos que es importante saber:
-label_encoder

Codifica etiquetas de una caracter铆stica categ贸rica en valores num茅ricos entre 0 y el n煤mero de clases menos 1

El metodo fit lo entrena (crea un mapeado entre las etiquetas y los numeros dichos anteriormente

El metodo transform, transforma las etiquetas que se incluyan como argumento

Fuentes:
https://www.interactivechaos.com/python/function/labelencoder#:~:text=LabelEncoder codifica etiquetas de una,n煤mero de clases menos 1.&text=El 煤nico atributo de esta,cada etiqueta en el array).

Las variables dummies, podr铆amos decir, que separa ciertas etiquetas o columnas de acuerda a la variedad de sus datos

Ser铆a bueno cursos donde expliquen las librer铆as mas usadas, ya s茅 que existe la documentaci贸n y el curso de Pandas pero mejorar铆a la comprensi贸n de los estudiantes si ya tenemos experiencias usandos est谩s librer铆as

Tengo una observaci贸n, al utilizar las siguientes lineas de codigo:

from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
encoder_sex = label_encoder.fit_transform(train_df[鈥楽ex鈥橾)
encoder_sex

no se le asigno al DataFrame train_df original, es decir no se guardo el cambio, por lo que la columna train_df[鈥楽ex鈥橾 no surti贸 efectos.

Cuando la profesora completo los datos de la edad no utiliza la media como ella lo dice, si no utiliza la mediana que no en todos los casos son iguales.