Señales de seguridad de ClawHub: una guía de codificación para el análisis de señales de seguridad de un extremo a otro y la clasificación de veredictos en el conjunto de datos de habilidades de IA
TEXT_COL = “skill_md_content” NUM_COLS = [“skillspector_score”, “static_finding_count”,
“skillspector_issue_count”, “virustotal_malicious_count”]
OBJETIVO = “clawscan_verdict” def prep(df): salida = df.copy() salida[TEXT_COL] = fuera[TEXT_COL].fillna(“”).astype(str).str.slice(0, 6000) para c en NUM_COLS: fuera[c] = pd.to_numeric(fuera[c]errores=”coerce”) devuelve train_p, test_p = prep(train_df), prep(test_df) get_text = FunctionTransformer(lambda X: X[TEXT_COL].valores, validar=Falso) text_pipe = Tubería([
(“select”, get_text),
(“tfidf”, TfidfVectorizer(max_features=20000, ngram_range=(1,2),
min_df=3, sublinear_tf=True)),
]) num_pipe = Tubería([
(“impute”, SimpleImputer(strategy=”constant”, fill_value=0)),
(“scale”, StandardScaler()),
]) características = ColumnTransformer([
(“text”, text_pipe, [TEXT_COL]), (“num”, num_pipe, NUM_COLS), ]) clf = Tubería([
(“features”, features),
(“model”, LogisticRegression(max_iter=2000, C=4.0,
class_weight=”balanced”,
multi_class=”multinomial”)),
]) print(“\nClasificador de entrenamiento (SKILL.md texto + números de escáner -> veredicto)…”) clf.fit(train_p[[TEXT_COL] + NUM_COLS]tren_p[TARGET]) pred = clf.predict(prueba_p[[TEXT_COL] + NUM_COLS]) print(“\n=== Informe de clasificación del conjunto de pruebas ===”) print(classification_report(test_p[TARGET]pred, dígitos=3)) cm = matriz_confusión(prueba_p[TARGET]pred, etiquetas=orden) plt.figure(figsize=(6,5)) sns.heatmap(cm, annot=True, fmt=”d”, cmap=”Blues”, xticklabels=order, yticklabels=order) plt.title(“Matriz de confusión (división de prueba)”); plt.xlabel(“Predicho”); plt.ylabel(“Real”); plt.show() prueba_out = prueba_p[[“skill_slug”, TARGET, “clawscan_summary”]].copiar() prueba_out[“pred”] = errores de pred = test_out[test_out[TARGET] != salida_prueba[“pred”]].head(8) print(“\n=== Ejemplos de clasificaciones erróneas ===”) para _, r en errores.iterrows(): print(f”- {r[‘skill_slug’]:35s} verdadero={r[TARGET]:10s} pred={r[‘pred’]:10s}”) print(“\nListo. Establezca SAMPLE_SIZE=Ninguno para el conjunto de datos completo.”)