<jupyter_start><jupyter_text>MAT281 - Laboratorio N°10  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("BC.csv"), sep=",")
df['diagnosis'] = df['diagnosis'] .replace({'M':1,'B':0}) # target 
df.head()<jupyter_output><empty_output><jupyter_text>Basado en la información presentada responda las siguientes preguntas:1. Realice un análisis exploratorio del conjunto de datos.1. Normalizar las variables numéricas con el método **StandardScaler**.3. Realizar un método de reducción de dimensionalidad visto en clases.4. Aplique al menos tres modelos de clasificación distintos. Para cada uno de los modelos escogidos, realice una optimización de los hiperparámetros. además, calcule las respectivas métricas. Concluya. Empecemos analizando los datos<jupyter_code>print("Primero veamos la cantidad de valores unicos y vacios\n") 

resumen = []
for columna in df.columns:
    unico = df[columna].unique()
    vacio = df[columna][df[columna].isna()]
    
    info = pd.DataFrame({
        "columna": [columna],
        "unicos": [len(unico)],
        "vacios": [len(vacio)]
    })
    resumen.append(info)
info_dataframe = pd.concat(resumen).reset_index(drop=True)
print(info_dataframe)<jupyter_output>Primero veamos la cantidad de valores unicos y vacios

                    columna  unicos  vacios
0                        id     569       0
1                 diagnosis       2       0
2               radius_mean     456       0
3              texture_mean     479       0
4            perimeter_mean     522       0
5                 area_mean     539       0
6           smoothness_mean     474       0
7          compactness_mean     537       0
8            concavity_mean     537       0
9       concave points_mean     542       0
10            symmetry_mean     432       0
11   fractal_dimension_mean     499       0
12                radius_se     540       0
13               texture_se     519       0
14             perimeter_se     533       0
15                  area_se     528       0
16            smoothness_se     547       0
17           compactness_se     541       0
18             concavity_se     533       0
19        concave points_se     507       0
20              symme[...]<jupyter_text>Como se puede ver no hay datos vacios y solo hay 2 diagnosticos por lo que no hay problemas.Luego veamos algunos datos estadisticos.<jupyter_code>print("\nLuego veamos los datos estadisticos de las columnas\n")

print("\n",df.describe())<jupyter_output>Luego veamos los datos estadisticos de las columnas


                  id   diagnosis  radius_mean  texture_mean  perimeter_mean  \
count  5.690000e+02  569.000000   569.000000    569.000000      569.000000   
mean   3.037183e+07    0.372583    14.127292     19.289649       91.969033   
std    1.250206e+08    0.483918     3.524049      4.301036       24.298981   
min    8.670000e+03    0.000000     6.981000      9.710000       43.790000   
25%    8.692180e+05    0.000000    11.700000     16.170000       75.170000   
50%    9.060240e+05    0.000000    13.370000     18.840000       86.240000   
75%    8.813129e+06    1.000000    15.780000     21.800000      104.100000   
max    9.113205e+08    1.000000    28.110000     39.280000      188.500000   

         area_mean  smoothness_mean  compactness_mean  concavity_mean  \
count   569.000000       569.000000        569.000000      569.000000   
mean    654.889104         0.096360          0.104341        0.088799   
std     351.914129    [...]<jupyter_text>Como se puede ver, no hay valores negativos y no hay valores fuera de la norma<jupyter_code>print("\nLuego veamos cuantos diagnosticos hay\n")

plt.figure(figsize=(15,5))
plotting = sns.countplot(
    y = "diagnosis",
    data = df,
    order = df["diagnosis"].value_counts().index,
    palette = "Blues_d",
)
for cont in plotting.containers:
    plotting.bar_label(cont,fontsize=20)
    plt.show<jupyter_output>Luego veamos cuantos diagnosticos hay<jupyter_text>Las cantidades estan correctas, por lo que no hay problemas en los datos Normalizamos y empezamos la reduccion de dimensionalidad al mismo tiempo, usando un pipeline. Cabe mencionar que se entrenara el modelo PCA.<jupyter_code>from sklearn.pipeline import Pipeline
from sklearn.pipeline import make_pipeline

df_new = df.set_index("id")
pca_pipe = make_pipeline(StandardScaler(), PCA())
pca_pipe.fit(df_new)
modelo_pca = pca_pipe.named_steps["pca"]
modelo_pca.components_.shape<jupyter_output><empty_output><jupyter_text>Ahora queremos acceder a las componentes creadas, como tenemos 31 componentes se tendra una matriz 31x31, y haremos un mapa de calor para representarlos<jupyter_code>pd.DataFrame(
    data = modelo_pca.components_,
    columns = df_new.columns,
    index = ["PC1","PC2","PC3","PC4","PC5","PC6","PC7","PC8","PC9","PC10",
             "PC11","PC12","PC13","PC14","PC15","PC16","PC17","PC18","PC19","PC20",
             "PC21","PC22","PC23","PC24","PC25","PC26","PC27","PC28","PC29","PC30","PC31"]
)
plt.figure(figsize=(15,30))
componentes = modelo_pca.components_
plt.imshow(componentes.T,cmap="viridis",aspect="auto")
plt.yticks(range(len(df_new.columns)),df_new.columns)
plt.xticks(range(len(df_new.columns)),np.arange(modelo_pca.n_components_)+1)
plt.grid(False)
plt.colorbar();<jupyter_output><empty_output><jupyter_text>Asi se puede ahora reducir la dimencion<jupyter_code>proyecciones = pca_pipe.transform(X=df_new)
proyecciones = pd.DataFrame(
    proyecciones,
    columns = ["PC1","PC2","PC3","PC4","PC5","PC6","PC7","PC8","PC9","PC10",
             "PC11","PC12","PC13","PC14","PC15","PC16","PC17","PC18","PC19","PC20",
             "PC21","PC22","PC23","PC24","PC25","PC26","PC27","PC28","PC29","PC30","PC31"],
    index = df_new.index
)
proyecciones.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09525135774961704, 'fraction_numerical': 0.09274474307199554, 'mean_word_length': 3.1299597469810236, 'pattern_counts': {'":': 3, '<': 28, '<?xml version=': 0, '>': 28, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '352182', 'license': 'MIT', 'n_tokens_mistral': 2812, 'n_tokens_neox': 2429, 'n_words': 651, 'path': 'labs/lab_10/lab_10.ipynb', 'repo_name': 'GabrielMoyaVal/mat281_portfolio-', 'size': '7199'}