Árboles de Decisión
Datos disponibles en https://www.kaggle.com/c/titanic/data?select=train.csv
Un árbol de decisión es una forma gráfica y analítica que presenta sucesos y sus posibles consecuencias.
Ventajas:
Claridad en los datos
Tolerantes al ruido y valores faltantes
Las reglas extraídas permiten hacer predicciones
Desventajas:
Criterio de división es deficiente
Sobreajuste
Ramas poco significativas
Cómo se divide un árbol de decisión?
Ganancia de Información
Dividir en pequeños árboles
Optimización del modelo:
Evitar sobreajuste
Selección de atributos, evaluando cuales son aquellos atributos que nos permitirán dividir mejor y ganar más información al hacerlo.
No tener campos nulos, ya que estos agregan mucho ruido al árbol y afecta a la división de la información
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
%matplotlib inline
sns.set()
test_df = pd.read_csv('/work/titanic-test.csv')
train_df = pd.read_csv('/work/titanic-train.csv')
train_df.head()
train_df.shape
test_df.shape
train_df.info()
test_df.info()
train_df.Sex.value_counts().plot(kind = 'bar', color = ['b', 'r'])
plt.title('Distribución de pasajeros por Género')
plt.show()
train_df[ train_df['Survived'] == 1 ]['Sex'].value_counts().plot(kind='bar', color=['b','r'])
plt.title('Distribucion de sobrevivientes')
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
encoder_sex = label_encoder.fit_transform(train_df['Sex'])
train_df.head()
train_df.isnull().any()
test_df.isnull().any()
train_df['Age'] = train_df['Age'].fillna(train_df['Age'].median())
train_df['Embarked'] = train_df['Embarked'].fillna('S')
train_predictors = train_df.drop(['PassengerId', 'Survived', 'Name', 'Ticket', 'Cabin'], axis = 1)
categorical_cols = [cname for cname in train_predictors.columns if
train_predictors[cname].nunique() < 10 and
train_predictors[cname].dtype == 'object'
]
numerical_cols = [cname for cname in train_predictors.columns if
train_predictors[cname].dtype in ['int64', 'float64']
]
my_cols = categorical_cols + numerical_cols
train_predictors = train_predictors[my_cols]
dummy_encoded_train_predictors = pd.get_dummies(train_predictors)
train_df['Pclass'].value_counts()
x_features_one = dummy_encoded_train_predictors.values
y_target = train_df['Survived'].values
x_train, x_validation, y_train, y_validation = train_test_split(x_features_one, y_target, test_size = .25, random_state = 1)
tree_one = tree.DecisionTreeClassifier()
tree_one = tree_one.fit(x_features_one, y_target)
tree_one_accuracy = round(tree_one.score(x_features_one, y_target), 4)
print('Accuracy: %0.4f' % (tree_one_accuracy))
! pip install pydotplus
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')