import os
import graphviz
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import tree
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
from sklearn.tree import export_graphviz
from sklearn.metrics import confusion_matrix
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import warnings
import plotly.express as px
from collections import OrderedDict
from predictPy import Analisis_Predictivo
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.neighbors import KNeighborsClassifier
warnings.filterwarnings("ignore")
from PIL import Image
from sklearn.svm import SVC
import plotly.graph_objs as go
import matplotlib.image as mpimg

pd.options.display.max_rows = 10
def indices_general(MC, nombres = None):
    precision_global = np.sum(MC.diagonal()) / np.sum(MC)
    error_global     = 1 - precision_global
    precision_categoria  = pd.DataFrame(MC.diagonal()/np.sum(MC,axis = 1)).T
    if nombres!=None:
        precision_categoria.columns = nombres
    return {"Matriz de Confusión":MC, 
            "Precisión Global":   precision_global, 
            "Error Global":       error_global, 
            "Precisión por categoría":precision_categoria}
            
            
import matplotlib.ticker as mticker

def distribucion_variable_predecir(data:pd.DataFrame,variable_predict:str, ax = None):
    if ax == None:
        fig, ax = plt.subplots(1,1, figsize = (15,10), dpi = 200)
    colors = list(dict(**mcolors.CSS4_COLORS))
    df = pd.crosstab(index = data[variable_predict],columns = "valor") / data[variable_predict].count()
    countv = 0
    titulo = "Distribución de la variable %s" % variable_predict
    
    for i in range(df.shape[0]):
        ax.barh(1, df.iloc[i], left = countv, align = 'center', color = colors[11 + i], label = df.iloc[i].name)
        countv = countv + df.iloc[i]
        
    ax.set_xlim(0,1)
    ax.set_yticklabels("")
    ax.set_ylabel(variable_predict)
    ax.set_title(titulo)
    ticks_loc = ax.get_xticks().tolist()
    ax.xaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
    ax.set_xticklabels(['{:.0%}'.format(x) for x in ticks_loc])
    
    countv = 0
    for v in df.iloc[:,0]:
        ax.text(np.mean([countv, countv + v]) - 0.03, 1 , '{:.1%}'.format(v), color = 'black', fontweight = 'bold')
        countv = countv + v
    ax.legend(loc = 'upper center', bbox_to_anchor = (1.08, 1), shadow = True, ncol = 1)
    
    
def poder_predictivo_categorica(data: pd.DataFrame, var: str, variable_predict: str, ax=None):
    if ax == None:
        fig, ax = plt.subplots(1, 1, figsize = (15, 10), dpi = 200)
    df = pd.crosstab(index = data[var], columns = data[variable_predict])
    df = df.div(df.sum(axis = 1), axis = 0)
    titulo = "Distribución de la variable %s según la variable %s" % (var, variable_predict)
    df.plot(kind = 'barh', stacked = True,   legend = True, ax = ax,
            xlim = (0, 1), title   = titulo, width = 0.8)
            
    ticks_loc = ax.get_xticks().tolist()
    ax.xaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
    ax.set_xticklabels(['{:.0%}'.format(x) for x in ticks_loc])
    ax.legend(loc = 'upper center', bbox_to_anchor = (1.08, 1), 
              shadow = True, ncol = 1)
              
    for bars in ax.containers:
        plt.setp(bars, width = .9)
    for i in range(df.shape[0]):
        countv = 0
        for v in df.iloc[i]:
            ax.text(np.mean([countv, countv+v]) - 0.03, i,
                    '{:.1%}'.format(v), color = 'black', fontweight = 'bold')
            countv = countv + v

def poder_predictivo_numerica(data:pd.DataFrame, var:str, variable_predict:str):
    sns.FacetGrid(data, hue = variable_predict, height = 8, aspect = 1.8).map(sns.kdeplot, var, fill = True).add_legend()
    
#1

foto = mpimg.imread("C:/Users/Rodrigo/Desktop/TEC/Concentracion/Matriz_Confusion.png") 
plt.imshow(foto)
plt.show()

#2

class Evaluador:
    def __init__(self):
        pass

    def evaluar(self, matriz_confusion):
        VP = matriz_confusion[0][0]
        FP = matriz_confusion[0][1]
        FN = matriz_confusion[1][0]
        VN = matriz_confusion[1][1]

        total = VP + FP + FN + VN

        precision_global = (VP + VN) / total
        error_global = (FP + FN) / total
        PP = VP / (VP + FP)
        PN = VN / (VN + FN)
        PFP = FP / (FP + VN)
        PFN = FN / (FN + VP)
        AP = VP / (VP + FN)
        AN = VN / (FP + VN)

        resultados = {
            'Precision Global': precision_global,
            'Error Global': error_global,
            'Precision Positiva': PP,
            'Precision Negativa': PN,
            'Proporcion de Falsos Positivos': PFP,
            'Proporcion de Falsos Negativos': PFN,
            'Asertividad Positiva': AP,
            'Asertividad Negativa': AN
        }

        return resultados


prueba = Evaluador()

matriz_confusion = [[782243, 238], [8553, 245]]

resultados = prueba.evaluar(matriz_confusion)
print(resultados)

### Los resultados son muy buenos ya que la precision global es muy alta, 99%, sin embargo sería un error solo fijarnos en eso. Haciendo el análisis más a profundidad, podemos ver que la presición positiva es del 99%, la negativa fue de 2%. y por ultimo la acertividad positiva fue 98%. Por lo que se puede concluir que el modelo es muy bueno. 
## {'Precision Global': 0.9888901386236713, 'Error Global': 0.011109861376328703, 'Precision Positiva': 0.9996958392599948, 'Precision Negativa': 0.027847238008638326, 'Proporcion de Falsos Positivos': 0.4927536231884058, 'Proporcion de Falsos Negativos': 0.010815684449592562, 'Asertividad Positiva': 0.9891843155504074, 'Asertividad Negativa': 0.5072463768115942}
#3

##1
datos = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/hotel_bookings_completo.csv")
datos

##2
##               hotel  ... total_of_special_requests
## 0      Resort Hotel  ...                         0
## 1      Resort Hotel  ...                         1
## 2      Resort Hotel  ...                         1
## 3      Resort Hotel  ...                         1
## 4      Resort Hotel  ...                         1
## ...             ...  ...                       ...
## 20374    City Hotel  ...                         1
## 20375    City Hotel  ...                         0
## 20376    City Hotel  ...                         0
## 20377    City Hotel  ...                         1
## 20378    City Hotel  ...                         0
## 
## [20379 rows x 19 columns]
distribucion_variable_predecir(datos,"is_canceled")
plt.show()
### El problema establecido esta equilibrado, ya que la variable a predecir esta alrededor de la mitad. "No" tiene el 46% en cuanto a "yes" tiene 53.9%. 

##3

for col in ['hotel','arrival_date_month','assigned_room_type','deposit_type','customer_type']:
    datos[col] = datos[col].astype('category')
    
data_num = pd.get_dummies(datos, columns=['hotel','arrival_date_month','assigned_room_type','deposit_type','customer_type'])
data_num = data_num.drop(columns=['assigned_room_type_K', 'assigned_room_type_P'])

X = data_num.loc[:, data_num.columns != 'is_canceled']
X = pd.DataFrame(StandardScaler().fit_transform(X), columns= [X.columns])
y = datos["is_canceled"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

k_values = range(2, 20, 1)
indices = {}
for k in k_values:
  prediccionknn = KNeighborsClassifier(n_neighbors=k).fit(X_train.values,y_train).predict(X_test.values)
  labels = ["No","Yes"]
  MC = confusion_matrix(y_test, prediccionknn,labels=labels)
  indices[k] = indices_general(MC, labels)
  
for k in k_values:
  print("\n" +"*" * 20 + "\nPara k = %i\n" % k + "*" * 20 )
  for i in indices[k]:
    print("\n%s:\n%s"%(i,str(indices[k][i])))
    
### La mejor opción fue K= 3 con 85% de presición global y 86% en la presicion por categoria "yes". es decir que se puede predecir con 86% de confiansa cuales reservaciones sí se van a cancelar

##4
## 
## ********************
## Para k = 2
## ********************
## 
## Matriz de Confusión:
## [[1793  164]
##  [ 468 1651]]
## 
## Precisión Global:
## 0.844946025515211
## 
## Error Global:
## 0.15505397448478897
## 
## Precisión por categoría:
##          No       Yes
## 0  0.916198  0.779141
## 
## ********************
## Para k = 3
## ********************
## 
## Matriz de Confusión:
## [[1624  333]
##  [ 307 1812]]
## 
## Precisión Global:
## 0.8429833169774289
## 
## Error Global:
## 0.1570166830225711
## 
## Precisión por categoría:
##          No      Yes
## 0  0.829842  0.85512
## 
## ********************
## Para k = 4
## ********************
## 
## Matriz de Confusión:
## [[1737  220]
##  [ 404 1715]]
## 
## Precisión Global:
## 0.8469087340529932
## 
## Error Global:
## 0.15309126594700684
## 
## Precisión por categoría:
##          No       Yes
## 0  0.887583  0.809344
## 
## ********************
## Para k = 5
## ********************
## 
## Matriz de Confusión:
## [[1623  334]
##  [ 305 1814]]
## 
## Precisión Global:
## 0.8432286555446517
## 
## Error Global:
## 0.15677134445534835
## 
## Precisión por categoría:
##          No       Yes
## 0  0.829331  0.856064
## 
## ********************
## Para k = 6
## ********************
## 
## Matriz de Confusión:
## [[1721  236]
##  [ 398 1721]]
## 
## Precisión Global:
## 0.8444553483807654
## 
## Error Global:
## 0.1555446516192346
## 
## Precisión por categoría:
##          No       Yes
## 0  0.879407  0.812176
## 
## ********************
## Para k = 7
## ********************
## 
## Matriz de Confusión:
## [[1611  346]
##  [ 322 1797]]
## 
## Precisión Global:
## 0.8361138370951914
## 
## Error Global:
## 0.16388616290480862
## 
## Precisión por categoría:
##          No       Yes
## 0  0.823199  0.848042
## 
## ********************
## Para k = 8
## ********************
## 
## Matriz de Confusión:
## [[1696  261]
##  [ 392 1727]]
## 
## Precisión Global:
## 0.8397939156035329
## 
## Error Global:
## 0.1602060843964671
## 
## Precisión por categoría:
##          No       Yes
## 0  0.866633  0.815007
## 
## ********************
## Para k = 9
## ********************
## 
## Matriz de Confusión:
## [[1620  337]
##  [ 329 1790]]
## 
## Precisión Global:
## 0.8366045142296369
## 
## Error Global:
## 0.1633954857703631
## 
## Precisión por categoría:
##          No       Yes
## 0  0.827798  0.844738
## 
## ********************
## Para k = 10
## ********************
## 
## Matriz de Confusión:
## [[1689  268]
##  [ 375 1744]]
## 
## Precisión Global:
## 0.8422473012757605
## 
## Error Global:
## 0.15775269872423947
## 
## Precisión por categoría:
##          No      Yes
## 0  0.863056  0.82303
## 
## ********************
## Para k = 11
## ********************
## 
## Matriz de Confusión:
## [[1622  335]
##  [ 332 1787]]
## 
## Precisión Global:
## 0.8363591756624141
## 
## Error Global:
## 0.16364082433758587
## 
## Precisión por categoría:
##         No       Yes
## 0  0.82882  0.843322
## 
## ********************
## Para k = 12
## ********************
## 
## Matriz de Confusión:
## [[1680  277]
##  [ 381 1738]]
## 
## Precisión Global:
## 0.838567222767419
## 
## Error Global:
## 0.16143277723258098
## 
## Precisión por categoría:
##          No       Yes
## 0  0.858457  0.820198
## 
## ********************
## Para k = 13
## ********************
## 
## Matriz de Confusión:
## [[1630  327]
##  [ 334 1785]]
## 
## Precisión Global:
## 0.8378312070657508
## 
## Error Global:
## 0.16216879293424924
## 
## Precisión por categoría:
##          No       Yes
## 0  0.832908  0.842378
## 
## ********************
## Para k = 14
## ********************
## 
## Matriz de Confusión:
## [[1679  278]
##  [ 376 1743]]
## 
## Precisión Global:
## 0.8395485770363101
## 
## Error Global:
## 0.16045142296368986
## 
## Precisión por categoría:
##          No       Yes
## 0  0.857946  0.822558
## 
## ********************
## Para k = 15
## ********************
## 
## Matriz de Confusión:
## [[1620  337]
##  [ 318 1801]]
## 
## Precisión Global:
## 0.8393032384690874
## 
## Error Global:
## 0.1606967615309126
## 
## Precisión por categoría:
##          No       Yes
## 0  0.827798  0.849929
## 
## ********************
## Para k = 16
## ********************
## 
## Matriz de Confusión:
## [[1670  287]
##  [ 370 1749]]
## 
## Precisión Global:
## 0.8388125613346418
## 
## Error Global:
## 0.16118743866535823
## 
## Precisión por categoría:
##          No       Yes
## 0  0.853347  0.825389
## 
## ********************
## Para k = 17
## ********************
## 
## Matriz de Confusión:
## [[1619  338]
##  [ 343 1776]]
## 
## Precisión Global:
## 0.8329244357212954
## 
## Error Global:
## 0.16707556427870462
## 
## Precisión por categoría:
##          No       Yes
## 0  0.827287  0.838131
## 
## ********************
## Para k = 18
## ********************
## 
## Matriz de Confusión:
## [[1663  294]
##  [ 376 1743]]
## 
## Precisión Global:
## 0.8356231599607459
## 
## Error Global:
## 0.16437684003925412
## 
## Precisión por categoría:
##         No       Yes
## 0  0.84977  0.822558
## 
## ********************
## Para k = 19
## ********************
## 
## Matriz de Confusión:
## [[1612  345]
##  [ 342 1777]]
## 
## Precisión Global:
## 0.8314524043179587
## 
## Error Global:
## 0.16854759568204125
## 
## Precisión por categoría:
##         No       Yes
## 0  0.82371  0.838603
k_values = [3]
indices = {}

for algoritmo in ["ball_tree", "kd_tree", "brute"]:
    for k in k_values:
        clf = KNeighborsClassifier(n_neighbors=k, algorithm=algoritmo)
        clf.fit(X_train, y_train)
        prediccion = clf.predict(X_test)
        labels = ["No", "Yes"]
        MC = confusion_matrix(y_test, prediccion, labels=labels)
        TP = MC[0, 0]
        TN = MC[1, 1]
        FP = MC[1, 0]
        FN = MC[0, 1]
        precision_global = (TP + TN) / (TP + TN + FP + FN)
        precision_variable = {"Yes": TP / (TP + FN), "No": TN / (TN + FP)}
        indices[(algoritmo, k)] = {"Matriz de Confusión": MC, "Precisión Global": precision_global, "Precisión por Variable": precision_variable}
KNeighborsClassifier(algorithm='brute', n_neighbors=3)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
for (algoritmo, k) in indices:
    print(f"\n{'*' * 30}\nPara algoritmo={algoritmo}, k={k}\n{'*' * 30}")
    for metric in indices[(algoritmo, k)]:
        print(f"\n{metric}:\n{indices[(algoritmo, k)][metric]}")

### No hubo un mejor modelo, ya que los tres motrores dieron los mismos resultados con 85% de precision global y 84% de precisión de la categoría "yes". Lo que significa que no valdria la pena cambiar de algoritmo.


##5
## 
## ******************************
## Para algoritmo=ball_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1624  333]
##  [ 306 1813]]
## 
## Precisión Global:
## 0.8432286555446517
## 
## Precisión por Variable:
## {'Yes': 0.8298415942769545, 'No': 0.855592260500236}
## 
## ******************************
## Para algoritmo=kd_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1624  333]
##  [ 306 1813]]
## 
## Precisión Global:
## 0.8432286555446517
## 
## Precisión por Variable:
## {'Yes': 0.8298415942769545, 'No': 0.855592260500236}
## 
## ******************************
## Para algoritmo=brute, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1624  333]
##  [ 307 1812]]
## 
## Precisión Global:
## 0.8429833169774289
## 
## Precisión por Variable:
## {'Yes': 0.8298415942769545, 'No': 0.8551203397829165}
datos.dtypes
## hotel                          category
## is_canceled                      object
## lead_time                         int64
## arrival_date_month             category
## stays_in_weekend_nights           int64
##                                  ...   
## days_in_waiting_list              int64
## customer_type                  category
## adr                             float64
## required_car_parking_spaces       int64
## total_of_special_requests         int64
## Length: 19, dtype: object
poder_predictivo_numerica(datos,"lead_time","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"stays_in_weekend_nights","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"stays_in_week_nights","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"adults","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"children","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"previous_cancellations","is_canceled")
plt.show()
## Traceback (most recent call last):
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\backends\backend_qt.py", line 468, in _draw_idle
##     self.draw()
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\backends\backend_agg.py", line 400, in draw
##     self.figure.draw(self.renderer)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\artist.py", line 95, in draw_wrapper
##     result = draw(artist, renderer, *args, **kwargs)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\artist.py", line 72, in draw_wrapper
##     return draw(artist, renderer)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\figure.py", line 3140, in draw
##     mimage._draw_list_compositing_images(
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
##     a.draw(renderer)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\artist.py", line 72, in draw_wrapper
##     return draw(artist, renderer)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\axes\_base.py", line 3028, in draw
##     self._update_title_position(renderer)
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\axes\_base.py", line 2961, in _update_title_position
##     if (ax.xaxis.get_ticks_position() in ['top', 'unknown']
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\axis.py", line 2451, in get_ticks_position
##     self._get_ticks_position()]
##   File "C:\Users\Rodrigo\AppData\Local\R-MINI~1\envs\R-RETI~1\lib\site-packages\matplotlib\axis.py", line 2155, in _get_ticks_position
##     major = self.majorTicks[0]
## IndexError: list index out of range

poder_predictivo_numerica(datos,"previous_bookings_not_canceled","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"booking_changes","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"days_in_waiting_list","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"adr","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"required_car_parking_spaces","is_canceled")
plt.show()

poder_predictivo_numerica(datos,"total_of_special_requests","is_canceled")
plt.show()

poder_predictivo_categorica(datos,"assigned_room_type","is_canceled")
plt.show()

poder_predictivo_categorica(datos,"deposit_type","is_canceled")
plt.show()

poder_predictivo_categorica(datos,"customer_type","is_canceled")
plt.show()

X = X[["stays_in_weekend_nights","adults","children","previous_cancellations","previous_bookings_not_canceled","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund", "deposit_type_No Deposit"]]
k_values = [3]
indices = {}

for algoritmo in ["ball_tree", "kd_tree", "brute"]:
    for k in k_values:
        clf = KNeighborsClassifier(n_neighbors=k, algorithm=algoritmo)
        clf.fit(X_train, y_train)
        prediccion = clf.predict(X_test)
        labels = ["Yes", "No"]
        MC = confusion_matrix(y_test, prediccion, labels=labels)
        TP = MC[0, 0]
        TN = MC[1, 1]
        FP = MC[1, 0]
        FN = MC[0, 1]
        precision_global = (TP + TN) / (TP + TN + FP + FN)
        precision_variable = {"Yes": TP / (TP + FN), "No": TN / (TN + FP)}
        indices[(algoritmo, k)] = {"Matriz de Confusión": MC, "Precisión Global": precision_global, "Precisión por Variable": precision_variable}
KNeighborsClassifier(algorithm='brute', n_neighbors=3)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
for (algoritmo, k) in indices:
    print(f"\n{'*' * 30}\nPara algoritmo={algoritmo}, k={k}\n{'*' * 30}")
    for metric in indices[(algoritmo, k)]:
        print(f"\n{metric}:\n{indices[(algoritmo, k)][metric]}")
        
###Los resultados varian en cuestion de centésimas, es decir que no vale la pena en cuestion de acertividad, sin embargo, es una buena practica trabajar con menos variables, es decir que si se puede cambiar el modelo escogiendo las 10 mejores variables.       
        
##6
## 
## ******************************
## Para algoritmo=ball_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1813  306]
##  [ 333 1624]]
## 
## Precisión Global:
## 0.8432286555446517
## 
## Precisión por Variable:
## {'Yes': 0.855592260500236, 'No': 0.8298415942769545}
## 
## ******************************
## Para algoritmo=kd_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1813  306]
##  [ 333 1624]]
## 
## Precisión Global:
## 0.8432286555446517
## 
## Precisión por Variable:
## {'Yes': 0.855592260500236, 'No': 0.8298415942769545}
## 
## ******************************
## Para algoritmo=brute, k=3
## ******************************
## 
## Matriz de Confusión:
## [[1812  307]
##  [ 333 1624]]
## 
## Precisión Global:
## 0.8429833169774289
## 
## Precisión por Variable:
## {'Yes': 0.8551203397829165, 'No': 0.8298415942769545}
X = data_num.loc[:, data_num.columns != 'is_canceled']
X = pd.DataFrame(StandardScaler().fit_transform(X), columns= [X.columns])
y = datos["is_canceled"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

instancia_arbol = DecisionTreeClassifier(min_samples_leaf=500)
instancia_arbol.fit(X_train,y_train)
DecisionTreeClassifier(min_samples_leaf=500)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
prediccionarbol = instancia_arbol.predict(X_test)
MC = confusion_matrix(y_test, prediccionarbol)
indices = indices_general(MC,list(np.unique(y)))
for k in indices:
    print("\n%s:\n%s"%(k,str(indices[k])))

##7
    
## 
## Matriz de Confusión:
## [[1584  247]
##  [ 468 1777]]
## 
## Precisión Global:
## 0.8245829244357213
## 
## Error Global:
## 0.17541707556427866
## 
## Precisión por categoría:
##          No       Yes
## 0  0.865101  0.791537
fig, ax = plt.subplots(1,1, figsize = (15,10), dpi = 200)

tree.plot_tree(instancia_arbol, feature_names = list(X.columns.values), class_names=["hotel","arrival_date_month","assigned_room_type","deposit_type","customer_type", "lead_time", "stays_in_weekend_nights","stays_in_week_nights","adults","children","previous_cancellations","previous_bookings_not_canceled","booking_changes","days_in_waiting_list","adr","required_car_parking_spaces","total_of_special_requests"], filled = True)
fig.savefig('arbol_hotel.png')

fotohotel = mpimg.imread("C:/Users/Rodrigo/Desktop/TEC/Concentracion/arbol_hotel.png") 
plt.imshow(fotohotel)
plt.show()



##8

X = X[["stays_in_weekend_nights","adults","children","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"]]
X = pd.DataFrame(StandardScaler().fit_transform(X), columns=X.columns)
y = datos["is_canceled"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

instancia_arbol = DecisionTreeClassifier(min_samples_leaf=500)
instancia_arbol.fit(X_train,y_train)
DecisionTreeClassifier(min_samples_leaf=500)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
prediccion = instancia_arbol.predict(X_test)
MC = confusion_matrix(y_test, prediccion)
indices = indices_general(MC,list(np.unique(y)))
for k in indices:
    print("\n%s:\n%s"%(k,str(indices[k])))
    
## 
## Matriz de Confusión:
## [[1283  568]
##  [ 874 1351]]
## 
## Precisión Global:
## 0.6462217860647694
## 
## Error Global:
## 0.35377821393523057
## 
## Precisión por categoría:
##          No       Yes
## 0  0.693139  0.607191
fig, ax = plt.subplots(1,1, figsize = (15,10), dpi = 150)

tree.plot_tree(instancia_arbol, feature_names = list(X.columns.values), class_names=["stays_in_weekend_nights","adults","children","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"], filled = True)
fig.savefig('arbol_hotel2.png')

fotohotel2 = mpimg.imread("C:/Users/Rodrigo/Desktop/TEC/Concentracion/arbol_hotel2.png")
plt.imshow(fotohotel2)
plt.show()

### No mejora. En realidad empeora de manera significativa, por lo que se concluye que para el motor de árboles de decisión, se recomienda dejar todas las variables para una acertividad mayor.


##9

instancia_bosques = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9)
RF_hoteles = Analisis_Predictivo(data_num,predecir = "is_canceled",
                                    modelo       = instancia_bosques,
                                    estandarizar = True,
                                    train_size   = 0.8)
resultados_bosque = RF_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1680  181]
##  [ 290 1925]]
## 
## Precisión Global:
## 0.8844455348380765
## 
## Error Global:
## 0.11555446516192347
## 
## Precisión por categoría:
##         No       Yes
## 0  0.90274  0.869074
instancia_gbc = GradientBoostingClassifier(n_estimators = 100, criterion = "friedman_mse", min_samples_split = 9)
XGB_hoteles = Analisis_Predictivo(data_num,
                                    predecir = "is_canceled",
                                    modelo = instancia_gbc, 
                                    train_size  = 0.8)
resultados_agc = XGB_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1657  228]
##  [ 336 1855]]
## 
## Precisión Global:
## 0.8616290480863592
## 
## Error Global:
## 0.1383709519136408
## 
## Precisión por categoría:
##          No       Yes
## 0  0.879045  0.846645
instancia_tree = DecisionTreeClassifier(min_samples_split = 3, 
                                        max_depth = None,
                                        criterion = "gini")
instancia_ada = AdaBoostClassifier(base_estimator = instancia_tree,
                                   n_estimators   = 100)

ADA_hoteles =Analisis_Predictivo(data_num, 
                                       predecir = "is_canceled", 
                                       modelo = instancia_ada,
                                       train_size  = 0.8)
resultados_ada = ADA_hoteles.fit_predict_resultados()

### Si son buenos los resultados ya que varian entre el 84 y 87%, el algoritmo que mejor dio resultados fue el de ADA con una precision global de 85% y 87% por la categoria "Yes".

##10
## 
## Matriz de Confusión:
## [[1550  339]
##  [ 210 1977]]
## 
## Precisión Global:
## 0.8653091265947007
## 
## Error Global:
## 0.13469087340529928
## 
## Precisión por categoría:
##         No       Yes
## 0  0.82054  0.903978
instancia_bosques = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9)
RF_hoteles = Analisis_Predictivo(data_num,
                                    predecir = "is_canceled",
                                    predictoras = ["stays_in_weekend_nights","adults","children","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"],
                                    modelo = instancia_bosques, 
                                    train_size  = 0.8)
