假设我有一个训练数据集,其中包含两个数字特征 A 和 B 和 n 样本,它们均以二进制形式标记(二进制分类问题)。
A B Label
-------- -----
0 0.1 0.9 x
1 0.7 NaN x
2 0.3 NaN y
3 0.1 0.2 x
...
n 0.1 0.3 y
还假定特征 A 没有缺失值,而特征 B 包含 m 缺失值(显示为NaN
, m > 0)。
现在,我想分别针对每个功能训练一个分类器,以查看哪个效果最好。为了进行比较,我使用从混淆矩阵得出的标准评估指标。
问题是 scikit learning 之类的某些框架不允许NaN
值,因此我必须通过丢弃它们或通过插值来摆脱它们。
比方说,我丢弃了功能 B 的所有 m NaN
个值。然后,我用 n 个样本在特征 A 上训练了一个分类器,而我只用 n-m在特征 B 上训练了一个分类器示例。当然,两者都能产生标准的评估指标,但我不能再直接比较它们了,或者可以吗?
如果我估算缺失值,则会得到相同数量的样本。但是,如果缺少许多值,那么由于数据变得不那么可靠,这本身就是一个问题。
我现在的问题是,如何对一个在特征上训练过的分类器进行合理的比较,而该分类器在没有数据丢失的情况下与一个在特征上训练过的分类器在 (可能有很多)缺失数据上进行比较?
非常感谢您的帮助!
答案 0 :(得分:1)
您可以用静态数字替换所有NaN值,然后在其上运行单变量特征选择器。具体:
为每个单独的变量建立一个预测模型,并评估每个模型的性能
示例:
from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
cv=ShuffleSplit(len(X), 3, .3))
scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))
因此,您可以大致了解每个变量的性能如何影响目标变量(知道您已替换了功能性NaN值之一)
答案 1 :(得分:0)
缺少值是一个常见问题,正如您所提到的,有几种方法可以解决此问题。 当您尝试替换一些任意值时,确实存在问题。 NaN通常用0或列均值代替,但这取决于数据表示的内容。 对于您而言,一种方法是,如果只有一列缺少数据,则使用ML预测这些值,但这仍然取决于数据的敏感性。