<jupyter_start><jupyter_text>Extracción de características  Análisis de la componente principal (PCA)<jupyter_code>from sklearn.datasets import load_breast_cancer
import pandas as pd
# Cargamos los datos
cancer_data = load_breast_cancer()
df = pd.DataFrame(data=cancer_data.data, columns=cancer_data.feature_names)
# Y mostramos algunas variables por pantalla
print(df.head())
print(df.describe())
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Rescalamos los datos teniendo en cuenta la media y desviación estándar de cada variable
scaler.fit(df.values)
X_scaled = scaler.transform(df.values)
print("X_scaled:\n", X_scaled)
# Vamos a utilizar las funciones de Sci-kit learn para análisis PCA
from sklearn.decomposition import PCA
# Para evaluar los resultados, utilizaremos el conjunto completo de variables 
pca = PCA(n_components=30, random_state=2020)
pca.fit(X_scaled)
X_pca = pca.transform(X_scaled)
# La variable anterior almacena los valores de los (30) componentes principales
print("X_pca:\n", X_pca)

# Puesto que seleccionamos el conjunto completo de variables las componenete 
# seleccionadas deben dar cuenta del 100% de la varianza en los datos
print("\n => Varianza explicada por las componentes:", sum(pca.explained_variance_ratio_ * 100))
# Si representamos la varianza en función del número de componentes podemos observar
# cuál es el mínimo número de componenetes que necesitaremos para explicar un cierto
# porcentaje de la varianza
import matplotlib.pyplot as plt
import numpy as np
plt.plot(np.cumsum(pca.explained_variance_ratio_ * 100))
plt.xlabel("Número de componenetes")
plt.ylabel("Porcentaje de varianza explicado")
# Vemos que con solo un tercio de las variables podemos explicar el 95% de la variaza
n_var = np.cumsum(pca.explained_variance_ratio_ * 100)[9]
print("Varianza 10 primeras componenetes:", n_var)
# Alternativamente, podemos construir el conjunto que acomode el 95% de la variaza 
# del siguiente modo
pca_95 = PCA(n_components=0.95, random_state=2020)
pca_95.fit(X_scaled)
X_pca_95 = pca_95.transform(X_scaled)

# Una buena práctica es visualizar la relación de las principales componentes
import seaborn as sns
sns.scatterplot(X_pca_95[:, 0], X_pca_95[:, 1], hue=cancer_data.target)
# Finalmente podemos crear un nuevo marco de datos con el resultado del análisis PCA
cols = ['PCA' + str(i) for i in range(10)]
df_pca = pd.DataFrame(X_pca_95, columns=cols)
print("Datos (PCA - 95%):\n", df_pca)<jupyter_output>Datos (PCA - 95%):
           PCA0       PCA1      PCA2  ...      PCA7      PCA8      PCA9
0     9.192837   1.948583 -1.123166  ... -0.398407 -0.157118 -0.877402
1     2.387802  -3.768172 -0.529293  ...  0.240988 -0.711905  1.106995
2     5.733896  -1.075174 -0.551748  ...  0.097374  0.024066  0.454275
3     7.122953  10.275589 -3.232790  ...  1.059565 -1.405440 -1.116975
4     3.935302  -1.948072  1.389767  ...  0.636376 -0.263805  0.377704
..         ...        ...       ...  ...       ...       ...       ...
564   6.439315  -3.576817  2.459487  ... -0.035471  0.987929  0.256989
565   3.793382  -3.584048  2.088476  ... -1.113360 -0.105207 -0.108632
566   1.256179  -1.902297  0.562731  ...  0.341887  0.393917  0.520877
567  10.374794   1.672010 -1.877029  ... -0.280239 -0.542035 -0.089296
568  -5.475243  -0.670637  1.490443  ...  1.046354  0.374101 -0.047726

[569 rows x 10 columns]
[1.33049908e+01 5.70137460e+00 2.82291016e+00 1.98412752e+00
 1.65163324e+00 1.20948224e+00 6.76408882e[...]<jupyter_text>Análisis de Componentes Independientes (ICA)<jupyter_code># Utilizaremos datos de fMRI para nuestro ejemplo con ICA
# Para ello, comenzamos instalando la librería nilearn  
!python -m pip install nilearn
from nilearn import datasets
# Descargamos un sujeto del estudio con RM funcional
dataset = datasets.fetch_development_fmri(n_subjects=1)
file_name = dataset.func[0]

# Preprocesado de la imagen
from nilearn.input_data import NiftiMasker

# Aplicamos una máscara para extraer el fondo de la imagen (vóxeles no cerebrales)
masker = NiftiMasker(smoothing_fwhm=8, memory='nilearn_cache', memory_level=1,
                     mask_strategy='epi', standardize=True)
data_masked = masker.fit_transform(file_name)
from sklearn.decomposition import FastICA
import numpy as np
# Seleccionamos 10 componentes 
ica = FastICA(n_components=10, random_state=42)
components_masked = ica.fit_transform(data_masked.T).T
# Aplicamos un corte (80% señal) en los datos después de normalizar según 
# la media y desviación estándar de los datos
components_masked -= components_masked.mean(axis=0)
components_masked /= components_masked.std(axis=0)
components_masked[np.abs(components_masked) < .8] = 0
# Invertimos la transformación para recuperar la estructura 3D
component_img = masker.inverse_transform(components_masked)
# Finalmete, visualizamos el resultado de las operaciones de reducción
from nilearn import image
from nilearn.plotting import plot_stat_map, show
mean_img = image.mean_img(func_filename)
plot_stat_map(image.index_img(component_img, 0), mean_img)
plot_stat_map(image.index_img(component_img, 1), mean_img)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0944055944055944, 'fraction_numerical': 0.11713286713286714, 'mean_word_length': 4.275614754098361, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '4550', 'license': 'MIT', 'n_tokens_mistral': 2280, 'n_tokens_neox': 1944, 'n_words': 509, 'path': 'Modulo_2/2_3_3_Extraccion_de_caracteristicas.ipynb', 'repo_name': 'txusser/Master_IA_Sanidad', 'size': '5148'}