Вопрос или проблема
Допустим, у меня есть 100 значений в моем наборе данных, и я разделяю их: 80% для обучения и 20% для теста. Когда я предсказываю последнее значение, основан ли прогноз на предыдущих 99 (80 тестовых + 19 уже предсказанных значений) или только на первоначальных 80 значениях для обучения?
Например, если используется kd-дерево, добавляется ли каждая точка данных в дерево во время прогноза?
Можно ли использовать k-ближайших соседей для следующего сценария? У меня есть 20 обучающих значений, когда я добавляю новое наблюдение, я классифицирую его и добавляю в набор данных для обучения, так что получается 21 значение; в следующий раз, когда я добавлю новое значение, я классифицирую его, основываясь на 21 значении в наборе данных. Я понимаю, что это, вероятно, не так, как должно быть сделано, но представьте, что я добавляю до 50 тыс. значений, так что последнее классифицируется по предыдущим 49 999 значениям.
Другой упрощенный пример, который я придумал. n=2: на картинках 1, 2, 3 мы видим точки, как они были обучены, и одну новую зеленую точку, которая будет классифицирована. Затем мы берем новое наблюдение, расстояния рассчитываются к точкам, как в 4а или как в 4б. ссылка на визуализацию
Представьте, что это модуль sklearn в Python, выполняющий классификацию. До картинки 1 мы вызвали .fit(X_train, y_train), где тестовый набор данных состоял из 4 точек. Затем вызвали .predict(X_test), который включал 2 точки.
Это зависит от того, какой сценарий вы выбрали.
Когда вы обучаете любую модель науки о данных, она больше не изменяется. Например, если вы обучаете K-Means, вы получите в результате центроиды каждого кластера. Если вы обучаете случайный лес, вы получите в результате деревья.
Затем, когда вы применяете свою модель, она дает ответ, основываясь на этом. Ответ всегда будет одинаковым, если вход одинаковый.
Таким образом, если вы обучили свою модель на 80 образцах, после тестирования на оставшихся 20, модель остается такой же, обученной на 80 образцах, и даст точно такой же ответ, если вы снова протестируете ее на тех же 20 образцах.
Однако, возможно повторно обучить свою модель: Вы проводите все свои тесты с 80-20, и после нахождения хороших параметров, обучаете новую модель на своих 100 образцах, так что она будет более точной, если ей придется классифицировать новые образцы.
То, что вы хотите сделать, — это избегать повторного обучения вашей модели, но включать результат новых образцов каждый раз, когда вы сталкиваетесь с одним: это сложно, не все модели могут это сделать, и это совсем не для начального уровня. Это также поднимает много вопросов (я не буду вдаваться в подробности)
Я бы предложил вам вручную установить порог для повторного обучения вашей модели. Пример: не повторно обучать вашу модель, пока у вас не будет 1000 новых образцов для вставки, или повторно обучать вашу модель каждый месяц в определенную дату, с данными, которые вы знаете к этому времени.
Ответ или решение
Ответ:
Метод k-ближайших соседей (k-NN) является одним из алгоритмов машинного обучения, который не создает явную модель, как это делают некоторые другие алгоритмы. Вместо этого он просто хранит обучающий набор данных и использует его для классификации новых данных на основе сходства с уже известными значениями. В процессе предсказания, k-NN рассчитывает расстояния между новым элементом и каждым элементом в обучающем наборе данных, а затем классифицирует на основе к ближайших соседей.
Когда вы выполняете разбиение данных на обучающую и тестовую выборки, как в вашем примере (80% тренировка, 20% тест), алгоритм k-NN использует только обучающий набор данных для классификации объектов тестового набора. Это значит, что, когда вы предсказываете последние значения в тестовой выборке, алгоритм опирается на исходные 80 обучающих точек. Другими словами, когда создается KD-дерево (kd-tree), точки из тестовой выборки не добавляются в дерево во время предсказания.
Теперь, относительно сценария, который вы описали — добавление новых наблюдений и использование их для классификации последующих данных — это похоже на методика онлайн-обучения (или инкрементального обучения). Однако, традиционный алгоритм k-NN не предусматривает динамического обновления своего обучающего набора данных автоматически. Каждое изменение требует повторного запуска процесса обучения. Это связано с тем, что добавление новой точки требует пересчета всех расстояний для последующей классификации.
Для вашего специфического случая, когда вы добавляете наблюдения одно за другим и хотите, чтобы каждая новая точка была классифицирована с учетом всех предыдущих, вы фактически каждый раз расширяете обучающий набор и перерасчитываете модель заново. Это можно добиться с помощью реализации собственной логики, где вы будете добавлять новые наблюдения в вашу базу данных и обновлять структуру kd-дерева.
Оптимальным решением было бы установить порог для повторного обучения модели, например, после накопления нескольких сотен или тысяч новых данных — таким образом можно снизить вычислительную нагрузку и избежать ненужных перерасчетов. Помните, что инкрементальные изменения модели требуют аккуратного подхода и технического понимания, чтобы сбалансировать между нагрузками и производительностью модели.
Этот подход обеспечит вам возможность лучше воспользоваться преимуществами алгоритма k-NN для задач с большими объемами данных при использовании скриптов на Python, таких как из модуля Scikit-learn.