[英]MatLab Missing data handling in categorical data
我试图将我的数据集放入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)或者用相应特征列向量的模式替换NaNs(如下所示)统计上更有声音? (为了清晰起见,我不是为了矢量化)
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)或对“分类”数据有意义的任何其他合理方式?
PS: 此链接提供了处理缺失数据的可能方法。
我建议使用表而不是矩阵。 然后你有一些函数,如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);
你可以看看这个页面http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html第一个a1a,它说分类转换为二进制。 可能会工作。 (:
首先,解决方案(1)和(2)都不能帮助您更正确地处理数据,因为NaN实际上是由Matlab正确处理的标签; 将发出警告。 你应该做的是:
NaN就像一个数字,并没有什么不好的。 即使你被NaN划分,matlab也会正确对待并给你一个NaN。
如果你仍然想要替换它们,那么你需要一个假设。 例如,如果您的数据是由引擎操作员输入的时间序列中的引擎速度,但是尚未指定某些时间实例,那么有多种方法可以处理将出现在矩阵中的NaN。
正如您所看到的,您的问题是不适合的,并且取决于预测器和数据源。
在分类数据的情况下,例如三个类别{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循环,但我看不到任何其他方式。 正如你所看到的,我通过使用median
和round
做了一些假设。 您可能希望根据您对数据的了解使用阈值。
我认为这个问题的答案是gd047在尺寸减少 - 分类 - 数据 - 缺失值中给出的 :
我将调查一下,如果有人有任何其他建议或特定的MatLab实现,那么听起来会很棒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.