resultados_bosque = RF_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1368  510]
##  [ 832 1366]]
## 
## Precisión Global:
## 0.6707556427870461
## 
## Error Global:
## 0.32924435721295386
## 
## Precisión por categoría:
##          No       Yes
## 0  0.728435  0.621474
instancia_gbc = GradientBoostingClassifier(n_estimators = 100, criterion = "friedman_mse", min_samples_split = 9)
XGB_hoteles = Analisis_Predictivo(data_num,
                                    predecir = "is_canceled",
                                    predictoras = ["stays_in_weekend_nights","adults","children","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"],
                                    modelo = instancia_gbc, 
                                    train_size  = 0.8)
resultados_agc = XGB_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1144  735]
##  [ 631 1566]]
## 
## Precisión Global:
## 0.6648675171736997
## 
## Error Global:
## 0.33513248282630026
## 
## Precisión por categoría:
##          No      Yes
## 0  0.608834  0.71279
instancia_tree = DecisionTreeClassifier(min_samples_split = 3, 
                                        max_depth = None,
                                        criterion = "gini")
instancia_ada = AdaBoostClassifier(base_estimator = instancia_tree,
                                   n_estimators   = 100)

ADA_hoteles =Analisis_Predictivo(data_num, 
                                       predecir = "is_canceled", 
                                       modelo = instancia_ada,
                                       predictoras = ["stays_in_weekend_nights","adults","children","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"],
                                       train_size  = 0.8)
resultados_ada = ADA_hoteles.fit_predict_resultados() 

### No, en realidad empeora al solo poner las mejores variables con una media 66% en precision global y 60% en la categoria "Yes". Es decir que no se recomienda quitar variables para estos algoritmos de precisión.

##11
## 
## Matriz de Confusión:
## [[1190  683]
##  [ 680 1523]]
## 
## Precisión Global:
## 0.665603532875368
## 
## Error Global:
## 0.334396467124632
## 
## Precisión por categoría:
##          No      Yes
## 0  0.635344  0.69133
instancia_svm = SVC(kernel="linear", C = 15)

analisis_hoteles = Analisis_Predictivo(data_num, predecir = "is_canceled",modelo = instancia_svm, train_size = 0.80)

resultados_svm = analisis_hoteles.fit_predict_resultados()

### Los resultados no son los mejores ya que tienen una presicion global del 83% y una precision de la categoria "Yes" es de 79%, por lo que es un motor de precision bastante mediocre, sin embargo que si se podría utilizar

##12
## 
## Matriz de Confusión:
## [[1688  189]
##  [ 424 1775]]
## 
## Precisión Global:
## 0.8496074582924436
## 
## Error Global:
## 0.15039254170755645
## 
## Precisión por categoría:
##          No       Yes
## 0  0.899307  0.807185
instancia_svm = SVC(kernel="rbf", C = 15)

analisis_hoteles = Analisis_Predictivo(data_num, predecir = "is_canceled",modelo = instancia_svm, train_size = 0.80)

resultados_svm = analisis_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1655  225]
##  [ 342 1854]]
## 
## Precisión Global:
## 0.8608930323846908
## 
## Error Global:
## 0.13910696761530916
## 
## Precisión por categoría:
##          No       Yes
## 0  0.880319  0.844262
instancia_svm = SVC(kernel="sigmoid", C = 15)

analisis_hoteles = Analisis_Predictivo(data_num, predecir = "is_canceled",modelo = instancia_svm, train_size = 0.80)

resultados_svm = analisis_hoteles.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[1434  447]
##  [ 464 1731]]
## 
## Precisión Global:
## 0.7764965652600588
## 
## Error Global:
## 0.22350343473994116
## 
## Precisión por categoría:
##         No      Yes
## 0  0.76236  0.78861
instancia_svm = SVC(kernel="poly", degree = 4,  C = 15)

analisis_hoteles = Analisis_Predictivo(data_num, predecir = "is_canceled",modelo = instancia_svm, train_size = 0.80)

resultados_svm = analisis_hoteles.fit_predict_resultados()

### Si mejoran los resultados. El mejor modelo fue el del nucleo Kernel de RBF con 84% de acertividad en que si se van a cancelar las reservaciones.

##13
## 
## Matriz de Confusión:
## [[1678  228]
##  [ 389 1781]]
## 
## Precisión Global:
## 0.8486261040235525
## 
## Error Global:
## 0.15137389597644746
## 
## Precisión por categoría:
##          No       Yes
## 0  0.880378  0.820737
instancia_svm = SVC(kernel="rbf", C = 15)

analisis_hoteles = Analisis_Predictivo(data_num, predecir = "is_canceled",modelo = instancia_svm, train_size = 0.80, predictoras = ["stays_in_weekend_nights","previous_cancellations","booking_changes","total_of_special_requests","deposit_type_Refundable","deposit_type_Non Refund"])

resultados_svm = analisis_hoteles.fit_predict_resultados()

### los resultados no mejoraron, ya que sacaron 66% de prediccion en la variable que si se van a cancelar las reservaciones. bajo un 20% en la categoría "Yes"

##14
## 
## Matriz de Confusión:
## [[1122  799]
##  [ 703 1452]]
## 
## Precisión Global:
## 0.6315014720314034
## 
## Error Global:
## 0.3684985279685966
## 
## Precisión por categoría:
##          No       Yes
## 0  0.584071  0.673782
class Evaluador:
    def __init__(self):
        pass
        
    def evaluar(self, matriz_confusion):
        VP = matriz_confusion[0][0]
        FP = matriz_confusion[0][1]
        FN = matriz_confusion[1][0]
        VN = matriz_confusion[1][1]
        
        total = VP + FP + FN + VN
        
        precision_global = (VP + VN) / total
        error_global = (FP + FN) / total
        PP = VP / (VP + FP)
        PN = VN / (VN + FN)
        PFP = FP / (FP + VN)
        PFN = FN / (FN + VP)
        AP = VP / (VP + FN)
        AN = VN / (FP + VN)
        
        resultados = {
            'Precision Global': precision_global,
            'Error Global': error_global,
            'Precision Positiva': PP,
            'Precision Negativa': PN,
            'Proporcion de Falsos Positivos': PFP,
            'Proporcion de Falsos Negativos': PFN,
            'Asertividad Positiva': AP,
            'Asertividad Negativa': AN
        }
        
        return resultados, None
        
resultados_svm = [[1682,197],[369,1828]]
resultados_ada = [[1606,302],[269,1899]]
resultados_agc = [[1620,240],[326,1890]]
resultados_bosque = [[1682,186],[309,1899]]
prediccion = [[1325,533],[849,1369]]
prediccionknn = [[1579,292],[321,1884]]
prediccionarbol = [[1619,251],[449,1757]]

evaluador = Evaluador()

variables = {'SVM': resultados_svm,
             'ADA': resultados_ada,
             'AGC': resultados_agc,
             'Bosque': resultados_bosque,
             'Prediccion': prediccion,
             'Prediccion KNN': prediccionknn,
             'Prediccion Arbol': prediccionarbol}

metricas = ['Precision Global', 'Error Global', 'Precision Positiva', 'Precision Negativa', 'Proporcion de Falsos Positivos', 'Proporcion de Falsos Negativos', 'Asertividad Positiva', 'Asertividad Negativa']


for nombre_variable, variable in variables.items():
    print(nombre_variable + ":")
    resultados, _ = evaluador.evaluar(variable)
    for metrica in metricas:
        print("\t{}: {:.4f}".format(metrica, resultados[metrica]))


### El mejor modelo fue Bosque:
    #Precision Global: 0.8786
    #Error Global: 0.1214
    #Precision Positiva: 0.9004
    #Precision Negativa: 0.8601
    #Proporcion de Falsos Positivos: 0.0892
    #Proporcion de Falsos Negativos: 0.1552
    #Asertividad Positiva: 0.8448
    #Asertividad Negativa: 0.9108

##15
## SVM:
##  Precision Global: 0.8611
##  Error Global: 0.1389
##  Precision Positiva: 0.8952
##  Precision Negativa: 0.8320
##  Proporcion de Falsos Positivos: 0.0973
##  Proporcion de Falsos Negativos: 0.1799
##  Asertividad Positiva: 0.8201
##  Asertividad Negativa: 0.9027
## ADA:
##  Precision Global: 0.8599
##  Error Global: 0.1401
##  Precision Positiva: 0.8417
##  Precision Negativa: 0.8759
##  Proporcion de Falsos Positivos: 0.1372
##  Proporcion de Falsos Negativos: 0.1435
##  Asertividad Positiva: 0.8565
##  Asertividad Negativa: 0.8628
## AGC:
##  Precision Global: 0.8611
##  Error Global: 0.1389
##  Precision Positiva: 0.8710
##  Precision Negativa: 0.8529
##  Proporcion de Falsos Positivos: 0.1127
##  Proporcion de Falsos Negativos: 0.1675
##  Asertividad Positiva: 0.8325
##  Asertividad Negativa: 0.8873
## Bosque:
##  Precision Global: 0.8786
##  Error Global: 0.1214
##  Precision Positiva: 0.9004
##  Precision Negativa: 0.8601
##  Proporcion de Falsos Positivos: 0.0892
##  Proporcion de Falsos Negativos: 0.1552
##  Asertividad Positiva: 0.8448
##  Asertividad Negativa: 0.9108
## Prediccion:
##  Precision Global: 0.6609
##  Error Global: 0.3391
##  Precision Positiva: 0.7131
##  Precision Negativa: 0.6172
##  Proporcion de Falsos Positivos: 0.2802
##  Proporcion de Falsos Negativos: 0.3905
##  Asertividad Positiva: 0.6095
##  Asertividad Negativa: 0.7198
## Prediccion KNN:
##  Precision Global: 0.8496
##  Error Global: 0.1504
##  Precision Positiva: 0.8439
##  Precision Negativa: 0.8544
##  Proporcion de Falsos Positivos: 0.1342
##  Proporcion de Falsos Negativos: 0.1689
##  Asertividad Positiva: 0.8311
##  Asertividad Negativa: 0.8658
## Prediccion Arbol:
##  Precision Global: 0.8283
##  Error Global: 0.1717
##  Precision Positiva: 0.8658
##  Precision Negativa: 0.7965
##  Proporcion de Falsos Positivos: 0.1250
##  Proporcion de Falsos Negativos: 0.2171
##  Asertividad Positiva: 0.7829
##  Asertividad Negativa: 0.8750
training = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/hotel_bookings_completo.csv")
testing  = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/nuevos_hotel_bookings.csv")

