Русский
Русский
English
Статистика
Реклама

Telegram bot ML универсальный алгоритм совмещения

Пишу модели для кейсов на Kaggle, изучаю чужие и вдохновляюсь. Все статьи с описанием того, как внедрить их в веб-проект, для меня, школьника Junior Frontend'а, дают overhead сложной инфы, я же хочу просто "позаимствовать" любую крутую модель и быстро внедрить в свой сервис. Руки зачесались придумать универсальный алгоритм, так что решение было найдено быстро.

Приступаем. 1 шаг

Я хочу взять формат большинства моделей с Kaggle, чтобы в дальнейшем было легко заимствовать чужой код любой сложности не разбираясь в нем. Бот для телеги пишем на Python 3.9, с помощью либы pyTelegramBotAPI, для решения проблемы совместимости расширений .py и .ipynb юзаем ipynb.

И так, устанавливаем зависимости:

pip install pyTelegramBotAPIpip install ipynb

Заходим на Kaggle и выбираем понравившуюся модель. Я начну с классического кейса Titanic - Machine Learning from Disaster, заимствую это решение (Titanic Random Forest: 82.78%), перетаскиваю в проект с ботом.

Устанавливаем появившиеся зависимости:

pip install <имя>

Пилим бота. 2 шаг

Создаем новый файл и импортируем в него наши либы:

import telebotfrom 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
К списку статей
Опубликовано: 31.03.2021 00:12:34
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Программирование

Машинное обучение

Telegram

Ml

Bot

Telegrambot

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru