Рубрики
Без рубрики

Как лучше обрабатывать недостающие данные – учебник Scikit -Learn

Почему уборка данных важна? Данные из реального мира часто грязные и убирают … Теги с питоном, машинным обучением, наукой данных, новичками.

Почему уборка данных важна?

Данные из реального мира часто являются грязными, а очистка данных – это неотъемлемый шаг в любом проекте машинного обучения. Чтобы обеспечить оптимальную производительность модели, очистка данных важна, поскольку алгоритмы машинного обучения чувствительны к качеству данных, которые мы питаем.

Работа с отсутствующими данными, экспериментируя с стратегии оптимального вменения и обеспечение того, чтобы данные были готовы для использования в остальной части трубопровода, поэтому важно.

В этом сообщении мы увидим полезные функции Scikit-learn Это помогает нам справиться с пропущенными данными еще более изящно! В целом, как мы обрабатываем отсутствующие значения во входных данных? Ниже приведены обычные подходы.

  • Сбрасывая столбцы, содержащие NANS.
  • Сбрасывая ряды, содержащие NANS.
  • Введением пропущенных значений соответствующим образом.

Разве не было бы круто, если бы мы могли сделать следующее?

  • Кодируйте «пропавность» как функцию.
  • Используйте HistradientBoostingClassifier что автоматически вносит недостаток пропущенных значений.

Кодирование «пропущенности» как функции

При введении пропущенных значений, если мы хотим сохранить информацию о том, какие значения отсутствуют, и хотели бы использовать это в качестве функции, то мы можем сделать это, установив add_indicator атрибут в Scikit-learn’s SimpleImputer к Верно Анкет Вот пример. Давайте импортируем Numpy и Pandas, используя свои обычные псевдонимы np и PD Анкет

# Necessary imports
import numpy as np
import pandas as pd

Давайте создадим Pandas DataFrame X с одним отсутствующим значением.

X = pd.DataFrame({'Age':[20, 30, 10, np.nan, 10]})

Теперь мы импортируем SimpleImputer от Scikit-learn

from sklearn.impute import SimpleImputer

Теперь мы создадим создание SimpleImputer что по умолчанию делает Среднее вменение , заменив все пропущенные значения на среднее значение других присутствующих значений. Отсутствующее значение рассчитывается как.5. Давайте подтвердим вывод.

# Mean Imputation
imputer = SimpleImputer()
imputer.fit_transform(X)

# After Imputation
array([[20. ],
       [30. ],
       [10. ],
       [17.5],
       [10. ]])

Чтобы кодировать отсутствие значений в качестве функции, мы можем установить add_indicator Аргумент Верно и соблюдать выход.

# impute the mean and add an indicator matrix (new in scikit-learn 0.21)
imputer = SimpleImputer(add_indicator=True)
imputer.fit_transform(X)

# After adding missingness indicator
array([[20. ,  0. ],
       [30. ,  0. ],
       [10. ,  0. ],
       [17.5,  1. ],
       [10. ,  0. ]])

На выходе мы наблюдаем, что значение индикатора 1 вставлено в индексе 3, где исходные данные отсутствовали. Эта функция новая в Scikit-learn Версия 0,21 и выше. В следующем разделе мы посмотрим, как мы можем использовать HistradientBoosting Classifier Это изначально обрабатывает отсутствующие значения.

Использование классификатора HistGradientBoosting

Чтобы использовать эту новую функцию в Scikit-learn Версия 0.22 и выше, давайте скачаем очень популярное обучение титанико-машине из набора данных о бедствиях от Kaggle.

import pandas as pd
train = pd.read_csv('http://bit.ly/kaggletrain')
test = pd.read_csv('http://bit.ly/kaggletest', nrows=175)

Теперь, когда мы импортировали набор данных, давайте продолжим и создадим наборы данных для обучения и тестирования.

train = train[['Survived', 'Age', 'Fare', 'Pclass']]
test = test[['Age', 'Fare', 'Pclass']]

Чтобы лучше понять пропущенные значения, давайте вычислим количество пропущенных значений в каждом столбце обучающих и тестов.

# count the number of NaNs in each column
print(train.isna().sum())

Survived 0
Age 177
Fare 0
Pclass 0
dtype: int64

print(test.isna().sum())

Age 36
Fare 1
Pclass 0
dtype: int64

Мы видим, что подмножествами поезда и тестирование содержат недостающие значения. Пусть выходной метка для классификатора будет Выжил Указано 1 Если пассажир выжил и 0 Если пассажир этого не сделал.

label = train.pop('Survived')

Давайте импортируем HistradientBoostingClassifier от Scikit-learn.

from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier

Как всегда, давайте создаем экземпляры классификатора, вписывайтесь на тренировочный набор и предсказаны в тесте тестового набора. Обратите внимание, что мы не впитывали пропущенные значения; В идеале, когда отсутствуют значения, мы получаем ошибки. Давайте проверим, что сейчас происходит.

clf = HistGradientBoostingClassifier()
# no errors, despite NaNs in train and test sets!
clf.fit(train, label)
clf.predict(test)

# Output
array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0,

       1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,

       1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0,

       1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1,

       0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

       0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,

       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0,

       0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])

Удивительно, но ошибок нет, и мы получаем прогнозы для всех записей в тестовом наборе, даже если не хватает значений. Разве это не круто? Обязательно попробуйте эти функции в вашем следующем проекте. Счастливого обучения!

Рекомендации

[1] Полезные советы Scikit-learn от Кевина Маркхэма из Dataschool

Изображение обложки: Фотография Эндрю Нил на Неспособный

Оригинал: “https://dev.to/balapriya/having-trouble-with-missing-data-here-s-how-you-can-handle-them-better-42d6”