cols = training.select_dtypes(include = "object").columns
cols = cols[~cols.isin(["is_canceled"])]
for col in cols:
  training[col] = training[col].astype('category')
  training[col] = training[col].cat.codes
  training[col] = training[col].astype('category')
y_train = training["is_canceled"].ravel()
scaler = StandardScaler()
X_train = training.drop(columns=["is_canceled"])
X_train = pd.DataFrame(scaler.fit_transform(X_train), columns= X_train.columns)
X_train.head()
##       hotel  lead_time  ...  required_car_parking_spaces  total_of_special_requests
## 0  0.739137  -0.363780  ...                    -0.292263                  -0.759083
## 1  0.739137  -0.475463  ...                    -0.292263                   0.450405
## 2  0.739137  -0.475463  ...                    -0.292263                   0.450405
## 3  0.739137  -0.475463  ...                    -0.292263                   0.450405
## 4  0.739137  -0.391701  ...                    -0.292263                   0.450405
## 
## [5 rows x 18 columns]
for col in cols:
  testing[col] = testing[col].astype('category')
  testing[col] = testing[col].cat.codes
  testing[col] = testing[col].astype('category')
y_test = testing["is_canceled"].ravel()
X_test = testing.drop(columns=["is_canceled"])
X_test = pd.DataFrame(scaler.transform(X_test), columns= X_test.columns)
X_test.head()
##       hotel  lead_time  ...  required_car_parking_spaces  total_of_special_requests
## 0  0.739137  -0.717442  ...                    -0.292263                   1.659894
## 1  0.739137  -0.838431  ...                    -0.292263                  -0.759083
## 2  0.739137  -0.010118  ...                    -0.292263                   1.659894
## 3  0.739137  -1.015262  ...                    -0.292263                  -0.759083
## 4  0.739137   0.017803  ...                    -0.292263                   0.450405
## 
## [5 rows x 18 columns]
predicciones = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9).fit(X_train.values,y_train).predict(X_test.values)

print(predicciones)
## ['Yes' 'Yes' 'Yes' ... 'No' 'No' 'Yes']
resultados = pd.DataFrame({'Prediccion': predicciones})
resultados.to_csv('nuevas_predicciones.csv', index=False)
#4

##1
datos = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/breast_cancer.csv", index_col=0)
datos

##2
##          diagnosis  radius_mean  ...  symmetry_mean  fractal_dimension_mean
## 842302           M        17.99  ...         0.2419                 0.07871
## 842517           M        20.57  ...         0.1812                 0.05667
## 84300903         M        19.69  ...         0.2069                 0.05999
## 84348301         M        11.42  ...         0.2597                 0.09744
## 84358402         M        20.29  ...         0.1809                 0.05883
## ...            ...          ...  ...            ...                     ...
## 926424           M        21.56  ...         0.1726                 0.05623
## 926682           M        20.13  ...         0.1752                 0.05533
## 926954           M        16.60  ...         0.1590                 0.05648
## 927241           M        20.60  ...         0.2397                 0.07016
## 92751            B         7.76  ...         0.1587                 0.05884
## 
## [569 rows x 9 columns]
print(datos.head())
##          diagnosis  radius_mean  ...  symmetry_mean  fractal_dimension_mean
## 842302           M        17.99  ...         0.2419                 0.07871
## 842517           M        20.57  ...         0.1812                 0.05667
## 84300903         M        19.69  ...         0.2069                 0.05999
## 84348301         M        11.42  ...         0.2597                 0.09744
## 84358402         M        20.29  ...         0.1809                 0.05883
## 
## [5 rows x 9 columns]
print(datos.describe())
##        radius_mean  texture_mean  ...  symmetry_mean  fractal_dimension_mean
## count   569.000000    569.000000  ...     569.000000              569.000000
## mean     14.127292     19.289649  ...       0.181162                0.062798
## std       3.524049      4.301036  ...       0.027414                0.007060
## min       6.981000      9.710000  ...       0.106000                0.049960
## 25%      11.700000     16.170000  ...       0.161900                0.057700
## 50%      13.370000     18.840000  ...       0.179200                0.061540
## 75%      15.780000     21.800000  ...       0.195700                0.066120
## max      28.110000     39.280000  ...       0.304000                0.097440
## 
## [8 rows x 8 columns]
print(datos.corr())
##                         radius_mean  ...  fractal_dimension_mean
## radius_mean                1.000000  ...               -0.311631
## texture_mean               0.323782  ...               -0.076437
## smoothness_mean            0.170581  ...                0.584792
## compactness_mean           0.506124  ...                0.565369
## concavity_mean             0.676764  ...                0.336783
## concave.points_mean        0.822529  ...                0.166917
## symmetry_mean              0.147741  ...                0.479921
## fractal_dimension_mean    -0.311631  ...                1.000000
## 
## [8 rows x 8 columns]
X = datos.loc[:, datos.columns != 'diagnosis']
y = datos.iloc[:, -1]
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
best_features = SelectKBest(score_func=f_classif, k='all')
fit = best_features.fit(X, y)
scores = pd.DataFrame(fit.scores_)
columns = pd.DataFrame(X.columns)
feature_scores = pd.concat([columns, scores], axis=1)
feature_scores.columns = ['Feature', 'Score']
print(feature_scores.nlargest(len(X.columns), 'Score'))
##                   Feature     Score
## 7  fractal_dimension_mean       inf
## 6           symmetry_mean  1.772333
## 2         smoothness_mean  1.718556
## 3        compactness_mean  1.367937
## 1            texture_mean  1.118357
## 4          concavity_mean  1.020685
## 0             radius_mean  0.869847
## 5     concave.points_mean  0.868552
print(datos['diagnosis'].value_counts(normalize=True))

### Esta tabla pretende predecir si el tumor es maligno o benigno por medio de las caracteristicas físicas. Se puede ver que son 569 registros, se calcularon las medias, desviaciones estandar, Quantiles y maximos, de cada variables para poder dar una visibilidad de los valores establecidos. Posteriormente se hizo un análisis de correlacion en donde vemos algunas de las variables: Se pueden ver una relacion fuerte y positiva entre "concave.points_mean" y "radius_mean", por lo que se puede decir que hay un estrecho lazo entre la concacidad del tumor y el ramaño, que se puede medir por medio del radio. Y al final se puede ver el peso de la selección de variables y podemos ver que la dimension, la simetria y el tacto "smoothnness" son las variables que tienen más peso en predecir las variables. 


##3
## B    0.627417
## M    0.372583
## Name: diagnosis, dtype: float64
distribucion_variable_predecir(datos,"diagnosis")
plt.show()
###El problema podemos ver que no es equilibrado ya que tiene un 62% de benigno y 37% de maligno. Por lo que se puede decir que es más complicado lograr una predicción fiable.


##4

X = datos.loc[:, datos.columns != 'diagnosis']
X = pd.DataFrame(StandardScaler().fit_transform(X), columns= X.columns)
y = datos.loc[:,"diagnosis"].ravel()

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75)
k_values = range(2, 20, 1)
indices = {}
for k in k_values:
  prediccionknn = KNeighborsClassifier(n_neighbors=k).fit(X_train.values,y_train).predict(X_test.values)
  labels = ["M","B"]
  MC = confusion_matrix(y_test, prediccionknn,labels=labels)
  indices[k] = indices_general(MC, labels)
  
for k in k_values:
  print("\n" +"*" * 20 + "\nPara k = %i\n" % k + "*" * 20 )
  for i in indices[k]:
    print("\n%s:\n%s"%(i,str(indices[k][i])))
    
### Los resultados si son buenos, el mejor fue K=3 con 96% de precicion en Maligno y 93% en precicion global

##5 
## 
## ********************
## Para k = 2
## ********************
## 
## Matriz de Confusión:
## [[53 10]
##  [ 2 78]]
## 
## Precisión Global:
## 0.916083916083916
## 
## Error Global:
## 0.08391608391608396
## 
## Precisión por categoría:
##          M      B
## 0  0.84127  0.975
## 
## ********************
## Para k = 3
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M       B
## 0  0.920635  0.9375
## 
## ********************
## Para k = 4
## ********************
## 
## Matriz de Confusión:
## [[55  8]
##  [ 2 78]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M      B
## 0  0.873016  0.975
## 
## ********************
## Para k = 5
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9230769230769231
## 
## Error Global:
## 0.07692307692307687
## 
## Precisión por categoría:
##           M       B
## 0  0.904762  0.9375
## 
## ********************
## Para k = 6
## ********************
## 
## Matriz de Confusión:
## [[54  9]
##  [ 4 76]]
## 
## Precisión Global:
## 0.9090909090909091
## 
## Error Global:
## 0.09090909090909094
## 
## Precisión por categoría:
##           M     B
## 0  0.857143  0.95
## 
## ********************
## Para k = 7
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M       B
## 0  0.920635  0.9375
## 
## ********************
## Para k = 8
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 4 76]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M     B
## 0  0.904762  0.95
## 
## ********************
## Para k = 9
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M       B
## 0  0.920635  0.9375
## 
## ********************
## Para k = 10
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 4 76]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M     B
## 0  0.920635  0.95
## 
## ********************
## Para k = 11
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 6 74]]
## 
## Precisión Global:
## 0.9230769230769231
## 
## Error Global:
## 0.07692307692307687
## 
## Precisión por categoría:
##           M      B
## 0  0.920635  0.925
## 
## ********************
## Para k = 12
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 3 77]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M       B
## 0  0.904762  0.9625
## 
## ********************
## Para k = 13
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 4 76]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M     B
## 0  0.920635  0.95
## 
## ********************
## Para k = 14
## ********************
## 
## Matriz de Confusión:
## [[56  7]
##  [ 3 77]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M       B
## 0  0.888889  0.9625
## 
## ********************
## Para k = 15
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 4 76]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Error Global:
## 0.0699300699300699
## 
## Precisión por categoría:
##           M     B
## 0  0.904762  0.95
## 
## ********************
## Para k = 16
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 3 77]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M       B
## 0  0.904762  0.9625
## 
## ********************
## Para k = 17
## ********************
## 
## Matriz de Confusión:
## [[57  6]
##  [ 3 77]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M       B
## 0  0.904762  0.9625
## 
## ********************
## Para k = 18
## ********************
## 
## Matriz de Confusión:
## [[56  7]
##  [ 2 78]]
## 
## Precisión Global:
## 0.9370629370629371
## 
## Error Global:
## 0.06293706293706292
## 
## Precisión por categoría:
##           M      B
## 0  0.888889  0.975
## 
## ********************
## Para k = 19
## ********************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 3 77]]
## 
## Precisión Global:
## 0.9440559440559441
## 
## Error Global:
## 0.05594405594405594
## 
## Precisión por categoría:
##           M       B
## 0  0.920635  0.9625
k_values = [3]
indices = {}

for algoritmo in ["ball_tree", "kd_tree", "brute"]:
    for k in k_values:
        clf = KNeighborsClassifier(n_neighbors=k, algorithm=algoritmo)
        clf.fit(X_train, y_train)
        prediccion = clf.predict(X_test)
        labels = ["M", "B"]
        MC = confusion_matrix(y_test, prediccion, labels=labels)
        TP = MC[0, 0]
        TN = MC[1, 1]
        FP = MC[1, 0]
        FN = MC[0, 1]
        precision_global = (TP + TN) / (TP + TN + FP + FN)
        precision_variable = {"M": TP / (TP + FN), "B": TN / (TN + FP)}
        indices[(algoritmo, k)] = {"Matriz de Confusión": MC, "Precisión Global": precision_global, "Precisión por Variable": precision_variable}
## KNeighborsClassifier(algorithm='ball_tree', n_neighbors=3)
## KNeighborsClassifier(algorithm='kd_tree', n_neighbors=3)
## KNeighborsClassifier(algorithm='brute', n_neighbors=3)
for (algoritmo, k) in indices:
    print(f"\n{'*' * 30}\nPara algoritmo={algoritmo}, k={k}\n{'*' * 30}")
    for metric in indices[(algoritmo, k)]:
        print(f"\n{metric}:\n{indices[(algoritmo, k)][metric]}")
        
