Поскольку для алгоритма машинного обучения необходимы данные, то эти
данные нужно откуда-то загружать. Чаще всего для хранения и передачи
данных используется наиболее распространенный формат файлов CSV. Данный
формат был разработан вовсе не для машинного обучения, а для обмена
данными между различными электронными таблицами. Но пригодился и в
искусственном интеллекте, поскольку обучающие выборки также являются
табличными данными. Более того, зачастую информацию, например, в научных
исследованиях, сначала заносят в электронные таблицы, а потом уже с
помощью машинного обучения пытаются найти закономерности.
Поэтому, наш парсер также будет брать данные из файлов в формате CSV. В качестве разделителей табличных ячеек будет использоваться символ точки с запятой. А в качестве разделителя дробной и целой части числовых данных будет использоваться либо точка, либо запятая. К тому же первая строка файла будет содержать наименования входных данных (зависимых переменных). Вторая строка будет содержать наименования единиц измерений для данных. Начиная с третьей строки пойдут уже сами данные в виде чисел. Первый столбец файла будет содержать идентификаторы строк. Зависимая переменная у нас будет всего одна и не будет иметь наименований, а соответственно и единиц измерений. Диапазон зависимой переменной такой же как и для логистической регрессии: 1 - событие истинно, 0 - событие ложно.
Конечно же, необходимо не только парсить информацию из файлов, но и обрабатывать ошибки. В нашем случае недопустимо, если какие либо числовые данные будут представлены в нечисловом формате. Также недопустимы пропущенные данные, для этого будет применяться проверка на количество ячеек в строках и если будут найдены различия, то должно выдаваться сообщение об ошибке.
В таком случае, если например, нам необходимо будет создать файл для машинного обучения задаче XOR, то содержимое файла, созданное в текстовом редакторе будет выглядеть так:
;v0;v1;
;n/a;n/a;
sample0;0;0;0
sample1;0;1;1
sample2;1;0;1
sample3;1;1;0
Сохраним файл с именем xor.csv
Теперь его можно открыть в какой нибудь электронной таблице, например, в MS Excel или в Open Office Calc.
Но нам нужно обрабатывать выборки не в электронных таблицах, а с помощью нашей библиотеки LibVMR. Дополнительно, наш парсер исключит из таблицы первый столбец - идентификаторы строк, т.к. они не нужны для бинарной классификации, а необходимы для тех, кто заполняет таблицы, чтобы не перепутать источники информации.
Создадим код парсера на Java:
Поэтому, наш парсер также будет брать данные из файлов в формате CSV. В качестве разделителей табличных ячеек будет использоваться символ точки с запятой. А в качестве разделителя дробной и целой части числовых данных будет использоваться либо точка, либо запятая. К тому же первая строка файла будет содержать наименования входных данных (зависимых переменных). Вторая строка будет содержать наименования единиц измерений для данных. Начиная с третьей строки пойдут уже сами данные в виде чисел. Первый столбец файла будет содержать идентификаторы строк. Зависимая переменная у нас будет всего одна и не будет иметь наименований, а соответственно и единиц измерений. Диапазон зависимой переменной такой же как и для логистической регрессии: 1 - событие истинно, 0 - событие ложно.
Конечно же, необходимо не только парсить информацию из файлов, но и обрабатывать ошибки. В нашем случае недопустимо, если какие либо числовые данные будут представлены в нечисловом формате. Также недопустимы пропущенные данные, для этого будет применяться проверка на количество ячеек в строках и если будут найдены различия, то должно выдаваться сообщение об ошибке.
В таком случае, если например, нам необходимо будет создать файл для машинного обучения задаче XOR, то содержимое файла, созданное в текстовом редакторе будет выглядеть так:
;v0;v1;
;n/a;n/a;
sample0;0;0;0
sample1;0;1;1
sample2;1;0;1
sample3;1;1;0
Сохраним файл с именем xor.csv
Теперь его можно открыть в какой нибудь электронной таблице, например, в MS Excel или в Open Office Calc.
Но нам нужно обрабатывать выборки не в электронных таблицах, а с помощью нашей библиотеки LibVMR. Дополнительно, наш парсер исключит из таблицы первый столбец - идентификаторы строк, т.к. они не нужны для бинарной классификации, а необходимы для тех, кто заполняет таблицы, чтобы не перепутать источники информации.
Создадим код парсера на Java:
package libvmr; import java.io.*; import java.util.*; /** * Парсинг входного файла из формата CSV * @author Yury V. Reshetov * @version 1.0 */ public class Parser { /** * Названия входных признаков * */ private String[] ids = null; /** * Единицы измерения для входных признаков */ private String[] units = null; /** * Сообщение об ошибке */ private String error = null; /** * Парсинг * @param file Имя входного файла * @return Массив обучающей выборки */ public double[][] parsing(File file) { try { // Загружаем весь текст в ОЗУ BufferedReader bufferedreader = new BufferedReader(new FileReader(file)); String s = ""; String strings = ""; while ((s = bufferedreader.readLine()) != null) { if (! s.trim().equals("")) { strings = strings + s + "\n"; } } bufferedreader.close(); //Считаем количество строк и столбцов StringTokenizer stringtokenizer = new StringTokenizer(strings, "\n"); int i = 0; // Счетчик количества строк int j = 0; // Счетчик количества столбцов while (stringtokenizer.hasMoreTokens()) { String string = stringtokenizer.nextToken().trim(); StringTokenizer stringtokenizer1 = new StringTokenizer(string, ";"); j = 0; while (stringtokenizer1.hasMoreTokens()) { stringtokenizer1.nextToken(); j++; } i++; } int rows = i - 2; // Количество строк в обучающей выборке int colls = j - 1; // Количество столбцов в обучающей выборке double[][] samples = new double[rows][colls]; this.ids = new String[colls - 1]; this.units = new String[colls - 1]; // Первые две строки: наименования входных значений и их единицы измерения stringtokenizer = new StringTokenizer(strings, "\n"); if (i > 2) { for (int n = 0; n < 2; n++) { String string = stringtokenizer.nextToken().trim(); StringTokenizer stringtokenizer1 = new StringTokenizer(string, ";"); if (! string.startsWith(";")) { // Пропускаем первый столбец if (stringtokenizer1.hasMoreTokens()) { stringtokenizer1.nextToken(); } } j = 0; while (stringtokenizer1.hasMoreTokens()) { String data = stringtokenizer1.nextToken(); if (n == 0) { this.ids[j] = data.trim(); } else { this.units[j] = data.trim(); } j++; } } } // Строки, начиная с третьей i = 0; int prev_j = 0; // Количество элементов в предыдущей строке while (stringtokenizer.hasMoreTokens()) { String string = stringtokenizer.nextToken().trim(); StringTokenizer stringtokenizer1 = new StringTokenizer(string, ";"); prev_j = j; j = 0; // Пропускаем первый столбец if (! string.startsWith(";")) { if (stringtokenizer1.hasMoreTokens()) { stringtokenizer1.nextToken(); } } while (stringtokenizer1.hasMoreTokens()) { String data = stringtokenizer1.nextToken(); // Заменим все разделители-запятые для числовых строк на точки samples[i][j] = Double.parseDouble(data.replace(',','.')); j++; } if ((i > 0) && (j != prev_j)) { int current = i + 1; if (j > prev_j) { this.error = "Количество элементов в строке " + i + " меньше чем в строке " + current; } if ((j < prev_j)) { this.error = "Количество элементов в строке " + current + " меньше чем в строке " + i; } return null; } i++; } return samples; } catch (Exception exception) { this.error = exception.getMessage(); } return null; } /** * Метод возвращает названия входных параметров * @return названия входных параметров */ public String[] getIDs() { return this.ids; } /** * Метод возвращает наименования единиц измерения * @return наименования единиц измерения */ public String[] getUnits() { return this.units; } /** * Метод возвращает сообщение об ошибке * @return сообщение об ошибке, либо null если ошибки отсутствуют */ public String getError() { return this.error; } }
Комментариев нет:
Отправить комментарий