我想知道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个孩子用于“是/否”决定,1个孩子用于缺失的决定。sklearn正在使用二叉树
我做了一个例子,其中包含训练中缺少的值和测试集
我只是使用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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句