我正在嘗試在 Android 應用程序中使用/導入在 WEKA 3.8.3(GUI 分類器)中制作的 J48 分類器,但生成的類只返回一個分類結果,而不管傳入的值如何。原始數(shù)據(jù)集看起來像這樣,所以我在 SO 上找到的第一個答案是使用 SMOTE 來彌補這一點。我找不到 SMOTE,但從我所看到的 ClassBalancer 過濾器獲得了相同的結果。結果數(shù)據(jù)如下所示。這些是原始數(shù)據(jù)的結果,這些是過濾數(shù)據(jù)的結果。使用原始數(shù)據(jù)的 J48 類只返回 2.0 的值,這與步行相對應,我猜這是因為步行是訓練集中最常見的分類。使用過濾數(shù)據(jù)的 J48 類只返回值 1.0,我無法解釋清楚。我已經嘗試將以前項目中的工作分類器加載到應用程序中;這個(J48)分類器確實返回了不同的值。我還嘗試手動刪除數(shù)據(jù)行,直到所有活動都具有相同數(shù)量的條目,但這并沒有解決問題。我也試過手動輸入一個我知道應該對應于“坐”的值,但這也不起作用。當我將值打印到日志時,發(fā)送到分類器的實例看起來非常好,所以我認為這與輸入無關。以防萬一我遺漏了一些明顯的東西,我將包含以下代碼: public double createInstances(double x, double y, double z){ double result = 0; Instances dataRaw = new Instances("TestInstances", atts, 3); dataRaw.setClassIndex(dataRaw.numAttributes()-1); Log.d(TAG,"Rawdata:" + dataRaw); Instance inst = new DenseInstance(3); inst.setDataset(dataRaw); inst.setValue(accel_x,x); inst.setValue(accel_y,y); inst.setValue(accel_z,z); Log.d(TAG,"NEWDATARAW:" + inst); try { result = weka.classifyInstance(inst); Log.d(TAG,"RESULT:" + result); } catch (Exception e){ Log.e(TAG,"DID NOT WORK:" + e); } return result;}我還確保將屬性添加到 Attributes ArrayList“atts”。我能想到的唯一剩下的選擇是數(shù)據(jù)格式有問題,但我想在創(chuàng)建算法時它已經顯示出問題的跡象。這是包含數(shù)據(jù)的 ARFF 文件的示例。我嘗試在默認的 J48 算法中輸入兩個數(shù)據(jù)集(原始/過濾),一個禁用所有修剪選項,以防它修剪其他活動,但這些分類器中沒有一個返回超過一個活動。我認為這是所有相關信息,但如果我遺漏了任何信息,請告訴我,以便我可以添加它。我相當確定問題出在分類器本身的某個地方,但我不知道它到底是什么。
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
結果 WEKA 將以下代碼放在了分類實例方法中:
// set class value to missing
s[i.classIndex()] = null;
這導致數(shù)組中的最后一個值(在本例中為 accel_z 值)設置為 null,導致分類器始終返回相同的值,因為這是分類器中的第一次檢查(注意“if(i[2 ] == null”語句):
static double N69cd8e58128(Object []i) {
double p = Double.NaN;
if (i[2] == null) {
p = 1;
} else if (((Double) i[2]).doubleValue() <= 6.43) {
p = WekaClassifier.Nad3034129(i);
} else if (((Double) i[2]).doubleValue() > 6.43) {
p = WekaClassifier.N26ef16ed242(i);
}
return p;
}
我不確定這條線通常用于什么目的,但刪除它似乎解決了這個問題。
添加回答
舉報
0/150
提交
取消