2016-12-27 4 views
0

Я хочу сделать классификацию текста с weka. У меня есть поезд и тестовый файл (персидский язык). сначала я загружаю файл поезда, а затем выбираю «string to word vector» в препроцессе. И из-за выбора этого, позиция класса идет в начало. Чтобы переместить класс в его индекс (который равен 2 в файлах), я могу перейти либо к части «Редактировать», и щелкнуть правой кнопкой мыши по столбцу класса и выбрать «атрибут как класс» или просто в меню «Классификация», выбрать (NOM) класс , (если большинство алгоритмов не будет активным). Я запускаю SMO и сохраняю модель. Проблема заключается в том, что после открытия тестового файла и нажмите «переоценить модель на текущем наборе тестов», эта ошибка возникает, когда «индекс класса ... отличается: 1! = 2». Я знаю, это потому, что после открытия тестового файла снова столбец класса переходит в начало. Для части поезда я решил проблему, как я описал выше. Но как я могу решить эту проблему для тестовой части?класс индекс отличается погрешность в weka

образец поезд файл: enter image description here

испытательный образец файл: enter image description here

ответ

0

Во-первых, я поменял файлы на вектор на основе 1000 наиболее часто встречающихся слов в файле поезда и сделал числовой файл arff для поезда и тестового файла, затем для обоих из них в разделе «классифицировать» «menu in» Test options «I selected» (Nom).

1

Вы должны использовать то же преобразование (ы) на вашем testset, прежде чем использовать его, чтобы оценить обученную модель. При использовании графического интерфейса вы можете использовать представление препроцессора из проводника, применять одни и те же преобразования вручную, а не сохранять набор в новый файл arff. Когда вы хотите провести серию экспериментов, я предлагаю написать рутину, которая сделает вашу трансформацию для вас.

Это будет выглядеть немного что-то вроде этого:

import weka.core.Instances; 
import weka.core.converters.ArffSaver; 
import weka.core.converters.CSVLoader; 
import weka.filters.Filter; 
import weka.filters.unsupervised.attribute.Remove; 
import weka.filters.unsupervised.attribute.Reorder; 
import weka.filters.unsupervised.attribute.NumericToNominal; 

import java.io.File; 

public class DataConverter 
{ 
public static void Convert(String sourcepath,String destpath) throws Exception 
{ 
CSVLoader loader = new CSVLoader(); 
loader.setSource(new File(sourcepath)); 
Instances data = loader.getDataSet(); 

Remove remove = new Remove();       
remove.setOptions(weka.core.Utils.splitOptions("-R 1")); 
remove.setInputFormat(data);       
data = Filter.useFilter(data, remove); 

Reorder reorder = new Reorder(); 
reorder.setOptions(weka.core.Utils.splitOptions("-R first-29,31-last,30")); 
reorder.setInputFormat(data);       
data = Filter.useFilter(data, reorder); 

NumericToNominal ntn = new NumericToNominal(); 
ntn.setOptions(weka.core.Utils.splitOptions("-R first,last")); 
ntn.setInputFormat(data);       
data = Filter.useFilter(data, ntn); 

// save ARFF 
ArffSaver saver = new ArffSaver(); 
saver.setInstances(data); 
saver.setFile(new File(destpath)); 
//saver.setDestination(new File(destpath)); 
saver.writeBatch(); 
} 
public static void main(String args[]) throws Exception 
{ 
    File folder = new File("..\\..\\data\\output\\learning\\csv\\"); 
    File[] listOfFiles = folder.listFiles(); 

    for (int i = 0; i < listOfFiles.length; i++) { 
    if (listOfFiles[i].isFile()) { 
    String target = listOfFiles[i].getName(); 
    target = target.substring(0, target.lastIndexOf(".")); 
    System.out.println("converting file " + (i + 1) + "/" + listOfFiles.length); 
    Convert("..\\..\\data\\output\\learning\\csv\\" + listOfFiles[i].getName(), "..\\..\\data\\output\\learning\\arff\\" + target + ".arff"); 
    } 
    } 
} 
} 

также: перезаказа фильтр может помочь вам разместить целевой класс в конце файла. В качестве аргументов новый порядок старых индексов. В этом случае вы можете применить Reorder -R 2-last,1

+0

@S van Balen, я не знаю java. Есть ли способ решить эту проблему в самой weka, а не писать какой-либо код? спасибо – sara

+0

Абсолютно В принципе, вы просто выполняете фильтр stringToWordVector из графического интерфейса пользователя, сохраняете результат на testet.arff (или что-то еще), а затем выполняете то же упражнение для своего набора тренировок. Затем вы можете загрузить набор поездов в графический интерфейс и настроить любой классификатор для использования сохраненного набора тестов для оценки. –

Смежные вопросы