jersonalvr/machinelearning
0
1# utils/gemini_explainer.py2import streamlit as st3import google.generativeai as genai4from typing import Dict, Any, Optional5import h2o6import os7 8def generate_dataset_explanation(dataset, api_key=None):9 """10 Generate a dataset explanation using Gemini AI11 12 Args:13 dataset (pd.DataFrame): DataFrame to explain14 api_key (str, optional): Gemini API key15 16 Returns:17 str: Explanation of the dataset18 """19 try:20 # Prepare dataset information21 dataset_info = {22 'rows': len(dataset),23 'columns': len(dataset.columns),24 'column_names': list(dataset.columns),25 'data_types': str(dataset.dtypes),26 'first_rows': dataset.head().to_string(),27 'basic_stats': dataset.describe().to_string()28 }29 30 # Initialize Gemini Explainer31 explainer = GeminiExplainer(api_key)32 33 # Generate explanation34 explanation = explainer.generate_dataset_explanation(dataset_info)35 36 return explanation37 38 except Exception as e:39 return f"Error generating dataset explanation: {str(e)}"40 41def generate_model_explanation(self, model_info: Dict[str, Any]) -> str:42 """43 Generar una explicación detallada de un modelo de machine learning44 45 Args:46 model_info (dict): Información del modelo47 48 Returns:49 str: Explicación generada por Gemini50 """51 prompt = f"""Proporciona una explicación detallada del modelo de machine learning:52 53 Información del Modelo:54 - Nombre del Modelo: {model_info.get('name', 'N/A')}55 - Tipo de Problema: {model_info.get('problem_type', 'N/A')}56 - Hiperparámetros: {model_info.get('hyperparameters', 'N/A')}57 - Métricas de Rendimiento:58 * Accuracy/R²: {model_info.get('performance_metric', 'N/A')}59 * Otras métricas: {model_info.get('additional_metrics', 'N/A')}60 61 En tu explicación, incluye:62 1. Descripción del algoritmo63 2. Funcionamiento interno del modelo64 3. Interpretación de los hiperparámetros65 4. Análisis de las métricas de rendimiento66 5. Fortalezas y limitaciones del modelo67 6. Recomendaciones para posibles mejoras"""68 69 try:70 response = self.model.generate_content(prompt)71 return response.text72 except Exception as e:73 return f"Error al generar explicación: {str(e)}"74 75class GeminiExplainer:76 def __init__(self, api_key: Optional[str] = None):77 """78 Inicializar el explicador de Gemini79 80 Args:81 api_key (str, opcional): API key de Google Generative AI82 """83 self.api_key = api_key or st.session_state.get('gemini_api_key')84 85 if not self.api_key:86 raise ValueError("No se ha proporcionado una API key de Gemini")87 88 # Configurar la API de Gemini89 genai.configure(api_key=self.api_key)90 91 # Seleccionar modelo92 self.model = genai.GenerativeModel('gemini-1.5-flash')93 94 def generate_dataset_explanation(self, dataset_info: Dict[str, Any]) -> str:95 """96 Generar una explicación detallada del dataset97 98 Args:99 dataset_info (dict): Información del dataset100 101 Returns:102 str: Explicación generada por Gemini103 """104 prompt = f"""Analiza este dataset y proporciona una explicación clara y concisa de su estructura y contenido:105 106 Información del Dataset:107 - Dimensiones: {dataset_info.get('rows', 'N/A')} filas × {dataset_info.get('columns', 'N/A')} columnas108 - Columnas: {', '.join(dataset_info.get('column_names', []))}109 - Tipos de datos: {dataset_info.get('data_types', 'N/A')}110 - Primeras filas: {dataset_info.get('first_rows', 'N/A')}111 - Estadísticas básicas: {dataset_info.get('basic_stats', 'N/A')}112 113 En tu explicación, incluye:114 1. Descripción general del dataset115 2. Tipos de variables presentes116 3. Posibles desafíos o consideraciones para el análisis117 4. Sugerencias iniciales de preprocesamiento118 5. Potenciales insights o patrones preliminares"""119 120 try:121 response = self.model.generate_content(prompt)122 return response.text123 except Exception as e:124 return f"Error al generar explicación: {str(e)}"125 126 def generate_model_explanation(self, model_info: Dict[str, Any]) -> str:127 """128 Generar una explicación detallada de un modelo de machine learning129 130 Args:131 model_info (dict): Información del modelo132 133 Returns:134 str: Explicación generada por Gemini135 """136 # Extraer hiperparámetros en formato legible137 hyperparameters = model_info.get('hyperparameters', {})138 if isinstance(hyperparameters, dict):139 hyperparams_str = "\n".join([f"- {k}: {v}" for k, v in hyperparameters.items()])140 else:141 hyperparams_str = str(hyperparameters)142 143 prompt = f"""Proporciona una explicación detallada del modelo de machine learning:144 145Información del Modelo:146- Nombre del Modelo: {model_info.get('name', 'N/A')}147- Tipo de Problema: {model_info.get('problem_type', 'N/A')}148- Hiperparámetros: 149{hyperparams_str}150- Métricas de Rendimiento:151 * Accuracy/R²: {model_info.get('performance_metric', 'N/A')}152 * Tiempo de Entrenamiento: {model_info.get('training_time', 'N/A')}153 154En tu explicación, incluye:1551. Descripción del algoritmo1562. Funcionamiento interno del modelo1573. Interpretación de los hiperparámetros1584. Análisis de las métricas de rendimiento1595. Fortalezas y limitaciones del modelo1606. Recomendaciones para posibles mejoras"""161 162 try:163 response = self.model.generate_content(prompt)164 return response.text165 except Exception as e:166 return f"Error al generar explicación: {str(e)}"167 168 def generate_clustering_explanation(self, clustering_info: Dict[str, Any]) -> str:169 """170 Generar una explicación de resultados de clustering171 172 Args:173 clustering_info (dict): Información del clustering174 175 Returns:176 str: Explicación generada por Gemini177 """178 prompt = f"""Analiza los resultados del método de clustering:179 180Información del Clustering:181- Método: {clustering_info.get('method', 'N/A')}182- Número de Clusters: {clustering_info.get('n_clusters', 'N/A')}183- Parámetros: {clustering_info.get('parameters', 'N/A')}184- Métricas:185 * Silhouette Score: {clustering_info.get('silhouette_score', 'N/A')}186 * Calinski-Harabasz: {clustering_info.get('calinski_score', 'N/A')}187 * Davies-Bouldin: {clustering_info.get('davies_bouldin', 'N/A')}188 189En tu explicación, incluye:1901. Descripción del método de clustering1912. Interpretación de los parámetros utilizados1923. Significado de las métricas de evaluación1934. Análisis de la calidad de los clusters1945. Posibles insights o patrones detectados1956. Recomendaciones para ajustar el clustering"""196 197 try:198 response = self.model.generate_content(prompt)199 return response.text200 except Exception as e:201 return f"Error al generar explicación: {str(e)}"202 203 def generate_feature_importance_explanation(self, feature_importance_info: Dict[str, Any]) -> str:204 """205 Generar una explicación de la importancia de características206 207 Args:208 feature_importance_info (dict): Información de importancia de características209 210 Returns:211 str: Explicación generada por Gemini212 """213 method = feature_importance_info.get('method', 'N/A')214 features = feature_importance_info.get('features', [])215 importance_values = feature_importance_info.get('importance_values', {})216 217 # Formatear la información de importancia218 importance_str = "\n".join([f"- {feat}: {val}" for feat, val in importance_values.items()])219 220 prompt = f"""Analiza la importancia de las características en el modelo:221 222Información de Importancia de Características:223- Método de Evaluación: {method}224- Características:225{importance_str}226 227En tu explicación, incluye:2281. Descripción del método de evaluación de importancia2292. Análisis de las características más importantes2303. Interpretación de los valores de importancia2314. Posibles implicaciones para el modelado2325. Recomendaciones para selección de características"""233 234 try:235 response = self.model.generate_content(prompt)236 return response.text237 except Exception as e:238 return f"Error al generar explicación: {str(e)}"239 240def initialize_gemini_explainer():241 """242 Función de utilidad para inicializar el explicador de Gemini en Streamlit243 244 Returns:245 GeminiExplainer: Instancia del explicador de Gemini o None si hay error246 """247 try:248 if 'gemini_api_key' not in st.session_state:249 st.warning("Por favor configura tu API key de Gemini primero")250 return None251 252 api_key = st.session_state.get('gemini_api_key')253 if not api_key:254 st.warning("API key de Gemini no encontrada")255 return None256 257 # Inicializar explicador con la API key258 explainer = GeminiExplainer(api_key=api_key)259 return explainer260 261 except Exception as e:262 st.error(f"Error al inicializar el explicador: {str(e)}")263 return None264 265# Ejemplo de uso en Streamlit266def main():267 st.title("Explicaciones con Gemini")268 269 # Verificar configuración de API key270 if 'gemini_api_key' not in st.session_state:271 st.warning("Configura tu API key de Gemini")272 return273 274 explainer = initialize_gemini_explainer()275 276 if explainer:277 # Ejemplo de uso de métodos de explicación278 st.subheader("Explicación de Dataset")279 dataset_info = {280 'rows': 100,281 'columns': 5,282 'column_names': ['age', 'income', 'education', 'credit_score', 'loan_approved'],283 'data_types': 'Mixed (numeric and categorical)',284 'first_rows': 'Sample data preview',285 'basic_stats': 'Mean, median, standard deviation'286 }287 288 if st.button("Explicar Dataset"):289 explanation = explainer.generate_dataset_explanation(dataset_info)290 st.markdown(explanation)291 292 st.subheader("Explicación de Modelo")293 model_info = {294 'name': 'Random Forest Classifier',295 'problem_type': 'Clasificación binaria',296 'hyperparameters': {297 'n_estimators': 100,298 'max_depth': 5,299 'learning_rate': 0.1300 },301 'performance_metric': 0.85,302 'additional_metrics': {303 'precision': 0.82,304 'recall': 0.88,305 'f1_score': 0.85306 }307 }308 309 if st.button("Explicar Modelo"):310 explanation = explainer.generate_model_explanation(model_info)311 st.markdown(explanation)312 313 st.subheader("Explicación de Clustering")314 clustering_info = {315 'method': 'K-Means',316 'n_clusters': 3,317 'parameters': {318 'eps': 0.5,319 'min_samples': 5320 },321 'silhouette_score': 0.7,322 'calinski_score': 150.5,323 'davies_bouldin': 0.4324 }325 326 if st.button("Explicar Clustering"):327 explanation = explainer.generate_clustering_explanation(clustering_info)328 st.markdown(explanation)329 330 st.subheader("Explicación de Importancia de Características")331 feature_importance_info = {332 'method': 'SHAP Values',333 'features': ['age', 'income', 'education', 'credit_score'],334 'importance_values': {335 'age': 0.35,336 'income': 0.25,337 'education': 0.2,338 'credit_score': 0.2339 }340 }341 342 if st.button("Explicar Importancia de Características"):343 explanation = explainer.generate_feature_importance_explanation(feature_importance_info)344 st.markdown(explanation)345 346# Función para manejar errores de API key347def validate_gemini_api_key(api_key: str) -> bool:348 """349 Validar la API key de Gemini350 351 Args:352 api_key (str): API key a validar353 354 Returns:355 bool: True si la API key es válida, False en caso contrario356 """357 try:358 genai.configure(api_key=api_key)359 model = genai.GenerativeModel('gemini-1.5-flash')360 # Intentar generar una respuesta simple361 response = model.generate_content("Hola, ¿estás funcionando?")362 return True363 except Exception as e:364 st.error(f"Error de validación de API key: {str(e)}")365 return False366 367# Función de configuración de API key en Streamlit368def setup_gemini_api_key():369 """370 Configurar y validar la API key de Gemini en Streamlit371 """372 st.sidebar.header("🔑 Configuración de Gemini API")373 374 # Input para la API key375 api_key = st.sidebar.text_input(376 "Ingresa tu Gemini API Key", 377 type="password",378 help="Puedes obtener tu API key en Google AI Studio"379 )380 381 # Botón de validación382 if st.sidebar.button("Validar API Key"):383 if api_key:384 if validate_gemini_api_key(api_key):385 st.session_state.gemini_api_key = api_key386 st.sidebar.success("✅ API Key validada correctamente")387 else:388 st.sidebar.error("❌ API Key inválida")389 else:390 st.sidebar.warning("Por favor, ingresa una API Key")391 392 # Mostrar estado actual393 if 'gemini_api_key' in st.session_state:394 st.sidebar.info("API Key configurada")395 396# Configuraciones adicionales y documentación397def get_gemini_documentation():398 """399 Generar documentación sobre el uso de Gemini en el proyecto400 401 Returns:402 str: Documentación en formato markdown403 """404 documentation = """405 ## 🤖 Explicaciones con Gemini AI406 407 ### Características408 - Generación de explicaciones detalladas para:409 * Datasets410 * Modelos de Machine Learning411 * Resultados de Clustering412 * Importancia de Características413 414 ### Requisitos415 - API Key de Google AI Studio416 - Conexión a internet417 - Biblioteca `google-generativeai`418 419 ### Configuración420 1. Obtén tu API Key en [Google AI Studio](https://makersuite.google.com/app/apikey)421 2. Configura la API Key en la barra lateral422 3. Valida la conexión con el botón "Validar API Key"423 424 ### Limitaciones425 - Depende de la disponibilidad del servicio426 - Consumo de tokens de API427 - Explicaciones generadas por IA pueden no ser 100% precisas428 429 ### Mejores Prácticas430 - Usar como complemento, no como única fuente de verdad431 - Verificar siempre las explicaciones generadas432 - Tener contexto del problema al interpretar resultados433 """434 return documentation435 436# Punto de entrada principal437if __name__ == "__main__":438 main()