[Python, Программирование, Машинное обучение] Telegram bot + ML: универсальный алгоритм совмещения
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Пишу модели для кейсов на Kaggle, изучаю чужие и вдохновляюсь. Все статьи с описанием того, как внедрить их в веб-проект, для меня, школьника Junior Frontend'а, дают overhead сложной инфы, я же хочу просто "позаимствовать" любую крутую модель и быстро внедрить в свой сервис. Руки зачесались придумать универсальный алгоритм, так что решение было найдено быстро.Приступаем. 1 шагЯ хочу взять формат большинства моделей с Kaggle, чтобы в дальнейшем было легко заимствовать чужой код любой сложности не разбираясь в нем. Бот для телеги пишем на Python 3.9, с помощью либы pyTelegramBotAPI, для решения проблемы совместимости расширений .py и .ipynb юзаем ipynb. И так, устанавливаем зависимости:
pip install pyTelegramBotAPI
pip install ipynb
Заходим на Kaggle и выбираем понравившуюся модель. Я начну с классического кейса Titanic - Machine Learning from Disaster, заимствую это решение (Titanic Random Forest: 82.78%), перетаскиваю в проект с ботом.Устанавливаем появившиеся зависимости:
pip install <имя>
Пилим бота. 2 шагСоздаем новый файл и импортируем в него наши либы:
import telebot
from ipynb.fs.defs.ml import is_user_alive
В ipynb.fs.defs.ml вместо ml впишите имя модуля, в котором находится модель, а вместо is_user_alive имя будущей функции, которую будет эта модель реализовывать. В нашем случае она предсказывает, выживет ли пассажир.Инициализируем бота, вставляем токен (получите его через @BotFather):
bot = telebot.TeleBot('token')
Пишем хэндлер на команду /start, описываем в нем как юзать бота и формат ввода дынных. Чтобы его определить, изучите тестовый датасет и поэксперементируйте с вводом своих строк.
@bot.messagehandler(commands=['start'])
def welcome(message):
bot.sendmessage(message.chat.id, 'Привет! Назови Класс билета, Имя (одним словом), '
'Пол (male/female), Возраст, Прибыл ли он с супругом (1-да, 0-нет), '
'с Ребенком (1-да, 0-нет), Номер билета, его Стоимость и Порт '
'пасадки, - а я предскажу, выжил ли этот пассажир на Титанике!')
Теперь какой бы текст юзер не ввел, мы воспринимаем его как данные пассажира. Превращаем их в лист и приводим к формату тестового датасета:
@bot.messagehandler(contenttypes=['text'])
def answer(message):
bot.sendmessage(message.chat.id, 'Анализируем…')
passengerdata = message.text.split()
passengerdata.insert(0, 0)
passengerdata.insert(9, ',')
passengerdata[2] = '"', passengerdata[2], '"'
Как видите, в нашем случае в начало было необходимо добавить бесполезный айдишник, на 9е место незначащую запятую, а имя пассажира заключить в кавычки.Модифицируем модель. 3 шагВ файле модели поиском cntrl+f выделяем и удаляем все разделители на ячейки #%% кроме первого. Переносим все импорты в начало и табаем массив кода после них. Теперь оборачиваем его в нашу функцию с аргументом в виде пользовательских данных:
<импорты>
def is_user_alive(user_data):
<весь остальной код>
Куда-нибудь в самое начало добавляем код, вписывающий в тестовый датасет наши данные:
with open(os.path.join('input', 'test.csv'), "a") as fp:
wr = csv.writer(fp, dialect='excel')
wr.writerow(user_data)
Predictions чаще всего содержит результат работы модели (проверьте ваш случай). Так как данные пользователя содержались в конце тестового датасета, возвращаем последнюю его строку (return пишем в конце файла):
return predictions[len(predictions)-1:]['Survived']
Допиливаем бота. 4 шагВ функции answer создаем переменную с результатом анализа, она будет содержать 0 или 1… в странном формате. Короче, в нашем случае необходимо ответ дополнительно перевести в числовой тип:
answer = is_user_alive(passenger_data)
if int(answer) == 1:
bot.sendmessage(message.chat.id, 'Везунчик! Видимо, этот пассажир успел на спасательную шлюпку.')
elif int(answer) == 0:
bot.send_message(message.chat.id, 'Увы, но Титаник ваш пассажир… не пережил бы.')
Создаем функцию с предложением чекнуть кого-нибудь еще, вызываем ее из answer с message аргументом:
def doagain(message):
bot.sendmessage(message.chat.id, 'Проверить живучесть кого-нибудь еще?')
Запускаем полинг:
while True:
try:
bot.polling(none_stop=True)
except ():
time.sleep(5)
Результат
Все! Довольно просто, правда?Если не очень, можешь глянуть видео версию:Извините, данный ресурс не поддреживается. :( Код: https://github.com/freakssha/ml-bot-titanicЭто спидран от чешущихся рук, он не оптимизированный и его можно много где улучшить, но я пока не знаю как. Если вы понимаете, как это сделать, не теряя простоты и универсальности - напишите, прошу!GitHub, Inst, VK
===========
Источник:
habr.com
===========
Похожие новости:
- [Программирование, Java, ReactJS] YAHW на React
- [Программирование, C++] C++ 14 с точки зрения олимпиадного программирования
- [Python, Машинное обучение, Учебный процесс в IT] Как вручную оптимизировать гиперпараметры модели машинного обучения (перевод)
- [Программирование, C++] Multithreading
- [Информационная безопасность, Машинное обучение] Атаки на компьютерное зрение
- [Программирование, C++, Системы сборки] Кроссплатформенный C++ с vcpkg и зависимостями
- [Open source, Программирование, GitHub, Управление разработкой] Это не работает (перевод)
- [Open source, .NET, XML, C#] Конвертируем ODT в XML
- [Машинное обучение, Искусственный интеллект] Google научила нейросеть генерировать рецепты
- [Мессенджеры, Программирование, Разработка мобильных приложений, API] Twilio vs Sendbird vs CONTUS MirrorFly Feature Comparsion | Twilio vs Competitors
Теги для поиска: #_python, #_programmirovanie (Программирование), #_mashinnoe_obuchenie (Машинное обучение), #_telegram, #_ml, #_python, #_bot, #_telegrambot, #_python, #_programmirovanie (
Программирование
), #_mashinnoe_obuchenie (
Машинное обучение
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 17:02
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Пишу модели для кейсов на Kaggle, изучаю чужие и вдохновляюсь. Все статьи с описанием того, как внедрить их в веб-проект, для меня, школьника Junior Frontend'а, дают overhead сложной инфы, я же хочу просто "позаимствовать" любую крутую модель и быстро внедрить в свой сервис. Руки зачесались придумать универсальный алгоритм, так что решение было найдено быстро.Приступаем. 1 шагЯ хочу взять формат большинства моделей с Kaggle, чтобы в дальнейшем было легко заимствовать чужой код любой сложности не разбираясь в нем. Бот для телеги пишем на Python 3.9, с помощью либы pyTelegramBotAPI, для решения проблемы совместимости расширений .py и .ipynb юзаем ipynb. И так, устанавливаем зависимости: pip install pyTelegramBotAPI
pip install ipynb pip install <имя>
import telebot
from ipynb.fs.defs.ml import is_user_alive bot = telebot.TeleBot('token')
@bot.messagehandler(commands=['start'])
def welcome(message): bot.sendmessage(message.chat.id, 'Привет! Назови Класс билета, Имя (одним словом), ' 'Пол (male/female), Возраст, Прибыл ли он с супругом (1-да, 0-нет), ' 'с Ребенком (1-да, 0-нет), Номер билета, его Стоимость и Порт ' 'пасадки, - а я предскажу, выжил ли этот пассажир на Титанике!') @bot.messagehandler(contenttypes=['text'])
def answer(message): bot.sendmessage(message.chat.id, 'Анализируем…') passengerdata = message.text.split() passengerdata.insert(0, 0) passengerdata.insert(9, ',') passengerdata[2] = '"', passengerdata[2], '"' <импорты>
def is_user_alive(user_data): <весь остальной код> with open(os.path.join('input', 'test.csv'), "a") as fp:
wr = csv.writer(fp, dialect='excel') wr.writerow(user_data) return predictions[len(predictions)-1:]['Survived']
answer = is_user_alive(passenger_data)
if int(answer) == 1: bot.sendmessage(message.chat.id, 'Везунчик! Видимо, этот пассажир успел на спасательную шлюпку.') elif int(answer) == 0: bot.send_message(message.chat.id, 'Увы, но Титаник ваш пассажир… не пережил бы.') def doagain(message):
bot.sendmessage(message.chat.id, 'Проверить живучесть кого-нибудь еще?') while True:
try: bot.polling(none_stop=True) except (): time.sleep(5) Все! Довольно просто, правда?Если не очень, можешь глянуть видео версию:Извините, данный ресурс не поддреживается. :( Код: https://github.com/freakssha/ml-bot-titanicЭто спидран от чешущихся рук, он не оптимизированный и его можно много где улучшить, но я пока не знаю как. Если вы понимаете, как это сделать, не теряя простоты и универсальности - напишите, прошу!GitHub, Inst, VK =========== Источник: habr.com =========== Похожие новости:
Программирование ), #_mashinnoe_obuchenie ( Машинное обучение ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 17:02
Часовой пояс: UTC + 5