def visualize_results(df, Priority_scores, feature_importance): fig, axes = plt.subplots(2, 3, figsize=(18, 10)) fig.suptitle(‘Escáner de vulnerabilidades – Panel de análisis de ML’, fontsize=16, fontweight=”bold”) axes[0, 0].hist(priority_scores, bins=30, color=”crimson”, alpha=0.7, edgecolor=”black”) ejes[0, 0].set_xlabel(‘Puntuación de prioridad’) ejes[0, 0].set_ylabel(‘Frecuencia’) ejes[0, 0].set_title(‘Distribución de puntuación de prioridad’) ejes[0, 0].axvline(np.percentile(priority_scores, 75), color=”orange”, linestyle=”–“, label=”percentil 75″) ejes[0, 0].legend() ejes[0, 1].dispersión(df[‘cvss_score’]puntuaciones_prioritarias, alfa=0,6, c=puntuaciones_prioritarias, cmap=’RdYlGn_r’, s=50) ejes[0, 1].set_xlabel(‘Puntuación CVSS’) ejes[0, 1].set_ylabel(‘Puntuación de prioridad de ML’) ejes[0, 1].set_title(‘Prioridad CVSS vs ML’) ejes[0, 1].trama([0, 10], [0, 1]’k–‘, alfa=0.3) Severity_counts = df[‘severity’].value_counts() colores = {‘CRÍTICO’: ‘rojo oscuro’, ‘ALTO’: ‘rojo’, ‘MEDIO’: ‘naranja’, ‘BAJO’: ‘amarillo’} ejes[0, 2].bar(severity_counts.index, severidad_counts.values, color=[colors.get(s, ‘gray’) for s in severity_counts.index]) ejes[0, 2].set_xlabel(‘Severidad’) ejes[0, 2].set_ylabel(‘Contar’) ejes[0, 2].set_title(‘Distribución de gravedad’) ejes[0, 2].tick_params(axis=”x”, rotación=45) top_features = feature_importance.head(10) ejes[1, 0].barh(características_principales[‘feature’]características_principales[‘importance’]color=”steelblue”) ejes[1, 0].set_xlabel(‘Importancia’) ejes[1, 0].set_title(‘Las 10 características más importantes’) ejes[1, 0].invert_yaxis() si ‘clúster’ en df.columns: cluster_counts = df[‘cluster’].value_counts().sort_index() ejes[1, 1].bar(cluster_counts.index, cluster_counts.values, color=”teal”, alpha=0.7) ejes[1, 1].set_xlabel(‘Clúster’) ejes[1, 1].set_ylabel(‘Contar’) ejes[1, 1].set_title(‘Clústeres de vulnerabilidad’) attack_vector_counts = df[‘attack_vector’].value_counts() ejes[1, 2].pie(attack_vector_counts.values, etiquetas=attack_vector_counts.index, autopct=”%1.1f%%”, startangle=90) ejes[1, 2].set_title(‘Distribución de vectores de ataque’) plt.tight_layout() plt.show() def main(): print(“=”*70) print(“ESCANÉR DE VULNERABILIDAD ASISTIDO POR IA CON PRIORIZACIÓN ML”) print(“=”*70) print() fetcher = CVEDataFetcher() df = fetcher.fetch_recent_cves(days=30, max_results=50) print(f”Resumen del conjunto de datos:”) print(f” CVE totales: {len(df)}”) print(f” Intervalo de fechas: {df[‘published’].min()[:10]} a {df[‘published’].max()[:10]}”) print(f” Desglose de gravedad: {df[‘severity’].value_counts().to_dict()}”) print() feature_extractor = VulnerabilityFeatureExtractor() incrustaciones = feature_extractor.extract_semantic_features(df[‘description’].tolist()) df = feature_extractor.extract_keyword_features(df) df = feature_extractor.encode_categorical_features(df) prioritario = VulnerabilityPrioritizer() X = prioritario.prepare_features(df, incrustaciones) Severity_map = {‘BAJO’: 0, ‘MEDIO’: 1, ‘ALTO’: 2, ‘CRÍTICO’: 3, ‘DESCONOCIDO’: 1} y_severidad = df[‘severity’].map(severity_map).values y_score = df[‘cvss_score’].values X_scaled = priorizador.train_models(X, y_severity, y_score) puntuaciones_prioridad, problemas_gravedad, puntuación_preds = prioritario.predict_priority(X) df[‘ml_priority_score’] = puntuaciones_prioritarias df[‘predicted_score’] = analizador score_preds = VulnerabilityAnalyzer(n_clusters=5) clusters = analyser.cluster_vulnerabilities(embeddings) df = analyze_clusters(df, clusters) feature_imp, emb_imp = priorer.get_feature_importance() print(f”\n— Importancia de la característica —“) print(feature_imp.head(10)) print(f”\nImportancia de incrustación promedio: {emb_imp:.4f}”) print(“\n” + “=”*70) print(“10 VULNERABILIDADES PRINCIPALES PRINCIPALES”) print(“=”*70) top_vulns = df.nlargest(10, ‘ml_priority_score’)[[‘cve_id’, ‘cvss_score’, ‘ml_priority_score’, ‘severity’, ‘description’]]para idx, fila en top_vulns.iterrows(): print(f”\n{fila[‘cve_id’]} [Priority: {row[‘ml_priority_score’]:.3f}]”) print(f” CVSS: {fila[‘cvss_score’]:.1f} | Gravedad: {fila[‘severity’]}”) imprimir(f” {fila[‘description’][:100]}…”) print(“\n\nGenerando visualizaciones…”) visualize_results(df, Priority_scores, feature_imp) print(“\n” + “=”*70) print(“ANÁLISIS COMPLETO”) print(“=”*70) print(f”\nResumen de resultados:”) print(f” Alta prioridad (>0.7): {(priority_scores > 0.7).sum()} vulnerabilidades”) print(f” Prioridad media (0.4-0.7): {((priority_scores >= 0.4) & (priority_scores <= 0.7)).sum()}") print(f" Baja prioridad (<0.4): {(priority_scores < 0.4).sum()}") return df, priorizador, analizador if __name__ == "__main__": resultados_df, priorizador, analizador = main() print("\n ✓ ¡Todos los análisis se completaron exitosamente!") print("\nAhora puede:") print(" - Acceder a los resultados a través del marco de datos 'results_df'") print(" - Usar 'priorizador' para predecir nuevas vulnerabilidades") print(" - Explorar el 'analizador' para obtener información sobre agrupaciones")