【发布时间】:2018-03-19 15:26:35
【问题描述】:
我在 Matlab 中使用 Weka for API,遇到了问题..
我想在我的“测试”文档的属性中添加一个值:
@relation test.txt-weka.filters.unsupervised.attribute.NumericToNominal-Rlast
@attribute att_2 numeric
@attribute att_2 numeric
@attribute att_3 {0,1}
@data
我想在 att_3 中添加 '2' 这个值,例如:@attribute att_3 {0,1,2}
我试图指挥:
test.attribute(2).addStringValue(2)
要么
test.attribute(2).addStringValue('2')
这两个都错了.. 谁能帮帮我:(
下面是我的代码 参考How to retrieve class values from WEKA using MATLAB
%# Set paths
WEKA_HOME = 'C:\Program Files\Weka-3-8';
javaaddpath([WEKA_HOME '\weka.jar']);
import weka.cores.meta.MatlabLoader.*;
%# load dataset
load mydata
X = feas;
Y = grp2idx(species);
%# 10-fold crossvalidation
k=10;
cvFolds = crossvalind('Kfold', species, k); %# get indices of 10-fold CV
cp = classperf(species);
for i = 1:k
testIdx = (cvFolds == i);
trainIdx = ~testIdx;
xtrain = feas(trainIdx,:);
ytrain = species(trainIdx);
xtest = feas(testIdx,:);
ytest = species(testIdx);
train = [xtrain ytrain];
test = [xtest ytest];
save train.txt train -ascii
save test.txt test -ascii
fName = 'train.txt';
loader = weka.core.converters.MatlabLoader();
loader.setFile( java.io.File(fName) );
train = loader.getDataSet();
train.setClassIndex( train.numAttributes()-1 );
fName = 'test.txt';
loader = weka.core.converters.MatlabLoader();
loader.setFile( java.io.File(fName) );
test = loader.getDataSet();
test.setClassIndex( test.numAttributes()-1 );
%# convert last attribute (class) from numeric to nominal
filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(train);
train = filter.useFilter(train, filter);
filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(test);
test = filter.useFilter(test, filter);
%# train J48 tree
classifier = weka.classifiers.trees.J48();
classifier.setOptions( weka.core.Utils.splitOptions('-O -B -J -A -S -M 1') );
classifier.buildClassifier( train );
%# classify test instances
numInst = test.numInstances();
pred = zeros(numInst,1);
predProbs = zeros(numInst, train.numClasses());
for i=1:numInst
pred(i) = classifier.classifyInstance( test.instance(i-1) );
end
for i=1:numInst
predProbs(i,:) = classifier.distributionForInstance( test.instance(i-1) );
end
eval = weka.classifiers.Evaluation(train);
eval.evaluateModel(classifier, test, javaArray('java.lang.Object',1));
disp( char(eval.toSummaryString()) )
end
我的数据集包含31个数据,每个数据有两个属性和一个类。
我的数据集类包含三个值:“0”或“1”或“2”。只有 4 个数据属于 '2' 类,其他 27 个数据属于 '0' 或 '1' 类。
当我使用 10 折交叉验证时,运行代码时只有少数折(大约 4 折)不会出错。
但其余的(6 折)都会显示错误消息: “下标分配尺寸不匹配。” 跑步时
for i=1:numInst
predProbs(i,:) = classifier.distributionForInstance( test.instance(i-1) );
end
首先我不知道为什么,然后我发现这 6 个折叠不包含“测试数据”中“2”类的数据。他们的“测试数据”中只有“0”或“1”类的数据,“训练数据”中只有“0”、“1”、“2”类的数据。
并且可以成功运行的折叠在其“测试数据”中包含“2”类中的数据。
那些在“测试”节目中不包含“2”类的节目
@relation test.txt-weka.filters.unsupervised.attribute.NumericToNominal-Rlast
@attribute att_1 numeric
@attribute att_2 numeric
@attribute att_3 {0,1}
@data
864.86315,40.15,0
1396.0296,36.263158,0
249.6065,71.5,1
所以,我想知道是否应该在@attribute att_3 {0,1} 中添加“2”来解决问题。或者问题不是这个?
【问题讨论】:
标签: matlab filter attributes weka