понедельник, 24 декабря 2018 г.

В помощь junior'у


'40 вопросов от analyticsvidhya' переведены и опубликованы.
Теперь я собрал свои полезные ссылки типа 'как стать джуниором', 'как искать работу', 'как пройти собеседование по специализации DS и ML'.

25 прикольных вопросов для собеседования по машинному обучению
Спойлер - содержательная ценность невысокая.

Как стать Data Scientist'ом

Машинное обучение за год

Минитест от А.Дьяконова, что значит крайне 'непростой'.

Бонус 1: Jupyter Notebook: галерея лучших блокнотов по ML и Data Science. Очень интересно и полезно для программера любого уровня.
Бонус 2: Набор ноутбуков по линейным моделям от нашего великого современника Ю.Кашницкого
Бонус 3: Отличный канал именно для джунов.



Далее идут советы для соискателей без учёта ML/DS, в основном по Python'у.

среда, 19 декабря 2018 г.

40 вопросов джуниору от analyticsvidhya.com, часть 1




Есть хороший индийский сайт analyticsvidhya про машинное обучение. Там 2 года назад вышел материал „40 вопросов на собеседовании по ML“. Ничего сенсационного в нём нет, но разных гайдов типа „как пройти собеседование джуниору“ довольно много, а вот того же самого по ML ни разу не видел.
Короче говоря, сделал перевод этого текста.
При переводе иногда только немного правил Гугл-переводчик, который мощно прогрессирует. Избыточные фразы сокращал. Аббревиатуры раскрывал и переводил. Ничего не исправлял, но несколько раз добавлял немного текста. Если не был уверен в переводе термина, то в скобках оставлял оригинальный.
Буду выкладывать по 10 вопросов.
Если заметите неточности, буду рад получить обратную связь. При использовании просьба давать ссылку на источник.



Вопросы 1-10

среда, 14 ноября 2018 г.

warnings

Для памяти:

# Выдаётся предупреждение:
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead
# Это ложное срабатывание, его можно отключить. Его смысл - напомнить, что можно работать с копией а не с оригиналом, т.е. можно сделать через создание копии, или с loc.

pd.options.mode.chained_assignment = None

суббота, 10 ноября 2018 г.

football_champ_competitions


Попробовал принять участие в чемпионате-песочнице по ML. Придумал 2 признака, ни модель ни её параметры менять не стал. Сразу получил скор 0.9841 что сильно лучше стоящего на 1м местк (0.9959) Но последний сабмит датирован 3 августа, сейчас система не принимает, пишет что 'ошибка'.

Подожду, сгенерю признаки, ещё опущу скор.



upd
пока четвёртый, надо подняться


вторник, 30 октября 2018 г.


При скрапинге/кроулинге сайта админов может раздражать слишком большое число запросов, и они банят за такую активность. Вот нашёл советы, как скрыть повышенную активность.


пятница, 26 октября 2018 г.

ODSc



Мой индивидуальный проект в очень хорошем 4-месячном курсе обучения. Проект оценили на 36 балов из 40 возможных. Курс создан Юрием С. Кашницким.
Собственно, даю только ссылку.

Датасет был сложным - классификация на 3 класса, два целевых очень маленькие - 4.3 и 03%%. Но это и привлекло, хотелось попробовать разбалансированные выборки. Кроме того, надо был подобрать незаезженный учебный датасет + хотелось что-нибудь связанное с медициной.

Полученный результат нельзя назвать великим (по метрике recall 99%/57%/75%) но я изложил причины такой относительной неудачи, а также пути оптимизации результата. Видимо, это моим рецензентам и понравилось. 

В ближайшее время попробую улучшить результат, о чём здесь сообщу.



Года два назад написал API по доступу к сайту футбольной статистики Кулички. Это простенький сайт, чей дизайн не меняется уже 20 лет. Зато лёгкий, быстрый, умеренно информативный и очень популярный в России. API упаковано в виджет и даёт некоторые дополнительные возможности по сбору и анализу имеющейся на сайте информации. Всё происходит он-лайн за счёт парсинга.
Код представляет из себя пакет из 8 файлов, доступен на ГитХабе.



Первая функциональная вкладка: выбираем один из 12 чемпионатов, выбираем клуб из этого чемпионата, видим страны, чьи представители играют в этом клубе. Затем можно получить график для наглядности.

четверг, 25 октября 2018 г.

The system is running in low-graphics mode



История вопроса
Началось год назад. Система загружалась подолгу, потом появлялось предупреждение The system is running in low-graphics mode, потом пускала но без доступа к сети.  Возможно были ещё какие-то ограничения функциональности. В чём причина, осталось непонятным.
Помогала перезагрузка, потом нашёл кардинальное решение:

sudo apt-get install --reinstall unity-greeter
sudo dpkg-reconfigure lightdm


вторник, 23 октября 2018 г.

Стили для графиков


Настройки для графиков, небольшие но зрелищные.
Скорее всего, должны устанавливаться в глобальных настройках, я так и не разобрался где именно. Поэтому использую такие костыли.


sns.set(style="darkgrid")         # фоновая координатная сетка для графиков
data.plot(....edgecolor='black')      # цвет границ для диаграмм

Отключение предупреждений


