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

+1 440новых вакансий за сутки·54 706вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 748
  • Облачные технологии6 616
  • QA вакансии2 169
  • Android1 320
  • Инженер данных872
  • Продакт-менеджер302

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

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

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

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

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 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?