### No hubo mejor, tanto en los tres aloritmos propuestos en el ejercicio, como el inicial, la presicion fue de 96% de precicion en Maligno y 93% en precicion global

##6,7,8,9
## 
## ******************************
## Para algoritmo=ball_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Precisión por Variable:
## {'M': 0.9206349206349206, 'B': 0.9375}
## 
## ******************************
## Para algoritmo=kd_tree, k=3
## ******************************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Precisión por Variable:
## {'M': 0.9206349206349206, 'B': 0.9375}
## 
## ******************************
## Para algoritmo=brute, k=3
## ******************************
## 
## Matriz de Confusión:
## [[58  5]
##  [ 5 75]]
## 
## Precisión Global:
## 0.9300699300699301
## 
## Precisión por Variable:
## {'M': 0.9206349206349206, 'B': 0.9375}
X = pd.DataFrame(StandardScaler().fit_transform(X), columns=X.columns)
y = datos["diagnosis"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75)

instancia_arbol = DecisionTreeClassifier(max_depth= 4)
instancia_arbol.fit(X_train,y_train)
## DecisionTreeClassifier(max_depth=4)
prediccion = instancia_arbol.predict(X_test)
MC = confusion_matrix(y_test, prediccion)
indices = indices_general(MC,list(np.unique(y)))

for k in indices:
    print("\n%s:\n%s"%(k,str(indices[k])))
    
## 
## Matriz de Confusión:
## [[81  8]
##  [ 6 48]]
## 
## Precisión Global:
## 0.9020979020979021
## 
## Error Global:
## 0.09790209790209792
## 
## Precisión por categoría:
##           B         M
## 0  0.910112  0.888889
fig, ax = plt.subplots(1,1, figsize = (15,10), dpi = 150)

tree.plot_tree(instancia_arbol, feature_names = list(X.columns.values), class_names=["fractal_dimension_mean","symmetry_mean","smoothness_mean","compactness_mean","texture_mean","concavity_mean","radius_mean","concave.points_mean"], filled = True)
## [Text(0.5, 0.9, 'concave.points_mean <= 0.008\ngini = 0.467\nsamples = 426\nvalue = [268, 158]\nclass = fractal_dimension_mean'), Text(0.2708333333333333, 0.7, 'radius_mean <= 0.242\ngini = 0.115\nsamples = 261\nvalue = [245, 16]\nclass = fractal_dimension_mean'), Text(0.16666666666666666, 0.5, 'concave.points_mean <= -0.109\ngini = 0.048\nsamples = 243\nvalue = [237, 6]\nclass = fractal_dimension_mean'), Text(0.08333333333333333, 0.3, 'radius_mean <= -0.202\ngini = 0.034\nsamples = 234\nvalue = [230, 4]\nclass = fractal_dimension_mean'), Text(0.041666666666666664, 0.1, 'gini = 0.01\nsamples = 197\nvalue = [196, 1]\nclass = fractal_dimension_mean'), Text(0.125, 0.1, 'gini = 0.149\nsamples = 37\nvalue = [34, 3]\nclass = fractal_dimension_mean'), Text(0.25, 0.3, 'texture_mean <= 0.644\ngini = 0.346\nsamples = 9\nvalue = [7, 2]\nclass = fractal_dimension_mean'), Text(0.20833333333333334, 0.1, 'gini = 0.0\nsamples = 7\nvalue = [7, 0]\nclass = fractal_dimension_mean'), Text(0.2916666666666667, 0.1, 'gini = 0.0\nsamples = 2\nvalue = [0, 2]\nclass = symmetry_mean'), Text(0.375, 0.5, 'texture_mean <= -0.743\ngini = 0.494\nsamples = 18\nvalue = [8, 10]\nclass = symmetry_mean'), Text(0.3333333333333333, 0.3, 'gini = 0.0\nsamples = 5\nvalue = [5, 0]\nclass = fractal_dimension_mean'), Text(0.4166666666666667, 0.3, 'compactness_mean <= -0.619\ngini = 0.355\nsamples = 13\nvalue = [3, 10]\nclass = symmetry_mean'), Text(0.375, 0.1, 'gini = 0.0\nsamples = 7\nvalue = [0, 7]\nclass = symmetry_mean'), Text(0.4583333333333333, 0.1, 'gini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = fractal_dimension_mean'), Text(0.7291666666666666, 0.7, 'texture_mean <= -0.674\ngini = 0.24\nsamples = 165\nvalue = [23, 142]\nclass = symmetry_mean'), Text(0.625, 0.5, 'radius_mean <= 0.779\ngini = 0.472\nsamples = 21\nvalue = [13, 8]\nclass = fractal_dimension_mean'), Text(0.5833333333333334, 0.3, 'symmetry_mean <= -0.046\ngini = 0.305\nsamples = 16\nvalue = [13, 3]\nclass = fractal_dimension_mean'), Text(0.5416666666666666, 0.1, 'gini = 0.444\nsamples = 3\nvalue = [1, 2]\nclass = symmetry_mean'), Text(0.625, 0.1, 'gini = 0.142\nsamples = 13\nvalue = [12, 1]\nclass = fractal_dimension_mean'), Text(0.6666666666666666, 0.3, 'gini = 0.0\nsamples = 5\nvalue = [0, 5]\nclass = symmetry_mean'), Text(0.8333333333333334, 0.5, 'concavity_mean <= -0.108\ngini = 0.129\nsamples = 144\nvalue = [10, 134]\nclass = symmetry_mean'), Text(0.75, 0.3, 'radius_mean <= 0.353\ngini = 0.408\nsamples = 7\nvalue = [5, 2]\nclass = fractal_dimension_mean'), Text(0.7083333333333334, 0.1, 'gini = 0.0\nsamples = 5\nvalue = [5, 0]\nclass = fractal_dimension_mean'), Text(0.7916666666666666, 0.1, 'gini = 0.0\nsamples = 2\nvalue = [0, 2]\nclass = symmetry_mean'), Text(0.9166666666666666, 0.3, 'smoothness_mean <= -1.215\ngini = 0.07\nsamples = 137\nvalue = [5, 132]\nclass = symmetry_mean'), Text(0.875, 0.1, 'gini = 0.0\nsamples = 1\nvalue = [1, 0]\nclass = fractal_dimension_mean'), Text(0.9583333333333334, 0.1, 'gini = 0.057\nsamples = 136\nvalue = [4, 132]\nclass = symmetry_mean')]
fig.savefig('arbol_BC.png')

fotoBC = mpimg.imread("C:/Users/Rodrigo/Desktop/TEC/Concentracion/arbol_BC.png") 
plt.imshow(fotoBC)
## <matplotlib.image.AxesImage object at 0x0000000004C487F0>
plt.show()

### Los resultados son muy buenos ya que se puede ver una precision global de 90% y una precision de maligno del 86% lo que es muy bueno. El funionamiento de max depth es mediante haciendo una poda del arbol con un máximo de niveles de profundidad, es decir que se pone un límite en cuanto divisiones de casillas de decision. Y para min samples split se pone un mínimo de datos para que la casilla de decision se pueda dividir. Esto para que el argol graficado se haga más legible y ver las reglas en las que se utilizo para la decision.

##10

instancia_bosques = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9)
RF_BC = Analisis_Predictivo(datos,
                                    predecir = "diagnosis",
                                    modelo      = instancia_bosques, 
                                    train_size  = 0.75)
resultados_bosque = RF_BC.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[92  2]
##  [ 2 47]]
## 
## Precisión Global:
## 0.972027972027972
## 
## Error Global:
## 0.027972027972028024
## 
## Precisión por categoría:
##           B         M
## 0  0.978723  0.959184
instancia_gbc = GradientBoostingClassifier(n_estimators = 100, criterion = "friedman_mse", min_samples_split = 9)
XGB_BC = Analisis_Predictivo(datos,
                                    predecir = "diagnosis",
                                    modelo      = instancia_gbc, 
                                    train_size  = 0.75)
resultados_agc = XGB_BC.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[75 10]
##  [ 3 55]]
## 
## Precisión Global:
## 0.9090909090909091
## 
## Error Global:
## 0.09090909090909094
## 
## Precisión por categoría:
##           B         M
## 0  0.882353  0.948276
instancia_tree = DecisionTreeClassifier(min_samples_split = 3, 
                                        max_depth = None,
                                        criterion = "gini")
instancia_ada = AdaBoostClassifier(base_estimator = instancia_tree,
                                   n_estimators   = 100)

ADA_BC =Analisis_Predictivo(datos, 
                                       predecir = "diagnosis", 
                                       modelo   = instancia_ada,
                                       train_size  = 0.75)
resultados_ada = ADA_BC.fit_predict_resultados()

### Los resultados son muy buenos. Son los mejores que han sacado. GradientBoostingClassifier saco un 95% de precision global, y 97% en predicion de predecir el tumor maligno. 

##11
## 
## Matriz de Confusión:
## [[80  6]
##  [10 47]]
## 
## Precisión Global:
## 0.8881118881118881
## 
## Error Global:
## 0.11188811188811187
## 
## Precisión por categoría:
##           B         M
## 0  0.930233  0.824561
poder_predictivo_numerica(datos,"fractal_dimension_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"symmetry_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"smoothness_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"compactness_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"texture_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"concavity_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"radius_mean","diagnosis")
plt.show()

poder_predictivo_numerica(datos,"concave.points_mean","diagnosis")
plt.show()

### Las variables con mayor importancia son: "fractal_dimension_mean","symmetry_mean","smoothness_mean", "texture_mean"

##12, 13

instancia_linear = SVC(kernel="linear", C = 15)

analisis_linear = Analisis_Predictivo(datos, predecir = "diagnosis",modelo = instancia_linear, train_size = 0.75)

resultados_linear = analisis_linear.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[91  3]
##  [ 3 46]]
## 
## Precisión Global:
## 0.958041958041958
## 
## Error Global:
## 0.04195804195804198
## 
## Precisión por categoría:
##           B         M
## 0  0.968085  0.938776
instancia_rbf = SVC(kernel="rbf", C = 15)

analisis_rbf = Analisis_Predictivo(datos, predecir = "diagnosis",modelo = instancia_rbf, train_size = 0.75)

resultados_rbf = analisis_rbf.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[87  2]
##  [ 6 48]]
## 
## Precisión Global:
## 0.9440559440559441
## 
## Error Global:
## 0.05594405594405594
## 
## Precisión por categoría:
##           B         M
## 0  0.977528  0.888889
instancia_sigmoid = SVC(kernel="sigmoid", C = 15)

analisis_sigmoid = Analisis_Predictivo(datos, predecir = "diagnosis",modelo = instancia_sigmoid, train_size = 0.75)

resultados_sigmoid = analisis_sigmoid.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[84  8]
##  [ 8 43]]
## 
## Precisión Global:
## 0.8881118881118881
## 
## Error Global:
## 0.11188811188811187
## 
## Precisión por categoría:
##           B         M
## 0  0.913043  0.843137
instancia_poly = SVC(kernel="poly", degree = 4,  C = 15)

analisis_poly = Analisis_Predictivo(datos, predecir = "diagnosis",modelo = instancia_poly, train_size = 0.75)

resultados_poly = analisis_poly.fit_predict_resultados()

### No todos los resultados son buenos. El mejor núcleo Kernel es el "linear" con C=15, ya que saco un 92% de precision global y un 91% de precision en el tumor maligno, lo que quiere decir que es un gran modelo de precision.

##14
## 
## Matriz de Confusión:
## [[81  7]
##  [29 26]]
## 
## Precisión Global:
## 0.7482517482517482
## 
## Error Global:
## 0.2517482517482518
## 
## Precisión por categoría:
##           B         M
## 0  0.920455  0.472727
class Evaluador:
    def __init__(self):
        pass
        
    def evaluar(self, matriz_confusion):
        VP = matriz_confusion[0][0]
        FP = matriz_confusion[0][1]
        FN = matriz_confusion[1][0]
        VN = matriz_confusion[1][1]
        
        total = VP + FP + FN + VN
        
        precision_global = (VP + VN) / total
        error_global = (FP + FN) / total
        PP = VP / (VP + FP)
        PN = VN / (VN + FN)
        PFP = FP / (FP + VN)
        PFN = FN / (FN + VP)
        AP = VP / (VP + FN)
        AN = VN / (FP + VN)
        
        resultados = {
            'Precision Global': precision_global,
            'Error Global': error_global,
            'Precision Positiva': PP,
            'Precision Negativa': PN,
            'Proporcion de Falsos Positivos': PFP,
            'Proporcion de Falsos Negativos': PFN,
            'Asertividad Positiva': AP,
            'Asertividad Negativa': AN
        }
        
        return resultados, None
        