Отключить предупреждения (например об устаревших модулях, которые скоро отменят)

import warnings
warnings.filterwarnings('ignore')

Конвертер дат


Написал конвертер дат.
Они бывают разные, обычно переводят с нашего юлианского календаря в мусульманский, иудейский, иранский, майя и т.д. Как старый франкофон, я сделал перевод даты во французский республиканский календарь.
Что это вообще такое 'французский республиканский календарь':
статья в Википедии.
- статья ещё интересней.

Виджет готов к работе

вторник, 16 октября 2018 г.



В Linux не отображаются некоторые красивые детали из QtGui: например QGroupBox (группировка объектов), QFrame()  и ещё некоторые. Всё вместе это называется Менеджеры компоновки. Т.е. они компонуют (т.е. группируют или упаковывают, по русски используют разные термины), но красивой окантовки (либо 'утопленного' участка на виджете, либо чего-то ещё привлекательного в Windows)  не получается. Прежде чем понял, потерял пару часов.

Надо будет посмотреть, как тут (в Линуксе) работают стили, но ничего хорошего уже не жду 👿

вторник, 18 сентября 2018 г.

Генераторы и итераторы (экстракт из М.Лутца)


Марк Лутц неоднократно писал о важности понимания генераторов и итераторов. Здесь я коротко изложу основные положения из важной главы № 20 книги "Изучаем python".




Отображение операций на последовательности и сбор результатов - очень частая задача. Можно это делать через:

  1. цикл for; 
  2. функциональное программирование (например функция map); 
  3. разовую функцию lambda. 
  4. Но лучше всего через генератор списка. Пример:
res = [ord(x) for x in 'spam']
res
[115,112,97,109]

В отличие от функции map генератор отображает выражение на последовательность и сразу выдаёт весь результат. Он гибкий (можно сделать вложенные циклы, можно обрабатывать вложенные списки т.е. матрицы) и быстрее всех аналогов.


Но может понадобится получать не все результаты сразу, а по требованию. Это возможно реализовать двумя способами.

Функция генератор и инструкция yield (глагол переводится как 'уступать').

Обычная функция возвращает всю последовательность сразу, после чего завершает работу. 
Функция-генератор приостанавливает и возобновляет выполнение работы, воспроизводя последовательность значений. При вызове возвращается объект генератора. 

def createGenerator():
    mylist = range(3)
    for i in mylist:
        yield i*i                                          # yield вместо return, т.е. замораживание  состояния

mygenerator = createGenerator()                                   # создать генератор
print(mygenerator)                                  
<generator object createGenerator at 0xb7555c34>      # выдаёт объект
for i in mygenerator:                                                       # итерируем объект но только 1 раз!
    print(i)
0
1
4

В 3-й версии языка появилась новая конструкция - выражение-генератор. Внешне похоже на генератор списков, но в круглых скобках. Возвращает объект-генератор, который поддерживает протокол итераций, возвращая по одному элементу списка за раз. Но тоже - можно его проитерировать только однократно.

 g = (x ** 2 for i in range(4))
 next(g)
0
 next(g)
1
 next(g)
2
 next(g)
3
 next(g)
StopIteration


Также в 3й версии языка добавились генераторы множеств и словарей. Они как генераторы списков - возвращают всю последовательность сразу.
Генератор множеств:
    {x*x for x in range(5)}
{0,1,4,9,16}
Генератор словаря:
    {x:x*x for x in range(5)}
{0:0, 1:1, 2:4, 3:9, 4:16}


понедельник, 17 сентября 2018 г.

from 'Nuances of programming'

Телеграм канал Nuances of programming иногда переводит статьи про python. Сенсационного там ничего нет, но бывают забавные факты. Вот очередные 'Полезные хитрости', из которых я вытянул несколько пунктов.

https://awesome-python.com/ 

не знал про такой сайт, действительно интересно

bashplotlib

Графики в консоли. Забавно, но по моему бессмысленно.

emoji
Эмодзи. То же самое, в смысле бессмысленно, есть документация.

geopy, dictance
Абстрагированиe API-интерфейсов различных сервисов геокодирования, что позволяет вам получать доступ к полному адресу нужного места, его широте, долготе и даже высоте. ..... Не вполне понимаю, но явно не скоро понадобится.

howdoi
Пишется в консоли вопрос (howdoi undo commits in git) а он выдирает ответ со стекоферфлоу, берёт оттуда самый популярный ответ. Не хочу показаться грубым, но это тоже скорее "курьёзы'

inspect, jedi
Понимание кода. Заодно скажу очередное спасибо Марку Лутцу, на этот раз за прекрасный термин 'интроспекция'.

newspaper3k
" ... может доставать новостные статьи и связанные с ними мета-данные из ряда ведущих международных изданий. Извлекать можно картинки, текст и имена авторов..." . Вот это прямо заинтересовало. Потестирую и расскажу.

sh
Минискриптовый язык, можно вызывать любую программу как обычную функцию . Альтернативы bash'у, смысла не вижу.

uuid
Универсальные Уникальные Идентификаторы. Видимо, что-то типа хеш-номера.

wikipedia
Доступ к API сайта.

xkcd
Шутки юмора от Монти Пайтона

yaml
Язык форматирования данных, расширенная версия json