Translate

пятница, 5 декабря 2014 г.

Создадим сепаратор

В прошлый раз мы создали парсер, который читает файлы в формате CSV и преобразует их в двумерные массивы данных.

Но сырые данные для машинного обучения необходимо предварительно разделить на две части:

  1. Обучающая выборка, на которой векторная машина - VMR будет создавать математическую модель бинарного классификатора
  2. Тестовая выборка, на которой будет проверяться полученная модель бинарного классификатора для проверки обобщающей способности машинного обучения

Если не выполнить такое разделение, то мы не сможем проверить обобщающую способность. Как уже ранее упоминалось, проблемы при машинном обучении в теории обобщающей способности не могут быть в алгоритме, а только в обучающей выборке. Если результаты проверки на тестовой выборке окажутся неудовлетворительными, то это означает, что в обучающей выборке отсутствуют значимые объясняющие переменные - предикторы.

Соответственно, нам понадобится сепаратор, который будет делить выборку на две части.

Принцип работы сепаратора устроен так, чтобы в обучающей выборке представители обоих бинарных классов были представлены одинаково, т.е. количество примеров для обоих классов должно быть равным. Если этого не сделать, то результат обучения будет более надёжным для того класса, который представлен большинством примеров.

А в тестовой выборке, частоты примеров для обоих классов должны быть близки к частотам этих же классов в генеральной совокупности. В этом случае мы сможем более достоверно вычислить значения чувствительности (SE) и специфичности (SP) и прочие характеристики обобщающей способности обобщённой модели бинарного классификатора, чтобы принять решение о том, пригодна ли модель для прикладного использования или же необходимо провести дополнительные исследования с целью выявления более значимых предикторов.

Создадим сепаратор на Java:


package libvmr;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Сепаратор, разделяющий выборку на обучающую и тестовую части
 * @author Yury V. Reshetov
 * @version 1.0
 */
public class Separator {
    /**
     * Исходная выборка
     */
    private double[][] samples = null;
    /**
     * Обучающая выборка
     */
    private double[][] trainsamples = null;
    /**
     * Тестовая выборка
     */
    private double[][] testsamples = null;

    /**
     * Получить тестовую часть
     * @return тестовая часть
     */
    public double[][] getTestsamples() {
        return testsamples;
    }

    /**
     * Получить обучающую часть
     * @return обучающая часть
     */
    public double[][] getTrainsamples() {
        return trainsamples;
    }

    public Separator(double[][] patterns) {
        this.samples = patterns;

        ArrayList<double[]> trues = new ArrayList<double[]>();
        ArrayList<double[]> falses = new ArrayList<double[]>();
        for (int i = 0; i < samples.length; i++) {
            if (samples[i][samples[i].length - 1] > 0.5) {
                trues.add(samples[i]);
            } else {
                falses.add(samples[i]);
            }
        }
        Collections.shuffle(trues);
        Collections.shuffle(falses);

        int lenmin = Math.min(trues.size(), falses.size());
        int lenmax = Math.max(trues.size(), falses.size());
        lenmax = (lenmax - lenmin) / 2 + lenmin;

        this.trainsamples = new double[lenmin][samples[0].length];
        this.testsamples = new double[lenmax][samples[0].length];
        for (int i = 0; i < lenmin; i++) {
            if ((i % 2) == 0) {
                this.trainsamples[i] = trues.get(i);
                this.testsamples[i] = falses.get(i);

            } else {
                this.trainsamples[i] = falses.get(i);
                this.testsamples[i] = trues.get(i);
            }
        }

        if (lenmax != lenmin) {
            ArrayList<double[]> r = new ArrayList<double[]>();
            if (trues.size() > lenmin) {
                r = trues;
            } else {
                r = falses;
            }
            for (int i = lenmin; i < lenmax; i++) {
                this.testsamples[i] = r.get(i);
            }
        }
    }
}

Комментариев нет:

Отправить комментарий