Team Ai
Apppublic

jersonalvr/machinelearning

sourceHugging Faceupdated 11mo agoView on Hugging Face
0likes
gemini_explainer.py438 linesDownload Raw Back to utils
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()