MatLab在分类数据中的缺失数据处理

MatLab在分类数据中的缺失数据处理,matlab,nan,Matlab,Nan,我试图将我的数据集放入MATLAB[ranked,weights]=relieff(X,y逻辑,10,'categoricalx','on')函数中,以对预测功能的重要性进行排序。dataset具有n观察值和m离散(即分类)特征。我的数据集中的每个观察值(行)都至少有一个NaN值。这些NAN表示数据集中未观察到的预测值,即缺失或为空。(数据集中没有损坏,只是不完整。) relieff()使用下面的函数删除包含NaN的任何行: function [X,Y] = removeNaNs(X,Y) %

我试图将我的数据集放入MATLAB
[ranked,weights]=relieff(X,y逻辑,10,'categoricalx','on')
函数中,以对预测功能的重要性进行排序。
dataset
具有
n
观察值和
m
离散(即分类)特征。我的数据集中的每个观察值(行)都至少有一个NaN值。这些NAN表示数据集中未观察到的预测值,即缺失或为空。(数据集中没有损坏,只是不完整。)

relieff()使用下面的函数删除包含NaN的任何行:

function [X,Y] = removeNaNs(X,Y)
% Remove observations with missing data
NaNidx = bsxfun(@or,isnan(Y),any(isnan(X),2));
X(NaNidx,:) = [];
Y(NaNidx,:) = [];
这并不理想,特别是对于我的情况,因为它留给我的是
X=[]
Y=[]
(即没有观察!)

在这种情况下:

1)用随机值(例如99999)替换所有NaN是否有帮助?通过这样做,我为所有预测器特性引入了一个新的特性状态,所以我想这并不理想

2)或者用相应的特征列向量(如下所示)的模式替换NAN在统计上更可靠?(我不是为了清晰起见而进行矢量化)

3)或任何其他对“分类”数据有意义的合理方式


注:给出了处理缺失数据的可能方法。

首先,solutiona(1)和(2)都不能帮助您更正确地处理数据,因为NaN实际上是一个标签,由Matlab适当处理;警方会发出警告。你应该做的是:

  • 处理每个案例的NAN
  • 使用try-catch块
  • NaN就像一个数字,没有什么不好的。即使你除以NaN,matlab也会正确处理它并给你一个NaN

    如果你仍然想替换它们,那么你需要一个成立的假设。例如,如果您的数据是发动机操作员输入的时间序列中的发动机转速,但某些时间实例尚未指定,则有多种方法可以处理将出现在矩阵中的NaN

  • 替换为0
  • 替换为以前的值
  • 替换为下一个值
  • 替换为上一个值和下一个值的平均值 还有更多
  • 正如您所见,您的问题是不适定的,并且取决于预测器和数据源

    对于分类数据,例如三个类别{0,1,2},假设NaN出现在Y中

    for k=1:size(Y,2)
      [ id ]=isnan(Y(:,k);
      m(k)=median(Y(~id),k);
      Y(id,k)=round(m(k));
    end
    

    我感到很遗憾,我不得不写一个for循环,但我看不到任何其他方法。正如你所看到的,我通过使用
    中值
    四舍五入
    做了一些假设。根据您对数据的了解程度,您可能需要使用阈值。

    我认为gd047中给出了答案:


    我将对此进行研究,如果有人有任何其他建议或特定的MatLab实现,那将非常高兴听到。

    您可以看看这一页,第一页是a1a,上面说将范畴转换为二进制。可能有用。(:

    我建议用表格代替矩阵。 然后,您可以使用ismissing(用于整个表)和isundefined等函数来处理类别变量的缺失值

    T = array2table(matrix);
    T = standardizeMissing(T);  % NaN is standard for double but this 
                                % can be useful for other data type
    var1 = categorical(T.var1);
    missing = isundefined(var1);
    T = T(missing,:);           % removes lines with NaN
    matrix = table2array(T);
    

    我的第一个问题是为什么
    NaN
    s出现在您的数据中?这是数据集的损坏,还是一种可以解释的现象?这是一个手动输入的数据集,而NaN是由于输入数据的人员遗漏造成的。数据集中没有损坏;但是,它是稀疏的。您好,您的建议(1-4)适用于真实/连续数据。我指定数据为“分类”(即名义数据,甚至不是序数数据)要强调的是,简单的插值或平滑在这种情况下并不能解决问题。你能详细说明你的建议吗?@Berkan,嗨,从描述中我不清楚NaN是如何发生的。但通常发生在0/0、inf/inf中,或者如果你的输入数据缺少值。我想在你的情况下它是0/0,inf/inf。我之所以不建议这样做,是因为您没有提供有关预测值的足够详细信息。不过,假设您对此了解得更多是安全的。一种可能的策略是为每列取中位数(不带NaN)然后用每列的中位数替换NaN。另一种方法是取平均值,或随机值;取决于预测值。对不起,我应该在一开始就澄清它(我现在将其添加到问题主体中,并且我正在更改问题的标题)。在我的情况下,NaN表示缺失(未观察到)数据集中的值。我研究过用均值/中位数/模式插补替换它们的选项,但感觉不好。我也在几个地方读到过这是一种不好的做法。有一篇参考文献建议使用最大可能性或多重插补,但我仍在努力掌握它。@Berkan Mean在数据是iid高斯分布的。虽然如果你有这方面的知识,你不需要一个预测器。我怀疑,尽管这是一个编程问题。问题是你必须替换它,或者处理它,这取决于你自己决定。你如何做,尽管在上面的代码中,你可以适当地替换
    中值。
    
    T = array2table(matrix);
    T = standardizeMissing(T);  % NaN is standard for double but this 
                                % can be useful for other data type
    var1 = categorical(T.var1);
    missing = isundefined(var1);
    T = T(missing,:);           % removes lines with NaN
    matrix = table2array(T);