ExamenSustitutorio CC421
ExamenSustitutorio CC421
ExamenSustitutorio CC421
January 7, 2022
df = pd.read_csv('https://raw.githubusercontent.com/jeffheaton/aifh/master/vol1/
,→python-examples/datasets/breast-cancer-wisconsin.csv', na_values='?',␣
,→index_col='id')
features = df.columns[:-1]
target = df.columns[-1]
print('Features: ', features)
1
print('Target: ', target)
df.head()
Pregunta: (0.5 puntos) Asigna a una variable de nombre X las columnas de características (todas
menos class)
[ ]: # Completa
[ ]: # Completa
Pregunta: (1 punto) Crea una variable de nombre y (minúscula) que tenga valor 1 cuando class
= 4 (tumor maligno) y valor 0 cuando class = 2 (tumor benigno).
[ ]: #df.head()
[ ]: # Estandarizamos el dataset
#from sklearn.preprocessing import scale
#X = scale(df.drop(['class','target'],axis=1))
2
#print('Dimensiones de y_test:', len(y_test))
# Completa
Pregunta: (0.5 puntos) Entrena un modelo SVM: * Compara el rendimiento de un kernel lineal,
un kernel polinomial de tercer grado y un kernel gausiano. * En todos los casos, aplica primero
estandarización de características, con la media y desviación estándar calculadas según el conjunto
de entrenamiento. * En todos los casos, ajusta el peso de las clases usando la opción que brinda
sklearn. * En todos los casos, usar C=1 y probability=True. * No aplicar aún búsqueda grid.
* Evaluar cada modelo indicando las siguientes métricas tanto para el conjunto de entrenamiento
como para el conjunto de pruebas: Exactitud, Precisión, Exhaustividad, Puntaje F1, y Área bajo
la curva ROC (AUC)
[ ]: #X_train.describe()
,→plot_precision_recall_curve
resultados = {}
# Código obtenido a utilizar
def save_and_show_resultados(descripcion, model, resultados, X_train, X_test,␣
,→y_train, y_test):
y_train_pred = model.predict(X_train)
y_train_pred_proba = model.predict_proba(X_train)[:,1]
y_test_pred = model.predict(X_test)
y_test_pred_proba = model.predict_proba(X_test)[:,1]
resultados.update( { descripcion: {
('Entrenamiento', 'Exactitud'): model.score(X_train, y_train),
('Entrenamiento', 'Precisión'): precision_score(y_train, y_train_pred,␣
,→zero_division=0),
3
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
fig.suptitle(f'{descripcion} (Conjunto de Pruebas)')
plot_confusion_matrix(model, X_test, y_test, ax=axes[0], values_format='d')
plot_roc_curve(model, X_test, y_test, ax=axes[1], name=descripcion)
plot_precision_recall_curve(model, X_test, y_test, ax=axes[2],␣
,→name=descripcion)
Pregunta: (1 punto) Utiliza la clase GridSearchCV de sklearn para ajustar el SVM de kernel
gaussiano: * Aplica primero estandarización de características, con la media y desviación estándar
calculadas según el conjunto de entrenamiento. * En todos los casos, ajusta el peso de las clases
usando la opción que brinda sklearn. * Explora con valores de C: [0.1, 1, 10] y gamma: [0.1,
1, 10] * Indicar cuáles fueron los mejores valores obtenidos para C y para gamma. * Evaluar cada
modelo indicando las siguientes métricas: Exactitud, Precisión, Exhaustividad, Puntaje F1, y Área
bajo la curva ROC (AUC)
[ ]: #train_tune = dataset_normalizado
#target = 'target'
#predictors = [x for x in train_tune.columns if x not in [target]]
#param_test1 = {
# ...
# ...
#}
# Completa
# ...
# Mejores valores:
# Completa
4
[ ]: #save_and_show_resultados('SVM Gausiano con GridSearchCV', model_s, resultados,␣
,→X_train, X_test, y_train, y_test)
[ ]: #param_test2 = {
# 'n_neighbors':[3,5,7]
#}
# Completa
# Mejor K:
[ ]: # Usa el mejor K
# Completa
Pregunta: (1 punto) Entrena un modelo de tu elección, que esté basado en árboles de decisión,
bagging o boosting: * Evalúalo del mismo modo que los anteriores. * Haz un gráfico de barras con
las características más importantes reportadas por el algoritmo.
[ ]: ## Tu código
Sugerencia: Para que esta pregunta sea evaluada correctamente, debes comentar y discutir los
resultados obtenidos con los modelos entrenados:
• Comparar los resultados
• Identificar casos de overfitting.
• Elegir al mejor modelo según la experimentación.
• Indicar qué pasos seguiría para mejorar los resultados.
5
inferencia.
2. Indica las ventajas de los grafos de cálculo dinámico sobre los grafos de cálculo estático.
3. Supongamos que estás tratando de navegar por un mundo lleno de peligros desconocidos como
abismos, fuego, atolladeros, grandes arañas, etc., en busca de tesoros, y usa dos algoritmos A
y B para encontrar la política óptima. El algoritmo A devuelve una política casi óptima, que
parece mantenerlo más seguro al alejarlo de los peligros. Dado que un algoritmo es Sarsa y
el otro es Q-learning, especifique cuál de A y B es Q-learning.
4. Explica la equivalencia entre el algoritmo de regresión lineal y el aprendizaje de una neurona
lineal.
[ ]: ## Tus respuestas
def dosEspirales(N):
np.random.seed(1)
n = np.sqrt(np.random.rand(N,1)) * 780 * (2*np.pi)/360
x = -np.cos(n)*n
y = np.sin(n)*n
return (np.vstack((np.hstack((x,y)),np.hstack((-x,-y)))),
np.hstack((np.ones(N)*-1,np.ones(N))))
X, y = dosEspirales(300)
fig = plt.figure(figsize=(6,6))
for i in range(len(y)):
x1 = X[i,0]
x2 = X[i,1]
if (y[i] == 1):
plt.plot(x1,x2,'+', color='#648fff')
else:
plt.plot(x1,x2,'k_', color='#fe6100')
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.legend()
plt.title('Datos de dos espirales')
plt.axis()
plt.show()
Verificación de pasos
6
[ ]: print(X[0])
yv = np.zeros(X.shape)
yv[y==1,0]=1
yv[y==-1,1]=1
print(yv[0])
np.random.seed(1)
w1 = 2.0*np.random.random((2, 3))-1.0
w2 = 2.0*np.random.random((3, 2))-1.0
print(w1)
print(w2)
print(X[0].dot(w1))
print(1.0/(1.0+np.exp(-X[0].dot(w1))))
z1 = X[0].dot(w1)
o1 = 1.0/(1.0+np.exp(-X[0].dot(w1)))
print(o1.dot(w2))
o2 = 1.0/(1.0+np.exp(-o1.dot(w2)))
print(o2)
a=np.array([[-0.52476045, 0.50415211]])
b=np.array([[-0.10894822, 0.01633295]])
c=np.array([[3.79325728e-02, 3.64802735e-01, 1.20447478e-05]])
print(a*b)
np.set_printoptions(suppress=True)
print(c.T.dot(a*b))
print((a*b).dot(w2.T))
print(o1*(1-z1))
p=X[0].reshape((1,2))
q=(a*b).dot(w2.T)
r=o1*(1-z1)
print(p.T*(q*r))
print(w1-(0.001*(p.T*(q*r))))
np.set_printoptions(suppress=False)
7
X = StandardScaler().fit_transform(X_std)
N = 50
dim_entrada = int(X.shape[1])
dim_oculta = 3
dim_salida = 2
num_epocas = 100000
tasa_aprendizaje= 1e-3
reg_coeff = 1e-3
perdidas = []
exactitudes=[]
8
# Inicializacion:
np.random.seed(1)
w1 = 2.0*np.random.random((dim_entrada,dim_oculta))-1.0
w2 = 2.0*np.random.random((dim_oculta, dim_salida))-1.0
#Calibracion
w1 /= np.sqrt(dim_entrada)
w2 /= np.sqrt(dim_oculta)
for i in range(num_epocas):
index = np.arange(X.shape[0])
np.random.shuffle(index)
index = index[:N]
# -----------------------------------------------------------------------------
# Implementación del forward
# Completa
#-----------------------------------------------------------------------------
# Definicion de la funcion de perdida: MSE + regularizacion ridge
# ...
#-----------------------------------------------------------------------------
# Implementación del backward
#....
## Actualizacion de pesos
#...
[ ]: #plt.figure()
#for k in range(len(perdidas)):
# if k%1000==0:
# plt.plot(losses[k][0], losses[k][1], 'k.')
#plt.show()
#plt.figure()
#for k in range(len(accuracies)):
# if k%1000==0:
# plt.plot(accuracies[k][0], accuracies[k][1], 'k.')
#plt.show()
9
[ ]: def probas1(data, pesos):
o1 = sigmoid(np.matmul(data, pesos[0]))
logits = np.matmul(o1, pesos[1])
return logits
fig = plt.figure(figsize=(6,6))
for i in range(len(y)):
x1 = X[i,0]
x2 = X[i,1]
if y[i]==1:
if (y_pred[i] == 0):
plt.plot(x1,x2,'+', color='#648fff')
else:
plt.plot(x1,x2,'k.', alpha=0.25)
else:
if (y_pred[i] == 1):
plt.plot(x1,x2,'_', color='#fe6100')
else:
plt.plot(x1,x2,'k.', alpha=0.25)
exactitud = np.sum(np.equal(y_pred,y_actual))/len(y_actual)
plt.axis()
plt.xlim(min(X[:,0])-0.1, max(X[:,0])+0.1)
plt.ylim(min(X[:,1])-0.1, max(X[:,1])+0.1)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.legend()
10
plt.title('MLP entrenado en un conjunto de datos en espiral. Exactitud:␣
,→'+str(exactitud))
plt.show()
El gráfico resultante, no es la respuesta pedida, solo es una forma de evaluación. Cuando completes
el código, el gráfico debe ser parecido pero no igual y debes explicar los resultados.
[ ]: ## Tu respuesta
[ ]:
11