scikit-learn中处理nan / null的分类器
machine-learning
pandas
python
scikit-learn
5
0

我想知道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!

我不能使用任何缺少值的scikit-learn算法调用预测吗?

编辑。现在我考虑一下,这是有道理的。在训练期间这不是问题,但是当您预测变量为null时如何分支时?也许您可以同时拆分两种方法并取平均结果?只要距离函数忽略空值,似乎k-NN应该可以正常工作。

编辑2(较老和明智)一些gbm库(例如xgboost)正是出于此目的而使用三叉树而不是二叉树:2个子代用于yes / no决策,1个子代用于缺失的决策。 sklearn正在使用二叉树

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

df.fillna(df.mean(), inplace=True)
收藏
评论

简短答案

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


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

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

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

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

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

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

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

收藏
评论

我举了一个既包含训练中缺失值又包含测试集的示例

我只是使用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]
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号