Мнение

Python против Джулии — линейная регрессия

Взгляд программиста на Python

Мое путешествие в науку о данных началось во время получения степени магистра в области науки о данных в университете Белвью, где я изучил R и Python. Хотя я довольно серьезный сторонник Python, это не самый быстрый язык программирования, который я когда-либо использовал (и не самый медленный). Но я много слышал о скорости Джулии, поэтому начал с ней экспериментировать. Я даже написал статью на Medium.com о том, как начать работать с Джулией. Должен признаться, я оставил эту статью без особого впечатления о Джулии, потому что не сделал из нее ничего полезного.

Но, как я уже говорил в предыдущих статьях, мне нравится конкуренция. Это вдохновляет меня. Пусть игры начнутся с чего-то, к чему я могу относиться — построения модели линейной регрессии и определения того, что быстрее, лучше и проще. (Отмечая здоровую дозу предвзятости, с которой это связано, поскольку я уже ежедневно использую Python.)

Импорт пакетов

Импорт пакетов в Julia очень похож на R — я тоже могу добавить пакет, если его нет, или просто использовать его, если он есть. Пакет Pkg позволяет мне добавлять пакеты, как pip в Python.

Первые впечатления — Юля

Сходство между Julia и R для импорта (скорее, using) сразу же заставило меня задуматься, не является ли Julia гибридом между Python и R (если это так, я думаю, что понимаю, почему люди копают Julia).

Но на данный момент у меня нет действительно значительного впечатления, просто подозрение, что мне понравится Джулия, потому что мне действительно нравится интуитивность R больше, чем Python.

Загрузка CSV-файла

Данные, которые я использую для этого, взяты из Data for Machine Learning with R GitHub, которые можно найти здесь. Одна вещь, которая одинакова между Julia и Python, заключается в том, что пути к каталогам не совсем просты в Visual Studio Code, поэтому мне пришлось выяснить, в каком каталоге находится интерпретатор, прежде чем я мог указать путь к данным. файл. Если вам интересно, как я заставил Джулию работать в Visual Studio Code, ознакомьтесь со статьей Начало работы, о которой я упоминал ранее.

Чтобы выяснить текущий рабочий каталог в Julia, я запустил REPL с помощью команды julia в терминале (который является интерпретатором, эквивалентным вводу python). Затем я ввел pwd(), точно такую ​​же команду, как и Python. (И эта начальная картинка командной строки такая же, как в 1980-х — обожаю ее.)

Загрузить файл .csv в Julia достаточно просто, а затем использовать его в типе данных еще проще. На самом деле в Джулии есть пакет DataFrames, который немного похож на Pandas.

Описание данных

Функция Julia describe() похожа на комбинацию describe() и info из Pandas DataFrames. Похоже, нет ничего точно такого же, как Pandas info(), но это и не требуется, учитывая вывод describe() в Julia.

Мне не нравится вывод describe(), но я думаю, что предпочитаю разделение info() и describe() в Python — возможно, это просто чтение данных по строкам. (Или это может быть просто предвзятость знакомства.)

Отображение первого числа строк также одинаково для Джулии и Python. Однако синтаксис Julia немного отличается.

println(first(insurance_df,5))

Мне очень нравится то, как он расположен со строками и типами данных для каждого столбца, указанными и красиво отформатированными. Подождите. О нет. Я думал, что мои дни println давно позади. Зачем использовать семь букв, если пять будут работать? Да ладно — печать println у Джулии.

Пока я не забыл, если вы заинтересованы в использовании Julia в Visual Studio Code Jupyter Notebooks, обязательно получите Visual Studio Code — Insiders. (Довольно мило.)

Разработка функций (легкая)

Я не собираюсь слишком углубляться в исследовательский анализ данных с Джулией на этом этапе, потому что это разбавит сравнение между Джулией и Python для регрессии. (Я планирую покопаться в этом позже.)

Тем не менее, мне нужно сразу закодировать категориальные функции. В Python это будет означать пол, курильщик и регион. Тем не менее, Джулия может работать с бинарными строками, такими как yes/no male/female и true/false, без каких-либо инженерных разработок. (Плюс одна Джулия.) Остается только функция региона для горячего кодирования.

Я собираюсь использовать для этого функцию OneHotEncoder пакета Lathe. Lathe — это пакет ML/stats для Юлии (и это, честно говоря, все, что я о нем знаю).

Горячее кодирование

Горячее кодирование очень похоже между Julia и Python (если сравнивать его с Pandas get_dummies() — Julia короче, если сравнивать его с OneHotEncoder, основанным на scikit-learn.

Результат заметно отличается, даже по сравнению с get_dummies().

Обратите внимание, что строки остаются нетронутыми для всех бинарных функций, включая закодированную функцию region. Я предпочитаю это, потому что чтение просто более интуитивно.

Этап моделирования

Как и в случае с Python, мне все еще нужно разделить данные для обучения и тестирования. В Lathe есть объект TestTrainSplit, который ранее был добавлен с помощью команды using.

train, test = TrainTestSplit(insurance_df,.75)

Здесь несколько отличий:

  1. Процент наоборот — с функцией scikit-learn train_test_split указывается размер набора тестов. Ничего страшного, но нужно иметь в виду
  2. X и y не дифференцируются (признаки и цель). Причина этого станет ясна в ближайшее время
  3. Запуск строки кода имеет вывод (в отличие от scikit-learn) — вывод важен, как запуск describe() как для поезда, так и для тестовых данных.

Подгонка и тестирование модели — вот где действительно проявляется R-подобный характер Джулии.

Я не поклонник синтаксиса функции R «@» (у меня дергается глаз, когда я вспоминаю свои дни в качестве разработчика Lotus Notes). Тем не менее, это достаточно просто и так же легко предсказать (но я определенно предпочитаю, чтобы fit и predict вызывались явно, как в Python).

Еще кое-что отличается при подгонке и тестировании модели — есть автоматический вывод, который включает в себя функцию и коэффициенты. (Мне больше нравится эта часть — тоже очень R-подобная.)

Оценка модели

Для этой простой (множественной) линейной регрессии я оценил модель с помощью R2 с помощью одной строки кода, что так же просто делается с помощью Python.

println(“\nR2 for the linear regressor: “, r2(linear_regressor))

Результат:

R2 for the linear regressor: 0.7514530856688412

Интересно, что результат для той же модели, созданной в Python:

R2 for the linear regressor: 0.7424

Я предполагаю, что небольшая разница R2 связана с тем, что в данных Джулии для обучения используется меньше однократного кодирования и, следовательно, меньше измерений.

Опечатки

Стоит упомянуть некоторые вещи, которые не являются частью самого процесса обработки данных:

  1. Я не заметил никакой разницы в производительности, но данных достаточно мало, чтобы сделать это неубедительным.
  2. Я не считаю, что одно лучше другого (пока) — но я все еще мотивирован продолжать (теперь мне еще больше любопытно)
  3. R-подобный синтаксис был и хорош, и плох (или я хорошо и по-настоящему ориентирован на Python)
  4. Это вынудило меня выбрать Visual Studio Code Insiders — одно только это стоило входного билета.

Надеюсь, вам понравилось это наполовину так же, как и мне.

использованная литература

[1] Сингх, Кабир. (ND) Линейная регрессия в Джулии. https://www.machinelearningplus.com/linear-regression-in-julia/