Вопрос или проблема
Контекст:
Я работаю в индустрии ПЛК (программируемых логических контроллеров), где мы получаем схемы от клиентов, показывающие, как подключены различные устройства, и программируем ПЛК соответственно. Наша команда состоит из аналитика данных и разработчика программного обеспечения, которые имеют небольшой опыт в области ИИ или машинного обучения, поэтому мы не уверены, корректен ли наш текущий подход.
Сейчас мы разрабатываем систему, которая предсказывает категорию названий устройств, предоставленных нашими клиентами. Например, устройство может называться “PU1233” для насоса или “V123” для клапана. Проблема в том, что каждый клиент может иметь свои собственные нормы наименований, что затрудняет предсказание с полной уверенностью. Тем не менее, у нас будет историческая информация из предыдущих проектов, состоящая из названий устройств и их соответствующих категорий для каждого клиента (мы получим эти данные только после выпуска программного обеспечения), и мы планируем использовать это для прогнозирования.
Система должна почти мгновенно предсказывать категорию каждого названия устройства, как только клиент предоставляет список названий.
Следуя рекомендации руководства, мы исследовали системы, подобные автозамене. Один из подходов, который мы опробовали, заключается в разбиении названий устройств на группы букв и цифр, а затем в расчете расстояния Левенштейна между ними. Мы применили более высокий вес к буквам по сравнению с цифрами и придали большее значение символам, находящимся в начале строки. Наша логика заключается в том, что буквы, как правило, более значимы, чем цифры, и символы в начале часто соответствуют основным категориям.
Мы также экспериментировали с алгоритмами, такими как Jaro-Winkler, но заметили, что методы, основанные на расстоянии, могут быть медленными. Например, обработка 300 тестовых строк по сравнению с набором данных из 2000 названий заняла около 20 секунд, что слишком долго для нашего случая использования. Было предложено предварительно обработать набор данных, чтобы ускорить процесс. Одна из идей, которую мы имели, заключалась в том, чтобы обобщить набор данных, извлекая первую полную последовательность смежных букв из каждой строки, но это все еще не кажется оптимальным.
Кроме того, мы пробовали алгоритмы машинного обучения, хотя не уверены, применяем ли мы их правильно, такие как наивный байесовский классификатор, используя такие характеристики, как длина строки, первый символ, мешок слов, состоит ли строка только из цифр или букв и т.д. Однако мы не уверены, являются ли эти характеристики лучшим способом представления данных, и не знаем, как тонко настроить модель, чтобы эффективно учитывать различные сценарии.
Мы также рассматриваем возможность комбинирования признаков машинного обучения с алгоритмами редактирования расстояния, такими как Левенштейн или Jaro-Winkler. Однако методы, основанные на расстоянии, требуют сравнения с конкретными тестовыми строками, в то время как признаки машинного обучения этого не требуют, и мы не знаем, как интегрировать оба подхода.
Примечание #1: Длина списка строк может варьироваться от 500 до 1000, а длина списка обучающих строк может находиться в диапазоне сотен тысяч.
Примечание #2: Мы в настоящее время тестируем все в R, но открыты к решениям и на других языках, хотя наша конечная цель – интегрировать систему в .NET 8 C# в приложении WPF.
Мы ищем мнения или рекомендации о том, как нам следует подходить к этому.
Итог:
Мы создаем систему, в которой клиенты вводят список названий устройств, и нам необходимо предсказать их категории с почти мгновенными результатами и приемлемой точностью. Мы считаем, что важно придавать больше веса буквам и символам, находящимся ближе к началу строки, но мы сталкиваемся с проблемами времени обработки и не уверены, как улучшить наш подход.
Ответ или решение
Рекомендации по созданию системы предсказания категорий устройств с использованием ИИ/МЛ
Введение
Ваш проект по предсказанию категорий для различных устройств на основе ввода от клиентов представляет собой интересную задачу, которая включает в себя аспекты обработки естественного языка и машинного обучения. Учитывая вашу ситуацию, давайте рассмотрим оптимальное решение, которое обеспечит хорошую точность и скорость обработки.
Подход к решению проблемы
-
Сбор и предварительная обработка данных
- Соберите исторические данные от клиентов, содержащие наименования устройств и их категории. Это послужит основой для обучения модели.
- Проводите очистку данных, включая нормализацию наименований (например, приведение к нижнему регистру, удаление лишних пробелов и символов).
-
Векторизация текста
- Вместо использования статических методов, таких как Levenshtein или Jaro-Winkler, рассмотрите алгоритмы векторизации текста, такие как TF-IDF или Word2Vec. Эти методы преобразуют текст в числовые векторы, которые можно использовать для обучения алгоритмов машинного обучения.
- Для работы с различными клиентскими обозначениями можете включить дополнительно контекстные векторы (например, использовать BERT или FastText), что повысит качество предсказания.
-
Выбор алгоритма машинного обучения
- Рассмотрите использование моделей ансамблей, таких как Random Forest или Gradient Boosting Machines (например, XGBoost), которые лучше справляются с задачами классификации и имеют встроенные механизмы для обработки номинальных переменных.
- Если возможно, используйте нейронные сети, такие как LSTM или GRU, которые могут учитывать последовательность символов в наименованиях устройств, улучшая точность классификации.
-
Формирование признаков
- Создайте набор признаков, включая:
- Длину строки
- Первые символы строки
- Частоту символов
- Наличие определённых паттернов (например, буквы или цифры в начале)
- Дополните вектора в зависимости от клиентских особенностей, что позволит улучшить адаптивность модели.
- Создайте набор признаков, включая:
-
Гибридный подход
- Для повышения производительности можно комбинировать методы машинного обучения и алгоритмы расстояний. Например, вы можете рассмотреть использование предобученной модели для раннего отбора кандидатов (например, предсказание только на основе машинного обучения), а затем оптимизировать результаты с помощью методов расстояний.
-
Оптимизация и ускорение
- Если время отклика имеет критическое значение, стоит рассмотреть использование предварительно обученной модели и кэша для быстрых предсказаний по популярным наименованиям устройств.
- Убедитесь, что ваш код оптимизирован: используйте параллельные вычисления, если это возможно, и оптимизируйте алгоритмы предобработки для сокращения времени выполнения.
-
Тестирование и валидация
- Разделите ваши данные на обучающую и тестовую выборки, чтобы обеспечить корректную проверку модели.
- Используйте кросс-валидацию, чтобы проверить стабильность вашей модели и адаптировать её к различным клиентским данным.
-
Интеграция с .NET
- Для интеграции вашей модели в .NET 8 C# приложении, вы можете рассмотреть использование сервиса ML.NET для переноса вашей модели или создать REST API на Python с фреймворком Flask или FastAPI и взаимодействовать с ним из WPF приложения.
- Создайте интерфейс пользователя, который позволит клиентам вводить наименования устройств и получать предсказания в реальном времени.
Заключение
При разработке вашей системы важна итеративная работа: тестируйте различные подходы и методы, анализируйте результаты и корректируйте ваш подход. Совмещая передовые методы обработки текстов с мощными алгоритмами машинного обучения, вы сможете создавать эффективную систему классификации, которая будет выполнять задачи с высокой точностью и скорость.