resultados_svm = [[92,6],[2,43]]
resultados_ada = [[87,7],[7,42]]
resultados_agc = [[86,5],[4,48]]
resultados_bosque = [[89,6],[5,43]]
prediccionknn = [[54,5],[5,79]]
prediccionarbol = [[88,4],[5,46]]

evaluador = Evaluador()

variables = {'SVM': resultados_svm,
             'ADA': resultados_ada,
             'AGC': resultados_agc,
             'Bosque': resultados_bosque,
             'Prediccion KNN': prediccionknn,
             'Prediccion Arbol': prediccionarbol}

metricas = ['Precision Global', 'Error Global', 'Precision Positiva', 'Precision Negativa', 'Proporcion de Falsos Positivos', 'Proporcion de Falsos Negativos', 'Asertividad Positiva', 'Asertividad Negativa']


for nombre_variable, variable in variables.items():
    print(nombre_variable + ":")
    resultados, _ = evaluador.evaluar(variable)
    for metrica in metricas:
        print("\t{}: {:.4f}".format(metrica, resultados[metrica]))

##El mejor resultado fue:        
##SVM:
##  Precision Global: 0.9441
##  Error Global: 0.0559
##  Precision Positiva: 0.9388
##  Precision Negativa: 0.9556
##  Proporcion de Falsos Positivos: 0.1224
##  Proporcion de Falsos Negativos: 0.0213
##  Asertividad Positiva: 0.9787
##  Asertividad Negativa: 0.8776
## SVM:
##  Precision Global: 0.9441
##  Error Global: 0.0559
##  Precision Positiva: 0.9388
##  Precision Negativa: 0.9556
##  Proporcion de Falsos Positivos: 0.1224
##  Proporcion de Falsos Negativos: 0.0213
##  Asertividad Positiva: 0.9787
##  Asertividad Negativa: 0.8776
## ADA:
##  Precision Global: 0.9021
##  Error Global: 0.0979
##  Precision Positiva: 0.9255
##  Precision Negativa: 0.8571
##  Proporcion de Falsos Positivos: 0.1429
##  Proporcion de Falsos Negativos: 0.0745
##  Asertividad Positiva: 0.9255
##  Asertividad Negativa: 0.8571
## AGC:
##  Precision Global: 0.9371
##  Error Global: 0.0629
##  Precision Positiva: 0.9451
##  Precision Negativa: 0.9231
##  Proporcion de Falsos Positivos: 0.0943
##  Proporcion de Falsos Negativos: 0.0444
##  Asertividad Positiva: 0.9556
##  Asertividad Negativa: 0.9057
## Bosque:
##  Precision Global: 0.9231
##  Error Global: 0.0769
##  Precision Positiva: 0.9368
##  Precision Negativa: 0.8958
##  Proporcion de Falsos Positivos: 0.1224
##  Proporcion de Falsos Negativos: 0.0532
##  Asertividad Positiva: 0.9468
##  Asertividad Negativa: 0.8776
## Prediccion KNN:
##  Precision Global: 0.9301
##  Error Global: 0.0699
##  Precision Positiva: 0.9153
##  Precision Negativa: 0.9405
##  Proporcion de Falsos Positivos: 0.0595
##  Proporcion de Falsos Negativos: 0.0847
##  Asertividad Positiva: 0.9153
##  Asertividad Negativa: 0.9405
## Prediccion Arbol:
##  Precision Global: 0.9371
##  Error Global: 0.0629
##  Precision Positiva: 0.9565
##  Precision Negativa: 0.9020
##  Proporcion de Falsos Positivos: 0.0800
##  Proporcion de Falsos Negativos: 0.0538
##  Asertividad Positiva: 0.9462
##  Asertividad Negativa: 0.9200
#5
zipcode = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/ZipDataTestCod.csv",delimiter = ';',decimal = ".")

X = zipcode.loc[:, zipcode.columns != 'Numero']
X = pd.DataFrame(StandardScaler().fit_transform(X), columns=[X.columns])
y = zipcode["Numero"].ravel()

    
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

k_values = range(2, 20, 1)
indices = {}
for k in k_values:
  prediccionknn = KNeighborsClassifier(n_neighbors=k).fit(X_train.values,y_train).predict(X_test.values)
  labels = ["uno","dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"]
  MC = confusion_matrix(y_test, prediccionknn,labels=labels)
  indices[k] = indices_general(MC, labels)
  
for k in k_values:
  print("\n" +"*" * 20 + "\nPara k = %i\n" % k + "*" * 20 )
  for i in indices[k]:
    print("\n%s:\n%s"%(i,str(indices[k][i])))
    
### Son buenos los resultados. El mejor fue K=5 con 88% de presicion global. 
###Y por categoria:  
###uno:1.0
###dos:0.837838
###tres: 0.780488 
###cuatro:0.866667
###cinco:0.875
###seis:0.933333
###siete:0.871795
###ocho:0.875
###nueve:0.96 
## 
## ********************
## Para k = 2
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 33  0  4  0  0  0  0  0]
##  [ 0  1 26  0  3  0  0  0  0]
##  [ 1  1  0 28  1  0  1  0  2]
##  [ 0  1  1  0 29  0  0  1  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  2  0  0 29  0  3]
##  [ 1  1  0  0  2  0  0 22  1]
##  [ 0  0  0  2  0  0  1  0 41]]
## 
## Precisión Global:
## 0.8955696202531646
## 
## Error Global:
## 0.10443037974683544
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.891892  0.866667  ...  0.828571  0.814815  0.931818
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 3
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 32  1  4  0  0  1  0  0]
##  [ 0  2 27  0  2  0  0  0  0]
##  [ 2  1  0 28  0  0  2  0  1]
##  [ 0  1  1  0 29  1  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 33  0  0]
##  [ 1  0  1  0  1  0  0 23  1]
##  [ 0  0  0  1  0  0  1  0 42]]
## 
## Precisión Global:
## 0.9088050314465409
## 
## Error Global:
## 0.0911949685534591
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.842105  0.870968  ...  0.942857  0.851852  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 4
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 31  0  3  0  0  2  1  0]
##  [ 0  1 25  0  4  0  0  0  0]
##  [ 2  1  0 29  0  0  2  0  0]
##  [ 0  1  2  0 30  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 32  0  1]
##  [ 1  1  1  0  2  0  0 22  1]
##  [ 0  0  0  1  0  0  1  0 42]]
## 
## Precisión Global:
## 0.89937106918239
## 
## Error Global:
## 0.10062893081761004
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.837838  0.833333  ...  0.914286  0.785714  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 5
## ********************
## 
## Matriz de Confusión:
## [[45  0  0  0  0  0  0  0  0]
##  [ 0 32  0  2  0  0  3  0  0]
##  [ 0  2 27  0  2  0  0  0  0]
##  [ 2  1  0 28  0  0  2  0  1]
##  [ 0  1  3  0 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  0  0  0 33  0  1]
##  [ 1  0  1  0  2  0  0 23  1]
##  [ 0  0  0  1  0  0  1  0 42]]
## 
## Precisión Global:
## 0.9088050314465409
## 
## Error Global:
## 0.0911949685534591
## 
## Precisión por categoría:
##    uno       dos      tres    cuatro  ...     seis     siete      ocho     nueve
## 0  1.0  0.864865  0.870968  0.823529  ...  0.96875  0.942857  0.821429  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 6
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 31  0  2  0  0  3  0  0]
##  [ 0  2 24  0  4  0  0  0  1]
##  [ 2  1  0 29  0  0  2  0  0]
##  [ 0  1  3  0 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 0  0  0  1  0  0 32  0  2]
##  [ 1  0  1  0  1  0  0 24  1]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.9022082018927445
## 
## Error Global:
## 0.09779179810725547
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.861111  0.774194  ...  0.914286  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 7
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 30  0  2  0  0  3  0  0]
##  [ 0  2 26  0  3  0  0  0  0]
##  [ 2  1  0 29  0  0  2  0  0]
##  [ 0  0  4  1 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 32  0  1]
##  [ 1  0  1  0  1  0  0 24  1]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.9025157232704403
## 
## Error Global:
## 0.09748427672955973
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.833333  0.83871  0.852941  ...  0.96875  0.914286  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 8
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 32  0  1  0  0  2  0  0]
##  [ 0  2 26  0  2  0  0  0  1]
##  [ 2  1  0 28  0  0  2  0  1]
##  [ 0  0  3  1 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 32  0  1]
##  [ 1  0  1  0  1  0  0 24  1]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.9113924050632911
## 
## Error Global:
## 0.08860759493670889
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.914286  0.83871  0.823529  ...  0.96875  0.914286  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 9
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 30  0  2  0  0  2  1  0]
##  [ 0  2 26  0  2  0  0  0  1]
##  [ 3  1  0 26  0  0  1  0  3]
##  [ 0  0  3  1 29  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 32  0  1]
##  [ 1  0  0  0  1  1  1 24  0]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.8990536277602523
## 
## Error Global:
## 0.10094637223974767
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.857143  0.83871  0.764706  ...  0.96875  0.914286  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 10
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 0 30  0  2  0  0  2  1  0]
##  [ 0  2 26  0  2  0  0  0  1]
##  [ 3  1  0 27  0  0  2  0  1]
##  [ 0  0  3  1 29  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 31  0  2]
##  [ 1  0  0  0  1  1  1 24  0]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.8990536277602523
## 
## Error Global:
## 0.10094637223974767
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.857143  0.83871  0.794118  ...  0.96875  0.885714  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 11
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 30  0  2  0  0  2  1  0]
##  [ 0  2 26  0  2  0  0  0  1]
##  [ 3  2  0 26  0  0  2  0  1]
##  [ 0  0  3  1 29  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 31  0  2]
##  [ 1  0  0  0  1  1  1 24  0]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.8930817610062893
## 
## Error Global:
## 0.10691823899371067
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.833333  0.83871  0.764706  ...  0.96875  0.885714  0.857143  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 12
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  3  0  0  2  2  0]
##  [ 0  2 27  0  1  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  1 29  0  0  0  0]
##  [ 0  0  0  0  1 30  0  0  0]
##  [ 1  0  0  1  0  0 31  0  2]
##  [ 1  0  0  0  1  1  1 24  0]
##  [ 1  0  0  0  0  0  1  0 42]]
## 
## Precisión Global:
## 0.8832807570977917
## 
## Error Global:
## 0.11671924290220825
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.777778  0.870968  ...  0.885714  0.857143  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 13
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  3  0  0  2  2  0]
##  [ 0  2 26  0  2  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  1 27  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 31  0  2]
##  [ 2  0  0  0  1  2  1 22  0]
##  [ 1  0  0  0  0  0  1  0 42]]
## 
## Precisión Global:
## 0.8734177215189873
## 
## Error Global:
## 0.12658227848101267
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.777778  0.83871  0.735294  ...  0.96875  0.885714  0.785714  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 14
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  3  0  0  1  2  1]
##  [ 0  2 27  0  1  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  2 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 2  0  0  0  1  2  1 22  0]
##  [ 1  0  0  0  0  0  1  0 42]]
## 
## Precisión Global:
## 0.8710691823899371
## 
## Error Global:
## 0.12893081761006286
## 
## Precisión por categoría:
##         uno       dos      tres  ...     siete      ocho     nueve
## 0  0.977778  0.777778  0.870968  ...  0.857143  0.785714  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 15
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  2  0  0  2  2  1]
##  [ 1  2 27  0  1  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  2 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 2  0  0  0  1  2  0 22  1]
##  [ 1  0  0  0  0  0  1  0 42]]
## 
## Precisión Global:
## 0.8683385579937304
## 
## Error Global:
## 0.1316614420062696
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.777778  0.84375  0.735294  ...  0.96875  0.857143  0.785714  0.954545
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 16
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  4  0  0  1  2  0]
##  [ 1  2 27  0  1  0  0  0  1]
##  [ 3  2  0 26  0  0  2  0  1]
##  [ 0  0  3  2 28  0  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 2  0  0  0  2  1  0 22  1]
##  [ 0  0  0  0  0  0  1  0 43]]
## 
## Precisión Global:
## 0.8746081504702194
## 
## Error Global:
## 0.12539184952978055
## 
## Precisión por categoría:
##         uno       dos     tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.777778  0.84375  0.764706  ...  0.96875  0.857143  0.785714  0.977273
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 17
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  3  0  0  1  2  1]
##  [ 1  2 26  0  2  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  2 26  1  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 3  0  0  0  2  1  0 21  1]
##  [ 1  0  0  1  0  0  1  0 41]]
## 
## Precisión Global:
## 0.8553459119496856
## 
## Error Global:
## 0.14465408805031443
## 
## Precisión por categoría:
##         uno       dos    tres    cuatro  ...     seis     siete  ocho     nueve
## 0  0.977778  0.777778  0.8125  0.735294  ...  0.96875  0.857143  0.75  0.931818
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 18
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  2  0  0  2  2  1]
##  [ 1  2 26  0  2  0  0  0  1]
##  [ 3  2  0 25  0  0  2  0  2]
##  [ 0  0  3  2 27  1  0  0  0]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 2  0  0  0  2  1  0 22  1]
##  [ 1  0  0  1  0  0  1  0 41]]
## 
## Precisión Global:
## 0.8589341692789969
## 
## Error Global:
## 0.1410658307210031
## 
## Precisión por categoría:
##         uno       dos    tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.777778  0.8125  0.735294  ...  0.96875  0.857143  0.785714  0.931818
## 
## [1 rows x 9 columns]
## 
## ********************
## Para k = 19
## ********************
## 
## Matriz de Confusión:
## [[44  0  0  0  0  1  0  0  0]
##  [ 1 28  0  2  0  0  2  2  1]
##  [ 1  2 26  0  2  0  0  0  1]
##  [ 3  2  0 24  0  0  2  0  3]
##  [ 0  0  3  2 26  1  0  0  1]
##  [ 0  0  0  0  1 31  0  0  0]
##  [ 1  0  0  1  0  0 30  0  3]
##  [ 3  0  0  0  2  1  0 20  2]
##  [ 1  0  0  1  0  0  1  0 41]]
## 
## Precisión Global:
## 0.8463949843260188
## 
## Error Global:
## 0.15360501567398122
## 
## Precisión por categoría:
##         uno       dos    tres    cuatro  ...     seis     siete      ocho     nueve
## 0  0.977778  0.777778  0.8125  0.705882  ...  0.96875  0.857143  0.714286  0.931818
## 
## [1 rows x 9 columns]
X = pd.DataFrame(StandardScaler().fit_transform(X), columns=X.columns)
y = zipcode["Numero"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)

