Подтвердить что ты не робот

Классификаторы в scikit-learn, которые обрабатывают nan/null

Мне было интересно, есть ли классификаторы, которые обрабатывают значения nan/null в scikit-learn. Я думал, что случайный лесной регрессион справляется с этим, но я получил ошибку, когда я вызываю predict.

X_train = np.array([[1, np.nan, 3],[np.nan, 5, 6]])
y_train = np.array([1, 2])
clf = RandomForestRegressor(X_train, y_train)
X_test = np.array([7, 8, np.nan])
y_pred = clf.predict(X_test) # Fails!

Могу ли я не вызывать прогноз с любым алгоритмом scikit-learn с отсутствующими значениями?

Редактировать. Теперь, когда я думаю об этом, это имеет смысл. Это не проблема во время обучения, но когда вы прогнозируете, как вы введете ветвь, когда переменная равна нулю? возможно, вы могли бы просто разделить оба пути и усреднить результат? Кажется, что k-NN должен работать нормально, пока функция расстояния игнорирует нули.

Изменить 2 (более старый и более мудрый). Некоторые библиотеки gbm (например, xgboost) используют для этого цельное дерево вместо двоичного дерева: 2 ребенка для решения "да/нет" и 1 ребенок для отсутствующего решения. sklearn использует двоичное дерево

4b9b3361

Ответ 1

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

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

from __future__ import print_function

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer


X_train = [[0, 0, np.nan], [np.nan, 1, 1]]
Y_train = [0, 1]
X_test_1 = [0, 0, np.nan]
X_test_2 = [0, np.nan, np.nan]
X_test_3 = [np.nan, 1, 1]

# Create our imputer to replace missing values with the mean e.g.
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp = imp.fit(X_train)

# Impute our data, then train
X_train_imp = imp.transform(X_train)
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X_train_imp, Y_train)

for X_test in [X_test_1, X_test_2, X_test_3]:
    # Impute each test item, then predict
    X_test_imp = imp.transform(X_test)
    print(X_test, '->', clf.predict(X_test_imp))

# Results
[0, 0, nan] -> [0]
[0, nan, nan] -> [0]
[nan, 1, 1] -> [1]

Ответ 2

Если вы используете DataFrame, вы можете использовать fillna. Здесь я заменил недостающие данные средним значением этого столбца.

df.fillna(df.mean(), inplace=True)

Ответ 3

Короткий ответ

Иногда пропущенные значения просто не применимы. Вменять их бессмысленно. В этих случаях вы должны использовать модель, которая может обрабатывать пропущенные значения. Модели Scitkit-learn не могут обрабатывать пропущенные значения. XGBoost может.


Подробнее о scikit-learn и XGBoost

Как упоминалось в этой статье, деревья решений scikit-learn и алгоритмы KNN (пока) не достаточно устойчивы для работы с пропущенными значениями. Если вменение не имеет смысла, не делайте этого.

Рассмотрим ситуации, когда вменение не имеет смысла.

имейте в виду, что это выдуманный пример

Рассмотрим набор данных с рядами автомобилей ("Danho Diesel", "Estal Electric", "Hesproc Hybrid") и столбцами с их свойствами (вес, максимальная скорость, ускорение, выходная мощность, выброс диоксида серы, диапазон).

Электромобили не производят выхлопных газов - поэтому выбросы диоксида серы в Estal Electric должны быть NaN -value (отсутствует). Вы могли бы утверждать, что это должно быть установлено в 0 - но электромобили не могут производить диоксид серы. Вменение значения разрушит ваши прогнозы.

Как упоминалось в этой статье, деревья решений scikit-learn и алгоритмы KNN (пока) не достаточно устойчивы для работы с пропущенными значениями. Если вменение не имеет смысла, не делайте этого.

Ответ 4

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