SVM: как правильно обучить машину? Какие входные данные должны быть?

Для тестов используется модуль php_svm: www.php.net/manual/ru/book.svm.php

Есть входящий поток данных: город, время (час), температура.
На выводе результат из 5 вариантов: 1, 2, 3, 4, 5
Необходимо научить машину находить идентификатор ответа в зависимости от значений входных данных.

Как можно подать эти данные на обучение? Правильна ли моя логика?
Про результат:
По скольку, результатом может быть только -1 и 1, получается, нужно перенести идентификатор результата во входные параметры? Например: город Москва, 12 часов, 0 градусов, ответ 3 - и эти входные данные дадут ответ 1. При другом номере ответа, соответственно -1.
Про город:
Нужно составить индексы по городам: 1 - Москва, 2 - Самара, 3 - Екатеринбург. А потом уже использовать эти индексы как ключи.
По часам, температуре и ответу:
Используем тот же индекс, что у города. Для уникальности индексам даю разные диапазоны.

Для наглядности, представлю массив с индексами:
$indexes = [
	// города
	1, ... 99,
	// часы
	100, ... 199,
	// температура
	200, ... 299,
	// ответы
	300, ... 399,
];


На обучение получаются такие данные:
$train = [
	[-1,	1 => 1, 100 => 1, 200 => 1, 300 => 1], // город 1, час 100, температура 200, ответ 300
	[-1,	1 => 1, 100 => 1, 200 => 1, 301 => 1], // город 2, час 120, температура 230, ответ 301
	[1,		1 => 1, 100 => 1, 200 => 1, 302 => 1], // город 2, час 120, температура 230, ответ 302
	[1,		3 => 1, 120 => 1, 304 => 1], // город 3, час 120, температура неизвестна, ответ 304
];
$model = $svm->train($train);

И подобный массив с данными на проверку:
// В комментариях ожидаемый мной результат
$tests = [
	[1 => 1, 100 => 1, 200 => 1, 300 => 1], // -1?
	[100 => 1, 301 => 1], // -1?
	[100 => 1, 200 => 1, 302 => 1], // 1?
];
foreach($tests as $test){
	$result = $model->predict($test);
	var_dump($result);
}

Есть подозрение, что значением параметров должна быть не единица.
Пробовал обучить машину генерируя случайным образом входные и выходные данные (до 10 тыс вариантов). В итоге машина всегда отдает результат -1, при весе параметров равным 1. Если веса сделать равным 0.01, тогда ответ всегда 1.

Вопросы:
1. Правильна ли логика построения входных данных на обучение?
2. Правильно ли составлен массив на тест?
3. Если нельзя переносить идентификатор результата во входные параметры, как быть?
4. Какой вес нужно указать для входных параметров? Как его вычислить?
5. Нужно ли что-то менять, если входных параметров станет 20 (в среднем по 100 вариантов значений), а вариантов результата станет 200.
6. Есть ли примеры кода, где разобраны подобные задачи?
Спасибо.
  • Вопрос задан
  • 3416 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mrgloom
если на выходе может быть 5 разных вариантов, то это multiclass svm
его можно сделать на базе бинарной классификации (которая выдаёт +-1) методом 1-vs-1 и 1-vs-all.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 20:46
150000 руб./за проект
28 мар. 2024, в 20:37
50000 руб./за проект
28 мар. 2024, в 20:34
1500 руб./за проект