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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

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

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • 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?