2013-03-15 147 views
1

我正在使用Weka gui在數據集上訓練SVM分類器(使用libSVM)。在.arff文件中的數據是使用Weka預測測試數據集中的文本數據標籤?

@relation Expandtext 

@attribute message string 
@attribute Class {positive, negative, objective} 

@data 

我把它變成文字的袋字符串到字向量,運行SVM和得到一個體面的分類率。現在我有我的測試數據,我想預測他們的標籤,但我不知道。再次它的報頭信息是相同的,但對每個類別它標記有一個問號(?),即

'Musical awareness: Great Big Beautiful Tomorrow has an ending\u002c Now is the time does not', ? 

再次我預先進行處理,字符串到字向量,類是在相同的位置作爲訓練數據。

我進入「分類」菜單,加載我的訓練SVM模型,選擇「提供的測試數據」,加載測試數據,右鍵單擊「重新評估當前測試集上的模型」的模型,但是它給了我測試和訓練不兼容的錯誤。我不知道爲什麼。

我該怎麼辦這個錯誤的方式來標記測試數據?我究竟做錯了什麼?

回答

2

對於幾乎所有的機器學習算法,訓練數據和測試數據都需要具有相同的格式。這意味着,兩者必須具有相同的特徵,即Weka中的屬性,格式相同,包括類。

問題可能是您獨立預處理訓練集和測試集,並且StrintToWordVectorFilter將爲每組創建不同的特徵。因此,在訓練集上訓練的模型與測試集不兼容。

你想要做的是初始化訓練集上的過濾器,然後將其應用於訓練和測試集。

問題Weka: ReplaceMissingValues for a test file涉及這個問題,但我會在這裏重複相關部分:

Instances train = ... // from somewhere 
Instances test = ... // from somewhere 
Filter filter = new StringToWordVector(); // could be any filter 
filter.setInputFormat(train); // initializing the filter once with training set 
Instances newTrain = Filter.useFilter(train, filter); // configures the Filter based on train instances and returns filtered instances 
Instances newTest = Filter.useFilter(test, filter); // create new test set 

現在,你可以訓練SVM和應用測試數據生成的模型。

如果培訓和測試必須在單獨的運行或程序中,則應該可以將初始化過濾器與模型一起使用serialize。加載(反序列化)模型時,還可以加載篩選器並將其應用於測試數據。他們現在應該兼容。