Что делает код и зачем он нужен
В примере показан типичный рабочий процесс построения классификатора, который принимает два типа признаков:
- текстовое поле skill_md_content (обрезанное до 6000 символов);
- числовые метрики сканеров (skillspector_score, static_finding_count, skillspector_issue_count, virustotal_malicious_count).
Задача – предсказать clawscan_verdict, то есть судить о том, безопасна ли сущность (например, репозиторий) согласно результатам сканирования.
Подготовка данных
Функция prep делает три вещи:
- заполняет пропуски в тексте пустой строкой и обрезает его до 6000 символов, чтобы TF‑IDF не «залипал» на гигантские документы;
- приводит все числовые колонки к типу
float, заменяя ошибочные значенияNaN; - возвращает копию датафрейма, чтобы оригинал оставался нетронутым.
Важный момент – df.copy() защищает от случайного изменения исходных наборов train_df и test_df.
Текстовый пайплайн
Текстовая часть построена на TfidfVectorizer с такими параметрами:
- max_features=20000 – фиксируем размер словаря, иначе память может взлететь;
- ngram_range=(1,2) – учитываем отдельные слова и их пары, что обычно повышает качество;
- min_df=3 – отбрасываем редкие токены, которые появляются в менее чем трёх документах;
- sublinear_tf=True – применяем логарифмическое масштабирование частоты, чтобы частые слова не доминировали.
Объект FunctionTransformer просто извлекает столбец с текстом из датафрейма, поэтому ColumnTransformer может работать с разными типами признаков одновременно.
Числовой пайплайн
Для чисел используем два шага:
SimpleImputer(strategy="constant", fill_value=0)– заменяем пропуски нулями, что удобно, когда отсутствие сканера воспринимается как «нет угроз»;StandardScaler()– приводим признаки к одинаковой шкале (среднее = 0, σ = 1), иначе логистическая регрессия будет «чувствовать» только те, у кого масштаб больше.
Сборка общей модели
Компонент ColumnTransformer объединяет два пайплайна в одну матрицу признаков, после чего к ней применяется LogisticRegression с параметрами:
- max_iter=2000 – гарантирует сходимость даже при большом числе признаков;
- C=4.0 – умеренно слабая регуляризация, повышающая гибкость модели;
- class_weight="balanced" – компенсирует дисбаланс классов, часто встречающийся в задачах по безопасности;
- multi_class="multinomial" – корректно работает с более чем двумя метками.
Оценка модели
После обучения выводятся:
- Отчёт
classification_reportс точностью, полнотой и f1‑мерой для каждого класса; - Матрица ошибок (confusion matrix) – визуализируется через
seaborn; - Примеры неверных классификаций, чтобы быстро понять характер ошибок.
Эти шаги позволяют не только проверить качество, но и «почерпнуть» идеи для дальнейшего улучшения (например, добавить новые сканеры или изменить n‑gram диапазон).
Практические рекомендации
- Контроль объёма текста. Если ваш датасет содержит очень длинные описания, экспериментируйте с
slice(0, N), где N ≈ 3000‑6000 символов – это экономит оперативную память. - Тонкая настройка TF‑IDF. Попробуйте включить
stop_words="ru"(или английский список) если в корпусе много «шумных» слов. - Балансировка классов. Вместо
class_weight="balanced"можно применить оверсэмплинг (SMOTE) или подвыборку, если класс дисбаланс слишком велик. - Гиперпараметры логистики. Поиграйте с
C(регуляция) иsolver(например,sagaдля больших разреженных матриц). - Валидация. Используйте
StratifiedKFoldили TimeSeriesSplit, если данные имеют временную зависимость. - Отладка ошибок. Анализируйте строки из блока «Sample misclassifications»: часто они указывают на недостающие признаки или на шум в метках.
Где взять исходники
Полный код, включая загрузку данных и визуализацию, доступен в репозитории GitHub:
Для более глубокого погружения в теорию TF‑IDF и логистической регрессии смотрите оригинальные статьи и документацию scikit‑learn:
Итоги
Приведённый пайплайн – хороший стартовый шаблон для задач, где нужно совместить «мягкие» (текст) и «жёсткие» (числовые метрики) признаки. С небольшими изменениями его можно применить как к анализу кода, так и к оценке уязвимостей, политик compliance или даже к классификации отзывов. Главное – держать данные чистыми, внимательно настраивать количество признаков и не забывать проверять, где модель ошибается.





















