2017-10-12 36 views
0

現在我有一個問題。我需要使用weka fiter來處理Instances類的對象的數據。代碼在這裏。如何使用數字來使用fiter替換Weka中的字符串值?

CSVLoader loader=new CSVLoader(); 
loader.setSource(new File(path to file.csv)); 
Instances data=loader.getDataSet(); 
data.setClassIndex(data.numAttributes()-1); 

LibSVM classifier=new LibSVM(); 
Evaluation eval=new Evaluation(data); 
classifier.setOptions(LIBSVM_OPTIONS); 
eval.crossValidateModel(classifier,data,10,new Random(1)); 

當我運行的代碼,它給的信息:weka.classifer.functions.LibSVM:不能處理字符串的屬性!

某些屬性是字符串類型。

我想使用weka過濾器來處理數據對象。數據中有一些字符串元素。原始csv文件數據是這樣的。

title1,title2,title3,title4,title5,title6 
123, 122, 112, 121, 121, 123 
121, 123, 121, 123, inf, 121 
123, inf, 123, 123, 123, 123 

當然,csv文件保存在excel中。它的名字就像abc.csv。 csv文件中有很多數字。但是有一些字符串類型的元素,例如inf。現在我必須使用weka過濾器來使用大數來替換csv文件中的字符串inf。我不需要首先使用OPENcsv包處理csv文件,然後使用CSVLoader加載包含數字的新csv文件。在使用CSVLoader並創建Instances對象之後,我需要使用weka過濾器來處理這個問題。

我搜索了很多關於它,但我找不到答案。那麼我可以使用weka過濾器來使用大數字替換csv文件中的字符串inf嗎?那麼所有屬性都是數字類型。 謝謝!

+0

你是否真的想將'inf'的值視爲非常大的數值用於建模目的,還是忽略它們會更好? – nekomatic

+0

我只想用大數字來替換字符串inf。然後該列可以轉換爲數字類型。所以我可以使用LibSVM處理數據。因爲那麼數據列將是全部數字類型。 – LYY

回答

0

如果只有一個需要替換的特定字符串 - 例如字符串"inf" - 那麼根據CSVLoader class documentation,您應該可以使用setMissingValue方法處理此問題。通過將缺失值字符串設置爲inf,您將導入所有inf值作爲缺失值。如果列中的所有其餘數據都是數字,則應該將該列作爲數字屬性正確導入。

如果您確實希望Weka將這些替換值視爲大數,則可以應用weka.filters.unsupervised.attribute.ReplaceMissingWithUserConstant。但是我會檢查這在建模方面是否真的有意義 - 當其中一個屬性是inf?時,它實際上意味着什麼?猜測,如果替代值的大小影響模型的結果,那麼你可能不應該這樣做。

如果您的數據包含多個不同的需要處理的字符串,我沒有看到使用Weka過濾器的簡單方法。然而,文檔並沒有將文件傳遞給CSVLoader,而是說您也可以通過java.io.InputStream。如果出於某種原因無法處理和保存新的csv文件,也許可以編寫InputStream的子類,在讀取文件時過濾掉字符串值。

+0

當上面的第二行代碼運行時,有兩列在示例中給出了字符串屬性。那麼可以使用weka fiter將字符串的屬性類型轉換爲數字類型嗎? – LYY

+0

我試圖澄清我的答案。 – nekomatic

相關問題