Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 091новая вакансия за сутки·93 764вакансии открыты сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 271
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 221
  • Облачные технологии14 173
  • QA вакансии3 456
  • Backend вакансии2 115
  • Инженер данных1 800
  • Продакт-менеджер1 245

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии995
  • AI вакансии955
  • Frontend вакансии754
  • Mobile вакансии43

По стеку

  • Go8 752
  • Java6 590
  • Node.js2 035
  • .NET1 738
  • Kotlin1 618
  • Rust1 473
  • C#718
  • PHP690
  • C++578

DevOps и инфраструктура

  • Kubernetes7 785
  • DevOps вакансии6 096
  • Linux-инфраструктура5 503
  • Terraform / IaC4 288
  • CI/CD3 274
  • Мониторинг и Observability1 791
  • SRE566
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 137
  • Бизнес-аналитик921
  • Аналитик данных859
  • Системный аналитик154

Другие направления

  • Проджект-менеджер621
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 139
  • Вакансии в Европе24 006
  • Вакансии в Канаде4 530
  • Работа в России3 849

По формату

  • Удалённые вакансии74 946
  • Релокация в США44 134
  • Гибридная работа12 477
  • Офисная работа7 085

По уровню

  • Senior вакансии42 613
  • Middle вакансии20 946
  • Junior вакансии6 708

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме scikit-learnВсе вопросы
scikit-learnMiddleКодинг

Как обрабатывать пропущенные значения в scikit-learn с помощью SimpleImputer и IterativeImputer?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SimpleImputer заполняет NaN одним статистическим значением (mean/median/most_frequent/constant), вычисленным при fit; IterativeImputer моделирует каждый признак по остальным итеративно — точнее при MCAR/MAR, но медленнее и чувствительнее к порядку признаков.

SimpleImputer: быстрое заполнение одним значением

SimpleImputer вычисляет одну статистику (mean, median, most_frequent, constant) на обучающей выборке и заменяет все NaN этим значением. Это stateless после fit: при transform используются только сохранённые statistics_.

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer, IterativeImputer
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# Синтетический датасет с пропусками
np.random.seed(42)
n = 1000
df = pd.DataFrame({
    "age":     np.random.randint(18, 65, n).astype(float),
    "income":  np.random.exponential(50000, n),
    "tenure":  np.random.randint(0, 20, n).astype(float),
    "country": np.random.choice(["US", "DE", "BR", "IN"], n),
    "plan":    np.random.choice(["free", "pro", "enterprise"], n),
})
y = (df["income"] > 60000).astype(int)

# Вносим пропуски
for col in ["age", "income", "tenure"]:
    mask = np.random.rand(n) < 0.15  # 15% NaN
    df.loc[mask, col] = np.nan

X_train, X_test, y_train, y_test = train_test_split(
    df, y, test_size=0.2, stratify=y, random_state=42
)

# SimpleImputer в Pipeline
num_cols = ["age", "income", "tenure"]
cat_cols = ["country", "plan"]

preprocessor = ColumnTransformer([
    ("num", Pipeline([
        ("impute", SimpleImputer(strategy="median")),  # median устойчив к выбросам
        ("scale",  StandardScaler()),
    ]), num_cols),
    ("cat", Pipeline([
        ("impute", SimpleImputer(strategy="most_frequent")),
        ("encode", OneHotEncoder(handle_unknown="ignore", sparse_output=False)),
    ]), cat_cols),
])

pipeline = Pipeline([
    ("prep", preprocessor),
    ("clf",  HistGradientBoostingClassifier(random_state=42)),
])
pipeline.fit(X_train, y_train)

# Проверяем сохранённые статистики
simple_imp = pipeline.named_steps["prep"].named_transformers_["num"].named_steps["impute"]
print("statistics_ (median):", simple_imp.statistics_)  # array с медианами по каждому признаку

y_pred = pipeline.predict(X_test)
print(classification_report(y_test, y_pred))

IterativeImputer: мультивариантное восстановление

IterativeImputer моделирует каждый признак как функцию остальных признаков. На каждой итерации для каждого столбца с NaN обучается регрессор (по умолчанию BayesianRidge) на строках без пропусков и предсказывает пропущенные значения. Процесс повторяется max_iter раз до сходимости.

from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
from sklearn.experimental import enable_iterative_imputer  # обязательный импорт

