MatLab缺少分类数据中的数据处理

时间:2012-03-05 16:05:19

标签: matlab nan

我正在尝试将我的数据集放入MATLAB [ranked,weights] = relieff(X,Ylogical,10, 'categoricalx', 'on')函数中,以对我的预测器功能的重要性进行排名。 dataset<double n*m>具有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)将所有NaN替换为随机值,例如99999,有帮助吗?通过这样做,我为所有预测器功能引入了一个新的功能状态,所以我猜它并不理想。

2)或正在用相应的特征列向量的模式替换NaN(如下所示)在统计上更有声音? (为了清晰起见,我不进行矢量化)

function [matrixdata] = replaceNaNswithModes(matrixdata)

for i=1: size(matrixdata,2)
cv= matrixdata(:,i);
modevalue= mode(cv);
cv(find(isnan(cv))) = modevalue;
matrixdata(:,i) = cv;
end

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

P.S:This link提供了处理缺失数据的可能方法。

4 个答案:

答案 0 :(得分:1)

我建议使用表而不是矩阵。 然后你有诸如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);

答案 1 :(得分:0)

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

  1. 处理每个案例的NaN
  2. 使用try catch blocks
  3. NaN就像一个数字,并没有什么不好的。即使你被NaN划分,matlab也会正确对待并给你一个NaN。

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

    1. 替换为0
    2. 替换为之前的值
    3. 替换为下一个值
    4. 替换为上一个和下一个值的平均值 还有更多。
    5. 正如您所看到的,您的问题是不适合的,并且取决于预测变量和数据源。

      如果是分类数据,例如三个类别{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循环,但我看不到任何其他方式。如您所见,我使用medianround做了一些假设。您可能希望根据您对数据的了解使用阈值。

答案 2 :(得分:0)

我认为dimension-reduction-in-categorical-data-with-missing-values中的 gd047 给出了答案:

我将调查此事,如果有人有任何其他建议或特定的MatLab实施,那么听起来会很棒。

答案 3 :(得分:0)

你可以看看这个页面http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html第一个a1a,它说分类转换为二进制。可能会工作。 (: