Правильно, дамы и господа, представляем: первую модель Lathe.jl, и неудивительно; это линейная регрессия.

Julia - фантастический, мощный язык (особенно если вам нравится программировать платы Arduino). С учетом сказанного, учитывая, что Julia в значительной степени функциональный язык, его почти гениальная базовая структура делает его очень удобным для того, что традиционно было бы считается объектно-ориентированным программированием. Однако относительно слабая целевая аудитория Юлии - специалисты по данным.

Хотя у многих ветеранов Джулии может не быть проблем с Pkg.add () - с семью разными пакетами для 3 разных моделей, это оказалось моей самой большой проблемой для Джулии. У Джулии есть совершенно фантастический (не говоря уже о простом) пакет Flux.jl для градиентов, распознавания изображений и всего такого забавного, но, к сожалению, я чувствую, что пакеты не подходят для прогнозирующего машинного обучения, особенно обучения без учителя. С моими планами изменить это, поместив множество инструментов для анализа данных в одном месте для Юлии Data-Scientists (включая меня), я закончил тем, что запустил небольшой пакет, сначала это было несколько скаляров, t-тест, f-тест. , и в какой-то момент я перешел к мысли о создании собственного модельного модуля, что произошло за последние 2 месяца.

Хотя я не думаю, что мой пакет меняет жизнь (пока), я думаю, что даже в его предварительном выпуске я все же предпочитаю использовать его, а не более традиционные варианты, которые может предложить Джулия (в основном в интересах мое локальное хранилище.) Итак, сегодня я с гордостью представляю вам официальный сайт SimpleLinearRegression от Lathe.jl.

Если вы хотите попробовать Lathe.jl в его текущем состоянии, он здесь. Ноутбук, в который я поместил эту модель, находится здесь. »Я решил начать этот проект с использования масштабированных данных. Хотя есть веские аргументы против создания и использования масштабированных данных для тестирования модели (поскольку это изобретение - утечка), это отличный способ проверить, может ли ваша линейная модель найти простой наклон. В качестве наклона я выбрал 250, сгенерировал кучу случайных чисел и в цикле for умножил все итерации на 250.

Конечно, сгенерированные данные всегда чистые, поэтому я сразу приступил к получению базовой линии для моей модели:

using Lathe: models
# Our y is going to be Price,
#    Our x is going to be Doors:
# Fitting our model:
model = models.meanBaseline(traindf.Price)

Бум, вот так, подходящая модель. Конечно, следующий шаг - это прогноз нашего поезда:

# Put our model, and our xtrain into our predict method
testdf.Baseline = models.predict(model,testdf.Doors)

Легко, так какой точности мы можем ожидать?

accuracy = Validate.mae(testdf.Price,testdf.Baseline)
println("Baseline accuracy: ",accuracy)
Baseline accuracy: -41321.739130434784

Наша средняя абсолютная ошибка составила около 41 000, что очень плохо. Но, конечно, этого следовало ожидать, и меня еще больше взволновала проверка реальной модели. Так что давай сделаем это !:

# Fitting our model:
linreg = models.SimpleLinearRegression(traindf.Doors,traindf.Price)
# Put our x and y into the predict method:
testdf.Prediction = models.predict(linreg,testdf.Doors)

И вам, вероятно, интересно, как это повлияло на нашу среднюю абсолютную ошибку?

linaccuracy = Validate.mae(testdf.Price,testdf.Prediction)
println("Linear Regression Accuracy: ",linaccuracy)
Linear Regression Accuracy: 0.0

Правильно, 0,0. Если вы экстраординарный специалист в области науки о данных, вы, вероятно, понимаете, почему это 0. Помните, я сказал, что это масштабированные данные? Независимо от того, что показывает этот пример, наша модель смогла вычислить наклон нашего линейного уравнения. Конечно, это здорово! В реальном мире это тоже бесполезно, но, по крайней мере, у меня есть повод сделать несколько крутых визуализаций!

Наклон линий практически идентичен, чего и следовало ожидать при средней абсолютной ошибке, равной нулю. И, конечно же, вот наша довольно забавная базовая модель:

Данные из реального мира

Теперь, наконец, пришло время применить модель к некоторым реальным данным. Это то, что я люблю и ненавижу делать, потому что некоторые наборы данных действительно требуют от вас нестандартного мышления, а с другими просто утомительно работать. Для своих данных я выбрал набор данных New York от Kaggle. Как ни странно, этот набор данных по какой-то причине показался мне немного знакомым, мне казалось, что я уже работал с ним раньше. Однако я не думаю, что это так. Я думаю, что набор данных, который я имел в виду, был просто набором данных по той же теме.

Я свернул набор данных и проверил все отсутствующие значения, но не нашел ни одного.

df = DataFrame(:LotArea => df.LotArea, :SalePrice => df.SalePrice, 
    :YearBuilt => df.YearBuilt,:YearSold => df.YrSold, :Rooms => df.TotRmsAbvGrd)

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

Было две особенности, которые действительно напрямую соответствовали моей продажной цене. Год постройки и Площадь участка, поэтому я разделил данные и выполнил F-тест на них обоих. Оба они показали сильную статистическую значимость, я в итоге выбрал Lot Area изначально для моей функции x, входящей в модель. Я подумал, что было бы интереснее сопоставить оба и сравнить результаты, чем просто сопоставить один (это вдвое больше!)

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

# Fit our model once again:
using Lathe: models
model = models.meanBaseline(df.SalePrice)

Затем я создал пустой DataFrame для обработки всех входящих данных из моих различных методов прогнозирования.

# we'll have a new dataframe for our predictions
using DataFrames
predictions = DataFrame()
predictions.Baseline = models.predict(model,testdf.SalePrice)

После этого мы, конечно, проверяем:

using Lathe: Validate
baseline_accuracy = Validate.mae(testdf.SalePrice,predictions.Baseline)
println("==========>")
println("Baseline Accuracy - ",baseline_accuracy)
println("==========>")
==========>
Baseline Accuracy - 1.9455711319021984e-11
==========>

И вау! Ужасная точность! Конечно, я прыгнул, чтобы подогнать под модель и сравнить эти оценки.

# Fit our new model!
model = models.SimpleLinearRegression(testdf.LotArea,testdf.SalePrice)
# And we'll check out what that looks like:
predictions.Prediction = models.predict(model,testdf.LotArea)

И я приступил к подтверждению того, что:

BasePredAccuracy = Validate.mae(testdf.SalePrice,predictions.Prediction)
println("=========>")
println("Baseline Accuracy: ",baseline_accuracy)
println("-------------------")
println("Model Accuracy: ",BasePredAccuracy)
println("=========>")
=========>
Baseline Accuracy: 1.9455711319021984e-11
-------------------
Model Accuracy: 173848.28232265453
=========>

Так здорово, что точность модели значительно выше базовой.

Я пробовал некоторую предварительную обработку с помощью Re-Scalar, но действительно кажется, что Z-скаляр необходим для значительного повышения точности. Но, конечно, я не смог бы закрыть без дополнительных визуализаций.

В заключение, я очень взволнован за будущее токарного станка. Эта модель является началом многих, а текущая статистика - началом многих других. Для меня Lathe значительно упрощает машинное обучение в Julia. Я надеюсь, что он сделает то же самое для других в будущем, и если есть какие-то улучшения, которые вы хотели бы внести, не стесняйтесь форкнуть его здесь.