instancia_arbol = DecisionTreeClassifier(max_depth= 4)
instancia_arbol.fit(X_train,y_train)
## DecisionTreeClassifier(max_depth=4)
prediccion = instancia_arbol.predict(X_test)
MC = confusion_matrix(y_test, prediccion)
indices = indices_general(MC,list(np.unique(y)))

for k in indices:
    print("\n%s:\n%s"%(k,str(indices[k])))
    


### Los resultados no son los mejores pero se puede decir que puede predecir con algo de confianza, ya que de precision global tiene 71%, sin embargo, si ya te vas analizando por categoria podemos ver que no es la mejor precicion ya que tiene una media de prediccion por categoria de 75%
## 
## Matriz de Confusión:
## [[51  0  0  7  0  3  0  0  4  0]
##  [ 6 22  2  1  6  2  2  0  1  0]
##  [ 0  0 28  1  2  3  0  0  0  2]
##  [ 1  1  4 27  0  1  3  2  1  0]
##  [ 0  0  0  0 25  2  0  1  1  0]
##  [ 1  1  0 10  4 12  1  4  1  0]
##  [ 4  0  1  0  3  6 26  0  0  0]
##  [ 1  0  5  0  9  1  0 29  0  0]
##  [ 3  1  0  2  0  3  0  1 18  0]
##  [ 0  0  0  0  0  1  0  3  0 39]]
## 
## Precisión Global:
## 0.6890547263681592
## 
## Error Global:
## 0.31094527363184077
## 
## Precisión por categoría:
##        cero    cinco    cuatro    dos  ...  seis     siete      tres       uno
## 0  0.784615  0.52381  0.777778  0.675  ...  0.65  0.644444  0.642857  0.906977
## 
## [1 rows x 10 columns]
instancia_bosques = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9)
RF_zip = Analisis_Predictivo(zipcode,
                                    predecir = "Numero",
                                    modelo      = instancia_bosques, 
                                    train_size  = 0.8)
resultados_bosque = RF_zip.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[70  0  0  0  0  0  0  0  0  0]
##  [ 1 34  1  0  0  1  1  0  0  0]
##  [ 0  0 35  2  1  0  0  1  0  1]
##  [ 0  0  0 38  0  0  0  1  0  0]
##  [ 0  0  1  0 37  0  0  1  0  2]
##  [ 0  1  1  2  1 22  0  0  1  0]
##  [ 1  0  1  0  0  0 25  0  0  0]
##  [ 0  0  2  0  0  0  0 25  0  1]
##  [ 0  0  1  0  0  1  0  0 23  0]
##  [ 0  0  0  0  0  0  0  0  0 66]]
## 
## Precisión Global:
## 0.9328358208955224
## 
## Error Global:
## 0.06716417910447758
## 
## Precisión por categoría:
##    cero     cinco  cuatro       dos  ...      seis     siete  tres  uno
## 0   1.0  0.894737   0.875  0.974359  ...  0.925926  0.892857  0.92  1.0
## 
## [1 rows x 10 columns]
instancia_gbc = GradientBoostingClassifier(n_estimators = 100, criterion = "friedman_mse", min_samples_split = 9)
XGB_zip = Analisis_Predictivo(zipcode,
                                    predecir = "Numero",
                                    modelo      = instancia_gbc, 
                                    train_size  = 0.8)
resultados_agc = XGB_zip.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[69  0  0  0  1  1  0  0  0  0]
##  [ 1 23  0  0  0  1  0  0  4  0]
##  [ 0  0 37  1  2  1  0  0  0  0]
##  [ 3  0  1 30  0  0  0  0  2  0]
##  [ 0  0  1  0 38  0  0  0  0  0]
##  [ 1  0  1  0  0 17  0  0  2  0]
##  [ 0  0  0  1  0  1 32  0  0  1]
##  [ 0  1  3  1  0  0  0 26  0  0]
##  [ 0  2  0  3  1  2  0  0 35  0]
##  [ 0  0  2  0  0  0  0  0  0 54]]
## 
## Precisión Global:
## 0.8980099502487562
## 
## Error Global:
## 0.10199004975124382
## 
## Precisión por categoría:
##        cero     cinco    cuatro  ...    siete      tres       uno
## 0  0.971831  0.793103  0.902439  ...  0.83871  0.813953  0.964286
## 
## [1 rows x 10 columns]
instancia_tree = DecisionTreeClassifier(min_samples_split = 3, 
                                        max_depth = None,
                                        criterion = "gini")
instancia_ada = AdaBoostClassifier(base_estimator = instancia_tree,
                                   n_estimators   = 100)

ADA_zip =Analisis_Predictivo(zipcode, 
                                       predecir = "Numero", 
                                       modelo   = instancia_ada,
                                       train_size  = 0.8)
resultados_ada = ADA_zip.fit_predict_resultados()

### Los resultados de estos motores de prediccion son muy buenos. Y el mejor de todos fue ADA, ya que tiene una precision global del 94% y por categoria tiene una media de 90%, lo que es muy bueno.
## 
## Matriz de Confusión:
## [[84  0  0  0  1  0  0  0  0  0]
##  [ 0 23  0  0  1  0  0  0  1  0]
##  [ 0  0 32  0  1  0  0  1  0  0]
##  [ 2  0  0 35  1  1  0  0  0  0]
##  [ 1  0  1  0 41  1  0  2  0  0]
##  [ 1  0  0  0  1 23  0  0  0  0]
##  [ 1  0  1  0  0  2 30  0  0  0]
##  [ 0  1  2  0  2  0  0 22  1  0]
##  [ 1  1  0  0  1  0  0  0 35  0]
##  [ 0  0  0  0  0  0  1  0  0 47]]
## 
## Precisión Global:
## 0.9253731343283582
## 
## Error Global:
## 0.07462686567164178
## 
## Precisión por categoría:
##        cero  cinco    cuatro       dos  ...      seis     siete      tres       uno
## 0  0.988235   0.92  0.941176  0.897436  ...  0.882353  0.785714  0.921053  0.979167
## 
## [1 rows x 10 columns]
instancia_linear = SVC(kernel="linear", C = 15)

analisis_linear = Analisis_Predictivo(zipcode, predecir = "Numero",modelo = instancia_linear, train_size = 0.8)

resultados_linear = analisis_linear.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[75  0  0  0  0  0  1  0  0  0]
##  [ 0 26  0  0  0  1  0  0  2  0]
##  [ 1  0 38  0  1  0  0  2  0  2]
##  [ 3  0  1 29  0  1  0  0  1  0]
##  [ 0  0  2  0 34  0  0  1  0  0]
##  [ 1  3  0  1  0 23  0  0  2  0]
##  [ 1  0  0  0  0  0 38  0  0  0]
##  [ 0  0  1  0  0  0  0 24  0  0]
##  [ 0  1  0  0  0  1  0  1 28  0]
##  [ 0  0  3  0  0  0  2  2  0 49]]
## 
## Precisión Global:
## 0.9054726368159204
## 
## Error Global:
## 0.09452736318407962
## 
## Precisión por categoría:
##        cero     cinco    cuatro       dos  ...      seis  siete      tres    uno
## 0  0.986842  0.896552  0.863636  0.828571  ...  0.974359   0.96  0.903226  0.875
## 
## [1 rows x 10 columns]
instancia_rbf = SVC(kernel="rbf", C = 15)

analisis_rbf = Analisis_Predictivo(zipcode, predecir = "Numero",modelo = instancia_rbf, train_size = 0.8)

resultados_rbf = analisis_rbf.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[69  0  2  2  0  0  0  0  0  0]
##  [ 0 30  0  0  1  0  0  0  2  0]
##  [ 1  0 34  1  0  0  0  1  0  0]
##  [ 1  0  1 32  0  0  0  0  0  0]
##  [ 1  1  0  0 25  0  0  0  0  0]
##  [ 0  1  0  2  0 30  0  0  0  0]
##  [ 0  0  0  0  0  0 36  0  0  0]
##  [ 0  0  0  0  0  0  0 30  0  0]
##  [ 1  3  0  5  0  2  0  0 33  0]
##  [ 0  0  0  0  0  0  0  0  0 55]]
## 
## Precisión Global:
## 0.9303482587064676
## 
## Error Global:
## 0.06965174129353235
## 
## Precisión por categoría:
##        cero     cinco    cuatro       dos  ...  seis  siete  tres  uno
## 0  0.945205  0.909091  0.918919  0.941176  ...   1.0    1.0  0.75  1.0
## 
## [1 rows x 10 columns]
instancia_sigmoid = SVC(kernel="sigmoid", C = 15)

analisis_sigmoid = Analisis_Predictivo(zipcode, predecir = "Numero",modelo = instancia_sigmoid, train_size = 0.8)
resultados_sigmoid = analisis_sigmoid.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[55  1  0  1  1  1  0  0  0  0]
##  [ 1 23  1  0  0  2  0  1  2  0]
##  [ 2  0 36  2  0  0  1  0  0  0]
##  [ 3  1  4 35  0  1  0  0  0  1]
##  [ 0  0  2  0 31  1  0  1  0  0]
##  [ 5  1  2  2  1 23  0  0  1  0]
##  [ 1  0  0  1  0  0 27  0  0  0]
##  [ 0  1  2  0  0  0  0 26  0  0]
##  [ 1  2  0  3  0  1  0  0 30  0]
##  [ 0  0  0  1  0  0  0  0  0 61]]
## 
## Precisión Global:
## 0.8631840796019901
## 
## Error Global:
## 0.13681592039800994
## 
## Precisión por categoría:
##        cero     cinco    cuatro  ...     siete      tres       uno
## 0  0.932203  0.766667  0.878049  ...  0.896552  0.810811  0.983871
## 
## [1 rows x 10 columns]
instancia_poly = SVC(kernel="poly", degree = 4,  C = 15)

