machine-learning - 如何比较基于缺失数据的特征训练的分类器?

标签 machine-learning classification missing-data feature-selection

假设我有一个训练数据集,其中包含两个数字特征 AB 以及 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个缺失值(显示为NaNm> 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/

相关文章:

java - 如何为属性添加标称值?

python - 将数值映射到字符串

csv - Weka 对 CSV 的预测

r - kmeans 分类到预定的质心

c++ - QTableWidget省略了一些items,items被创建但被忽略

python - 你如何在 mxnet 中连接符号

python - tensorflow 错误 : 'FileWriter' method

r - 了解 ROCR 的 performance() 函数返回的内容 - 在 R 中的分类

python - 处理分类中稀有因子水平的一般策略?

python - PySpark Dataframe 前向填充所有列