# IterativeImputer только для числовых признаков
iter_imputer = IterativeImputer(
    estimator=BayesianRidge(),  # внутренний регрессор
    max_iter=10,                # число раундов
    initial_strategy="mean",    # инициализация NaN перед первой итерацией
    imputation_order="ascending",  # по возрастанию доли NaN
    random_state=42,
    verbose=0,
)

# Только числовые колонки
X_num_train = X_train[num_cols].values
X_num_test = X_test[num_cols].values

iter_imputer.fit(X_num_train)
X_num_imputed = iter_imputer.transform(X_num_test)
print("NaN после IterativeImputer:", np.isnan(X_num_imputed).sum())  # 0

# В полном пайплайне:
preprocessor_iter = ColumnTransformer([
    ("num", Pipeline([
        ("impute", IterativeImputer(max_iter=10, random_state=42)),
        ("scale",  StandardScaler()),
    ]), num_cols),
    ("cat", Pipeline([
        ("impute", SimpleImputer(strategy="most_frequent")),
        ("encode", OneHotEncoder(handle_unknown="ignore", sparse_output=False)),
    ]), cat_cols),
])

pipeline_iter = Pipeline([
    ("prep", preprocessor_iter),
    ("clf",  HistGradientBoostingClassifier(random_state=42)),
])
pipeline_iter.fit(X_train, y_train)

KNNImputer как альтернатива

from sklearn.impute import KNNImputer

# Заполняет NaN средним по k ближайшим соседям в пространстве признаков
knn_imp = KNNImputer(n_neighbors=5, weights="distance")
X_knn = knn_imp.fit_transform(X_num_train)

# MissingIndicator: добавляем бинарный признак «был ли NaN»
from sklearn.impute import MissingIndicator
from sklearn.pipeline import FeatureUnion

indicator = MissingIndicator(features="missing-only")
indicator.fit(X_num_train)
print("Признаки с NaN:", indicator.features_)  # индексы столбцов с пропусками

Подводные камни

  • enable_iterative_imputer нужно импортировать явно — без него from sklearn.impute import IterativeImputer вызывает ImportError.
  • SimpleImputer(strategy='mean') не работает на строковых колонках; для категориальных используйте 'most_frequent' или 'constant'.
  • IterativeImputer вызывает fit внутреннего регрессора на каждой итерации для каждого признака — при большом числе признаков и max_iter=10 время fit резко растёт.
  • Если fit вызван на данных без NaN, SimpleImputer сохраняет статистики но не создаёт проблем; однако при transform с NaN применит сохранённые значения — это ожидаемое, не ошибочное поведение.
  • IterativeImputer не поддерживает категориальные признаки напрямую; передавайте только числовые или используйте OrdinalEncoder перед импутацией.
  • При использовании MissingIndicator внутри Pipeline позиция трансформера важна: индикатор должен видеть исходные NaN до импутации.
  • SimpleImputer возвращает numpy array, не DataFrame — имена столбцов теряются; оборачивайте в ColumnTransformer или используйте set_output(transform='pandas') (sklearn >= 1.2).
  • Лечение MNAR (Missing Not At Random) импутацией приводит к bias: если пропуск сам по себе несёт информацию (например, пациент не измерял давление именно при гипертонии), добавляйте бинарный индикатор через MissingIndicator.

Типичные ошибки

  • Объяснять imputers missing values только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

Что проверяет интервьюер

  • Может ли связать imputers missing values с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

Как вы знаете этот вопрос?

Проверить себя по теме scikit-learn →

Источники

  • https://scikit-learn.org/stable/modules/impute.html
←Предыдущий вопросПредставьте, pipeline на scikit-learn даёт хорошие результаты в dev, но плохо работает на новых данных. Как вы будете разбираться?Следующий вопрос→Как проверять корректность решения на scikit-learn, а не только успешное выполнение кода?

Связанные темы

scikit-learndata-aievaluationmodel-training

Вакансии с этим навыком

  • 📑 Вакансия Junior Data Scientist / ML Engineer

Частые вопросы на собеседовании

  • В чём разница между train_test_split() и кросс-валидацией (cross_val_score)? Когда применять каждый из них?
  • Как работает Pipeline в scikit-learn и какие проблемы он решает (утечка данных — data leakage)?
  • Какие метрики применять для задачи классификации с несбалансированными классами и как их вычислить в scikit-learn?
  • Как обнаружить и предотвратить утечку данных (data leakage) при построении пайплайна в scikit-learn?