Мнение
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)
Здесь несколько отличий:
- Процент наоборот — с функцией scikit-learn
train_test_split
указывается размер набора тестов. Ничего страшного, но нужно иметь в виду - X и y не дифференцируются (признаки и цель). Причина этого станет ясна в ближайшее время
- Запуск строки кода имеет вывод (в отличие от 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 связана с тем, что в данных Джулии для обучения используется меньше однократного кодирования и, следовательно, меньше измерений.
Опечатки
Стоит упомянуть некоторые вещи, которые не являются частью самого процесса обработки данных:
- Я не заметил никакой разницы в производительности, но данных достаточно мало, чтобы сделать это неубедительным.
- Я не считаю, что одно лучше другого (пока) — но я все еще мотивирован продолжать (теперь мне еще больше любопытно)
- R-подобный синтаксис был и хорош, и плох (или я хорошо и по-настоящему ориентирован на Python)
- Это вынудило меня выбрать Visual Studio Code Insiders — одно только это стоило входного билета.
Надеюсь, вам понравилось это наполовину так же, как и мне.
использованная литература
[1] Сингх, Кабир. (ND) Линейная регрессия в Джулии. https://www.machinelearningplus.com/linear-regression-in-julia/