<jupyter_start><jupyter_text>MAT281 - Laboratorio N°04 Objetivos del laboratorio* Reforzar conceptos básicos de reducción de dimensionalidad.  Contenidos* [Problema 01](p1)  I.- Problema 01El **cáncer de mama**  es una proliferación maligna de las células epiteliales que revisten los conductos o lobulillos mamarios. Es una enfermedad clonal; donde una célula individual producto de una serie de mutaciones somáticas o de línea germinal adquiere la capacidad de dividirse sin control ni orden, haciendo que se reproduzca hasta formar un tumor. El tumor resultante, que comienza como anomalía leve, pasa a ser grave, invade tejidos vecinos y, finalmente, se propaga a otras partes del cuerpo.El conjunto de datos se denomina `BC.csv`, el cual contine la información de distintos pacientes con tumosres (benignos o malignos) y algunas características del mismo.Las características se calculan a partir de una imagen digitalizada de un aspirado con aguja fina (FNA) de una masa mamaria. Describen las características de los núcleos celulares presentes en la imagen.Los detalles se puede encontrar en [<NAME> and <NAME>: "Robust Linear Programming Discrimination of Two Linearly Inseparable Sets", Optimization Methods and Software 1, 1992, 23-34].Lo primero será cargar el conjunto de datos:<jupyter_code>import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA


%matplotlib inline
sns.set_palette("deep", desat=.6)
sns.set(rc={'figure.figsize':(11.7,8.27)})
# cargar datos
df = pd.read_csv(os.path.join("data","BC.csv"), sep=",")
df['diagnosis'] = df['diagnosis'] .replace({'M':1,'B':0})
df.head()<jupyter_output><empty_output><jupyter_text>Basado en la información presentada responda las siguientes preguntas:1. Normalizar para las columnas numéricas con procesamiento **StandardScaler**.2. Realice un gráfico de correlación. Identifique la existencia de colinealidad.3. Realizar un ajuste PCA con **n_components = 10**. Realice un gráfico de la varianza y varianza acumulada. Interprete.4. Devuelva un dataframe con las componentes principales.5. Aplique al menos tres modelos de clasificación. Para cada modelo, calule el valor de sus métricas.<jupyter_code>#1
#normalización de las columnas con datos númericos
scaler = StandardScaler()
df[df.columns[2:].tolist()]=scaler.fit_transform(df[df.columns[2:].tolist()])
df.head()
#2
corr = df[df.columns[1:]].corr()
sns.heatmap(corr)<jupyter_output><empty_output><jupyter_text>__Respuesta__: A partir del mapa de calor, es posible notar que hay una buena correlacion entre el perimetro y radio del objeto.<jupyter_code>features = df.columns[2:].tolist()
x = df.loc[:, features].values
pca = PCA(n_components=10)
principalComponents = pca.fit_transform(x)

# gráfico varianza por componente
percent_variance = np.round(pca.explained_variance_ratio_* 100, decimals =2)
columns = ['PC1', 'PC2', 'PC3', 'PC4','PC5','PC6','PC7','PC8','PC9','PC10']

plt.figure(figsize=(12,4))
plt.bar(x= range(1,11), height=percent_variance, tick_label=columns)
plt.ylabel('Percentate of Variance Explained')
plt.xlabel('Principal Component')
plt.title('PCA Scree Plot')
plt.show()
# gráfico varianza por la suma acumulada de los componente
percent_variance_cum = np.cumsum(percent_variance)
columns =  ['PC1', 'PC2', 'PC3', 'PC4','PC5','PC6','PC7','PC8','PC9','PC10']

plt.figure(figsize=(12,4))
plt.bar(x= range(1,11), height=percent_variance_cum, tick_label=columns)
plt.ylabel('Percentate of Variance Explained')
plt.xlabel('Principal Component Cumsum')
plt.title('PCA Scree Plot')
plt.show()

##        Interpretar PCi como PC1+...+PCi , con i=1,...,10                    ##<jupyter_output><empty_output><jupyter_text>__Respuesta:__ A partir de la varianza acumulada se puede notar que en la acumulación de los primeros 5 componentes principales ya se tiene un aproximado del 82% de varianza acumulada del total, lo que implica estos componentes principales abarcan gran parte de las características del conjunto de datos, por lo que se trabajara solo con esos cinco y se omitirá el resto<jupyter_code>#4

#Creación de dataframe con las cinco componentes y el target del diagnostico
pca = PCA(n_components=5)

principalComponents = pca.fit_transform(x)

principalDataframe = pd.DataFrame(data = principalComponents, columns = ['PC1', 'PC2','PC3','PC4','PC5'])
targetDataframe = df[['diagnosis']]

newDataframe = pd.concat([principalDataframe, targetDataframe],axis = 1)
newDataframe.head()
#5
Y= np.ravel(df[['diagnosis']])
X_new = pca.fit_transform(df[df.columns[2:]])
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X_new, Y, test_size=0.2, random_state = 2) 
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,recall_score,precision_score,f1_score

#Modelos usados: LogisticRegression, RandomForestClassifier , DecisionTreeClassifier
frames=pd.DataFrame({   #Dataframe de las métricas por modelo
    'modelo': [],
    'accuracy_score':[],
    'recall_score':[],
    'precision_score':[],
    'f1_score':[]
})

frames['modelo']=['LogisticRegression','RandomForestClassifier','DecisionTreeClassifier'] #se agregan modelos

models=[LogisticRegression(),RandomForestClassifier(random_state=0),DecisionTreeClassifier(random_state=0)]

acc=[]
rec=[]
prec=[]
f1=[]
metrics=[acc,rec,prec,f1]

#se aplican las métricas a los 3 modelos
for model in models:
    mod =  model
    mod.fit(X_train, Y_train)
    mod_pred = mod.predict(X_test)
    
    acc.append(accuracy_score(Y_test, mod_pred))
    rec.append(recall_score(Y_test, mod_pred))
    prec.append(precision_score(Y_test, mod_pred))
    f1.append(f1_score(Y_test, mod_pred))
#se agregan al dataframe
i=0
for column in frames.columns[1:]:
    frames[column]=metrics[i]
    i+=1

frames=frames.set_index('modelo')
frames<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup