假设我有一个训练数据集,其中包含两个数字特征 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 上训练分类器,而仅使用 n - m 个样本在特征 B 上训练相同的分类器 样本。当然,两者都会产生标准评估指标,但我不能再直接比较它们,或者可以吗?
如果我估算缺失值,我会得到相同数量的样本。但如果有很多缺失值,那么这本身就是一个问题,因为数据变得不太可靠。
我现在的问题是,如何对在不丢失数据的特征上训练的分类器与在有(可能很多)丢失数据的特征上训练的分类器进行实际比较?
非常感谢任何帮助!
最佳答案
您可以用静态数字替换所有 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值)
关于machine-learning - 如何比较基于缺失数据的特征训练的分类器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170086/