analisis_poly = Analisis_Predictivo(zipcode, predecir = "Numero",modelo = instancia_poly, train_size = 0.8)

resultados_poly = analisis_poly.fit_predict_resultados()

### El mejor núcleo para predecir los numeros fue el RBF con una presiocion global del 92% superando a todos los demás nucleos.
  
        
##3
## 
## Matriz de Confusión:
## [[74  0  1  0  1  0  0  2  1  1]
##  [ 0 22  0  0  0  5  0  0  1  1]
##  [ 0  0 32  0  0  5  0  1  0  0]
##  [ 0  0  0 30  0  9  0  0  0  0]
##  [ 0  0  1  0 35  1  0  1  0  0]
##  [ 0  0  0  0  2 22  0  0  0  0]
##  [ 1  1  0  2  0  1 28  0  0  0]
##  [ 0  0  2  0  2  1  1 23  0  0]
##  [ 0  1  0  0  0  5  0  0 34  0]
##  [ 0  0  1  0  0  1  0  0  0 50]]
## 
## Precisión Global:
## 0.8706467661691543
## 
## Error Global:
## 0.12935323383084574
## 
## Precisión por categoría:
##     cero     cinco    cuatro       dos  ...      seis     siete  tres       uno
## 0  0.925  0.758621  0.842105  0.769231  ...  0.848485  0.793103  0.85  0.961538
## 
## [1 rows x 10 columns]
zipcode2 = zipcode.loc[zipcode['Numero'].isin(["tres", "cinco", "ocho"])]

X = zipcode2.loc[:, zipcode2.columns != 'Numero']
X = pd.DataFrame(StandardScaler().fit_transform(X), columns=[X.columns])
y = zipcode2["Numero"].ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.80)

k_values = range(2, 20, 1)
indices = {}
for k in k_values:
  prediccionknn = KNeighborsClassifier(n_neighbors=k).fit(X_train.values,y_train).predict(X_test.values)
  labels = ["tres", "cinco", "ocho"]
  MC = confusion_matrix(y_test, prediccionknn,labels=labels)
  indices[k] = indices_general(MC, labels)
  
for k in k_values:
  print("\n" +"*" * 20 + "\nPara k = %i\n" % k + "*" * 20 )
  for i in indices[k]:
    print("\n%s:\n%s"%(i,str(indices[k][i])))
    
## 
## ********************
## Para k = 2
## ********************
## 
## Matriz de Confusión:
## [[29  7  2]
##  [ 3 27  0]
##  [ 0  3 28]]
## 
## Precisión Global:
## 0.8484848484848485
## 
## Error Global:
## 0.1515151515151515
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.763158    0.9  0.903226
## 
## ********************
## Para k = 3
## ********************
## 
## Matriz de Confusión:
## [[32  4  2]
##  [ 4 26  0]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.842105  0.866667  0.935484
## 
## ********************
## Para k = 4
## ********************
## 
## Matriz de Confusión:
## [[32  4  2]
##  [ 4 25  1]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8686868686868687
## 
## Error Global:
## 0.13131313131313127
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.842105  0.833333  0.935484
## 
## ********************
## Para k = 5
## ********************
## 
## Matriz de Confusión:
## [[32  5  1]
##  [ 4 25  1]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8585858585858586
## 
## Error Global:
## 0.14141414141414144
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.842105  0.833333  0.903226
## 
## ********************
## Para k = 6
## ********************
## 
## Matriz de Confusión:
## [[32  5  1]
##  [ 4 25  1]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8585858585858586
## 
## Error Global:
## 0.14141414141414144
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.842105  0.833333  0.903226
## 
## ********************
## Para k = 7
## ********************
## 
## Matriz de Confusión:
## [[34  2  2]
##  [ 5 24  1]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8686868686868687
## 
## Error Global:
## 0.13131313131313127
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.894737    0.8  0.903226
## 
## ********************
## Para k = 8
## ********************
## 
## Matriz de Confusión:
## [[33  4  1]
##  [ 4 25  1]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.868421  0.833333  0.935484
## 
## ********************
## Para k = 9
## ********************
## 
## Matriz de Confusión:
## [[35  2  1]
##  [ 6 23  1]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.921053  0.766667  0.935484
## 
## ********************
## Para k = 10
## ********************
## 
## Matriz de Confusión:
## [[33  4  1]
##  [ 5 24  1]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8686868686868687
## 
## Error Global:
## 0.13131313131313127
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.868421    0.8  0.935484
## 
## ********************
## Para k = 11
## ********************
## 
## Matriz de Confusión:
## [[35  2  1]
##  [ 6 23  1]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.921053  0.766667  0.935484
## 
## ********************
## Para k = 12
## ********************
## 
## Matriz de Confusión:
## [[35  2  1]
##  [ 5 23  2]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.921053  0.766667  0.935484
## 
## ********************
## Para k = 13
## ********************
## 
## Matriz de Confusión:
## [[35  2  1]
##  [ 6 22  2]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8686868686868687
## 
## Error Global:
## 0.13131313131313127
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.921053  0.733333  0.935484
## 
## ********************
## Para k = 14
## ********************
## 
## Matriz de Confusión:
## [[33  3  2]
##  [ 8 20  2]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8181818181818182
## 
## Error Global:
## 0.18181818181818177
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.868421  0.666667  0.903226
## 
## ********************
## Para k = 15
## ********************
## 
## Matriz de Confusión:
## [[33  3  2]
##  [ 9 19  2]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8080808080808081
## 
## Error Global:
## 0.19191919191919193
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.868421  0.633333  0.903226
## 
## ********************
## Para k = 16
## ********************
## 
## Matriz de Confusión:
## [[33  3  2]
##  [ 8 20  2]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8181818181818182
## 
## Error Global:
## 0.18181818181818177
## 
## Precisión por categoría:
##        tres     cinco      ocho
## 0  0.868421  0.666667  0.903226
## 
## ********************
## Para k = 17
## ********************
## 
## Matriz de Confusión:
## [[34  2  2]
##  [ 7 21  2]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8383838383838383
## 
## Error Global:
## 0.16161616161616166
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.894737    0.7  0.903226
## 
## ********************
## Para k = 18
## ********************
## 
## Matriz de Confusión:
## [[34  3  1]
##  [ 7 21  2]
##  [ 1  1 29]]
## 
## Precisión Global:
## 0.8484848484848485
## 
## Error Global:
## 0.1515151515151515
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.894737    0.7  0.935484
## 
## ********************
## Para k = 19
## ********************
## 
## Matriz de Confusión:
## [[35  2  1]
##  [ 7 21  2]
##  [ 2  1 28]]
## 
## Precisión Global:
## 0.8484848484848485
## 
## Error Global:
## 0.1515151515151515
## 
## Precisión por categoría:
##        tres  cinco      ocho
## 0  0.921053    0.7  0.903226
instancia_arbol = DecisionTreeClassifier(max_depth= 4)
instancia_arbol.fit(X_train,y_train)
## DecisionTreeClassifier(max_depth=4)
prediccion = instancia_arbol.predict(X_test)
MC = confusion_matrix(y_test, prediccion)
indices = indices_general(MC,list(np.unique(y)))

for k in indices:
    print("\n%s:\n%s"%(k,str(indices[k])))
## 
## Matriz de Confusión:
## [[23  2  5]
##  [ 2 27  2]
##  [ 2  5 31]]
## 
## Precisión Global:
## 0.8181818181818182
## 
## Error Global:
## 0.18181818181818177
## 
## Precisión por categoría:
##       cinco      ocho      tres
## 0  0.766667  0.870968  0.815789
instancia_bosques = RandomForestClassifier(n_estimators = 100, criterion = "gini", min_samples_split = 9)
RF_zip = Analisis_Predictivo(zipcode2,
                                    predecir = "Numero",
                                    modelo      = instancia_bosques, 
                                    train_size  = 0.8)
resultados_bosque = RF_zip.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[28  2  0]
##  [ 1 34  1]
##  [ 4  2 27]]
## 
## Precisión Global:
## 0.898989898989899
## 
## Error Global:
## 0.101010101010101
## 
## Precisión por categoría:
##       cinco      ocho      tres
## 0  0.933333  0.944444  0.818182
instancia_gbc = GradientBoostingClassifier(n_estimators = 100, criterion = "friedman_mse", min_samples_split = 9)
XGB_zip = Analisis_Predictivo(zipcode2,
                                    predecir = "Numero",
                                    modelo      = instancia_gbc, 
                                    train_size  = 0.8)
resultados_agc = XGB_zip.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[26  0  1]
##  [ 1 31  2]
##  [ 4  2 32]]
## 
## Precisión Global:
## 0.898989898989899
## 
## Error Global:
## 0.101010101010101
## 
## Precisión por categoría:
##       cinco      ocho      tres
## 0  0.962963  0.911765  0.842105
instancia_tree = DecisionTreeClassifier(min_samples_split = 3, 
                                        max_depth = None,
                                        criterion = "gini")
instancia_ada = AdaBoostClassifier(base_estimator = instancia_tree,
                                   n_estimators   = 100)

ADA_zip =Analisis_Predictivo(zipcode2, 
                                       predecir = "Numero", 
                                       modelo   = instancia_ada,
                                       train_size  = 0.8)
resultados_ada = ADA_zip.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[24  2  3]
##  [ 3 27  0]
##  [12  4 24]]
## 
## Precisión Global:
## 0.7575757575757576
## 
## Error Global:
## 0.24242424242424243
## 
## Precisión por categoría:
##       cinco  ocho  tres
## 0  0.827586   0.9   0.6
instancia_linear = SVC(kernel="linear", C = 15)

analisis_linear = Analisis_Predictivo(zipcode2, predecir = "Numero",modelo = instancia_linear, train_size = 0.8)

resultados_linear = analisis_linear.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[30  0  4]
##  [ 2 24  2]
##  [ 2  2 33]]
## 
## Precisión Global:
## 0.8787878787878788
## 
## Error Global:
## 0.12121212121212122
## 
## Precisión por categoría:
##       cinco      ocho      tres
## 0  0.882353  0.857143  0.891892
instancia_rbf = SVC(kernel="rbf", C = 15)

analisis_rbf = Analisis_Predictivo(zipcode2, predecir = "Numero",modelo = instancia_rbf, train_size = 0.8)

resultados_rbf = analisis_rbf.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[38  1  0]
##  [ 0 27  0]
##  [ 4  1 28]]
## 
## Precisión Global:
## 0.9393939393939394
## 
## Error Global:
## 0.06060606060606055
## 
## Precisión por categoría:
##       cinco  ocho      tres
## 0  0.974359   1.0  0.848485
instancia_sigmoid = SVC(kernel="sigmoid", C = 15)

analisis_sigmoid = Analisis_Predictivo(zipcode2, predecir = "Numero",modelo = instancia_sigmoid, train_size = 0.8)

resultados_sigmoid = analisis_sigmoid.fit_predict_resultados()
## 
## Matriz de Confusión:
## [[27  3  3]
##  [ 4 26  0]
##  [ 3  2 31]]
## 
## Precisión Global:
## 0.8484848484848485
## 
## Error Global:
## 0.1515151515151515
## 
## Precisión por categoría:
##       cinco      ocho      tres
## 0  0.818182  0.866667  0.861111
instancia_poly = SVC(kernel="poly", degree = 4,  C = 15)

analisis_poly = Analisis_Predictivo(zipcode2, predecir = "Numero",modelo = instancia_poly, train_size = 0.8)

resultados_poly = analisis_poly.fit_predict_resultados()

### Las predicciones con solo tres números no mejorar, por categoría algunos motores de preddiccion si mejoran debido a que son menos variables a predecir, pero en general, los motores se comportan con una mejor predicción cuando son todos los números en la tabla de entrenamiento y prueba.
## 
## Matriz de Confusión:
## [[26  4 12]
##  [ 0 25  5]
##  [ 0  0 27]]
## 
## Precisión Global:
## 0.7878787878787878
## 
## Error Global:
## 0.21212121212121215
## 
## Precisión por categoría:
##       cinco      ocho  tres
## 0  0.619048  0.833333   1.0