如何将在特征上训练的分类器与缺失数据进行比较?
Posted
技术标签:
【中文标题】如何将在特征上训练的分类器与缺失数据进行比较?【英文标题】:How to compare classifiers trained on features with missing data? 【发布时间】:2018-12-12 16:24:06 【问题描述】:假设我有一个训练数据集,其中包含两个数字特征 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 learn 之类的框架不允许 NaN
值,所以我必须通过丢弃它们或通过估算值来摆脱它们。
假设我丢弃了特征 B 的所有 m NaN
值。然后我用 n 个样本在特征 A 上训练分类器,而我在特征 B 上只用 n - m 训练相同的分类器 样本。当然,两者都产生标准的评估指标,但我不能再直接比较它们,或者我可以吗?
如果我估算缺失值,我会得到相同数量的样本。但是如果有很多缺失值,那么这本身就是一个问题,因为数据变得不那么可靠了。
我现在的问题是如何对一个在特征上训练而没有丢失数据的分类器与一个在特征有(可能很多)缺失数据的特征上训练的分类器进行实际的比较?
非常感谢任何帮助!
【问题讨论】:
您可以尝试将 Nans 替换为与列中其他值相同类型但仍然不同的固定值(例如,如果您的列是范围为 0-10 的数字,则输入 -10 或100 的缺失值)。这样,您就迫使模型将这些值与其他值有些不同(当然这取决于模型)。如果您想使用缺失值的行,这是您必须做出的权衡之一。无论如何,由于这个问题不是关于编程,而是算法方法,Cross-validation 会更好。 【参考方案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 值)
【讨论】:
【参考方案2】:缺失值是一个常见问题,正如您所提到的,有几种方法可以解决这个问题。 当您尝试替换一些任意值时确实存在问题。 通常 NaN 被 0 或列均值代替,但这取决于数据代表的内容。 在您的情况下,如果只有一列缺少数据,一种方法可能是使用 ML 预测这些值,但这仍然取决于您的数据的敏感程度。
【讨论】:
以上是关于如何将在特征上训练的分类器与缺失数据进行比较?的主要内容,如果未能解决你的问题,请参考以下文章
当给定特定类的 0 个样本时,如何对不平衡的数据集进行分类?
深度学习笔记:利用预训练模型之特征提取训练小数据集上的图像分类器