scikit中的分类器 - 学习处理nan/null

ant*_*ell 38 python machine-learning nan pandas scikit-learn

我想知道在scikit-learn中是否存在处理nan/null值的分类器.我以为随机森林回归器处理这个,但是当我打电话时我收到了一个错误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!
Run Code Online (Sandbox Code Playgroud)

我是否可以使用缺少值的任何scikit-learn算法调用预测?

编辑. 现在我想到这一点,这是有道理的.这在训练期间不是问题,但是当你预测变量为空时如何分支?也许你可以分开两种方式并平均结果?只要距离函数忽略空值,k-NN似乎应该可以正常工作.

编辑2(更老,更聪明) 一些gbm库(例如xgboost)正是为了这个目的而使用三元树而不是二叉树:2个孩子用于是/否决定,1个孩子用于缺失决策.sklearn正在使用二叉树

bak*_*kal 27

我做了一个示例,其中包含训练和测试集中的缺失值

我刚刚选择了一种策略,用平均值替换缺失的数据,使用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]
Run Code Online (Sandbox Code Playgroud)

  • 当值真的是标签而不是连续时,你如何处理这种情况? (10认同)
  • 好吧,这是有意义的.但是,如果没有任何影响,必须处理nans的RandomForest呢? (9认同)
  • 用于许多数据集的超粗略方法,特别是在数据不随机丢失或丢失率非常高的情况下. (3认同)
  • 我真的很想知道插补对分类数据的作用. (2认同)

For*_*ver 10

如果您使用的是 DataFrame,则可以使用fillna. 在这里,我用该列的平均值替换了缺失的数据。

df.fillna(df.mean(), inplace=True)
Run Code Online (Sandbox Code Playgroud)


Dan*_*nny 10

简短答案

有时,缺失值根本不适用。估算它们是没有意义的。在这些情况下,您应该使用可以处理缺失值的模型。Scitkit-learn的模型无法处理缺失值。XGBoost可以。


有关scikit-learn和XGBoost的更多信息

正如提到的这篇文章中,scikit学习的决策树和KNN算法是不是()足够强大的与缺失值的工作。如果插补没有意义,请不要这样做。

当插补没有意义时,请考虑使用插补。

请记住,这是一个虚构的例子

考虑一个数据集,其中包含汽车行(“ Danho Diesel”,“ Estal Electric”,“ Hesproc Hybrid”)和具有属性(重量,最高速度,加速度,功率输出,二氧化硫排放,范围)的列。

电动汽车不会产生烟气-因此Estal Electric的二氧化硫排放量应为a 值(缺失)NaN。您可能会争辩说应将其设置为0-但电动汽车无法产生二氧化硫。估算价值会破坏您的预测。

正如提到的这篇文章中,scikit学习的决策树和KNN算法是不是()足够强大的与缺失值的工作。如果插补没有意义,请不要这样做。