我有一个arff文件,在我的java代码中用作训练集。其中的所有属性都是名义上的。问题是当我从数据库中检索我的数据时,它作为测试数据;为标称属性生成的标题对于列车和测试集来说有点不同。这会导致预测器出现问题。例如,标题可以如下:
&#xA;&#xA;在训练集&#xA; @attribute study_hrs {0,1,2,3,4,5} < / code>
在测试集&#xA; @attribute study_hrs {3,2,1,0,4,5}
正如您所看到的那样,它在逻辑上是相同的值,但序列不同。但我怎么能解决这个问题。我必须动态地从数据库中获取测试数据,我无法创建一个arff文件。
&#xA;&#xA;以下是我的代码片段:
&#xA;&#xA; public static Instances dBDataInstances(String dbQuery,String user,String pass)抛出异常{&#xA; InstanceQuery query = new InstanceQuery();&#xA; query.setUsername(用户);&#XA; query.setPassword(PASS);&#XA; query.setQuery(的DBQuery);&#XA; //你可以声明你的数据集稀疏&#xA; // query.setSparseData(true);&#xA; Instances data = query.retrieveInstances();&#xA;返回数据;&#xA; }&#XA;&#XA; .......&#XA; .......&#xA;&#xA; public static void main(String [] args)抛出异常{&#xA; BufferedReader datafile = readDataFile(“AnalyKT.arff”);&#xA; //培训数据&#xA; Instances dataKT = new Instances(datafile);&#xA; dataKT = convertNumericToNominal(dataKT);&#XA; dataKT = convertStringToNominal(dataKT);&#XA; dataKT.setClassIndex(dataKT.numAttributes() - 3);&#xA;&#xA;&#xA;&#xA;分类器nB1 =新的NaiveBayes();&#xA;评估评估=新评估(dataKT);&#xA; eval.crossValidateModel(nB1,dataKT,10,new Random(1));&#xA; System.out.println(“Estimated Accuracy:”+ Double.toString(eval.pctCorrect()));&#xA;&#xA; //训练一个新的分类器&#xA;分类器nB2 = new NaiveBayes();&#xA; nB2.buildClassifier(dataKT); //使用此模型预测&#xA;&#xA; String query =“选择Student.rollno为rollno,study_hrs,health,..............”;&#xA;实例testKtData = dBDataInstances(查询,“root”,“root”);&#xA;&#xA; testKtData = convertNumericToNominal(testKtData);&#XA; testKtData = convertStringToNominal(testKtData);&#XA;&#XA; testKtData.setClassIndex(testKtData.numAttributes() - 3);&#xA;的System.out.println( “” + testKtData.numAttributes()+ “ - ” + dataKT.numAttributes()+ “ - ” + dataKT.equalHeadersMsg(testKtData));&#XA; eval.evaluateModel(nB2,testKtData);&#xA;&#xA; System.out.println(eval.toSummaryString(“\ nResults \ n ====== \ n”,false));&#xA; }&#xA;}&#xA;
&#xA;&#xA; 它给出了以下输出错误:
&#xA;&#xA; 估计的准确度:83.33333333333333&#xA; 28-28-属性在位置11处不同:&#xA;标签在位置1处不同!0 = = 3&#xA;线程“main”java.lang中的异常.ArrayIndexOutOfBoundsException:24&#xA; at weka.estimators.DiscreteEstimator.getProbability(DiscreteEstimator.java:111)&#xA; at weka.classifiers.bayes.NaiveBayes.distributionForInstance(NaiveBayes.java:369)&#xA; at weka.classifiers.evaluation.Evaluation.evaluationForSingleInstance(Evaluation.java:1961)&#xA; at weka.classifiers.evaluation.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1999)&#xA;在weka.classifiers.evaluation.Evaluation.evaluateModel(Evaluation.java:1875)&#xA;在weka.classifiers.Evaluation.evaluateModel(Evaluation.java:671)&#xA;在Predictor.main(Predictor.java:137)&#xA;
&#xA;&#xA; 我被困住了!感谢您的帮助。
&#xA;