python - scikit-learn 中处理 nan/null 的分类器

标签 python pandas machine-learning scikit-learn nan

我想知道在 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 算法调用 predict 吗?

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

编辑 2(年长且聪明的我) 一些 gbm 库(例如 xgboost)正是为此目的使用三叉树而不是二叉树:2 个 child 用于是/否决策,1 个 child 用于缺失决策。 sklearn 是 using a binary tree

最佳答案

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

我刚刚选择了一种策略,使用 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]

关于python - scikit-learn 中处理 nan/null 的分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30317119/

相关文章:

r - glmnet 模型性能与 boosting 算法的比较

python - 在 Python 中读取大文件 (52mb) 的行,是迭代行还是使用 readlines 更好?

python - 关于优化流程的建议 - JSON -> pandas -> csv 和 MySQL

python - 使用 ctypes 在 Python 中使用 Rust 返回的数组

python - 提高 pandas 数据框的性能

时间序列累积和的 Pythonic 代码

python - 如何对某些十进制数据应用 scikit-learn 逻辑回归?

r - 如何确定列是定量数据还是分类数据?

python HTMLParser 替换html文件数据中的一些字符串

python - 推送到开发时遇到 GAE 错误