我正在尝试将我的数据集放入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提供了处理缺失数据的可能方法。
答案 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正确处理的标签;将发出警告。你应该做的是:
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
做了一些假设。您可能希望根据您对数据的了解使用阈值。
答案 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,它说分类转换为二进制。可能会工作。 (: