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