Почему уборка данных важна?
Данные из реального мира часто являются грязными, а очистка данных – это неотъемлемый шаг в любом проекте машинного обучения. Чтобы обеспечить оптимальную производительность модели, очистка данных важна, поскольку алгоритмы машинного обучения чувствительны к качеству данных, которые мы питаем.
Работа с отсутствующими данными, экспериментируя с стратегии оптимального вменения и обеспечение того, чтобы данные были готовы для использования в остальной части трубопровода, поэтому важно.
В этом сообщении мы увидим полезные функции 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”