Пошаговое руководство на R

1. Введение

Этот блог составляет раздел «Машинное обучение» другого блога. Вы можете найти основной блог здесь:

Https://medium.com/@deeganrobbie/nba-most-valuable-player-mvp-award-15c6cfe727ee

Это блог на основе учебных пособий, ориентированный в первую очередь на студентов начального и среднего уровней машинного обучения.

Двумя основными направлениями этого руководства являются выбор модели и повышение производительности модели. Для каждой модели существует «базовая версия» и «обновленная версия» модели. Ценность, которую это придает учебнику, исходит из обоснования улучшений модели.

Будет показан код базовой версии каждого алгоритма, а затем код обновленной версии. Базовая версия будет использовать разные пакеты R, а все обновленные версии будут использовать пакет Caret.

Пакет Caret позволяет вносить изменения, такие как перекрестная проверка, предварительная обработка данных и параметры настройки. (Как и многие другие полезные функции) Это позволяет упростить рабочий процесс.

Причина, по которой не все алгоритмы реализуются в пакете Caret, заключается в том, что пакет Caret поставляется с предопределенными функциями, которые автоматически улучшают вывод модели. Например, выполнение повторной выборки для оценки реалистичного R-квадрата и настройки параметров.

1.1 Гипотеза

Не существует единой статистики, которая определит, кто выиграет MVP. Будет некоторая комбинация статистических данных, которая решит, кто выиграет MVP. Машинное обучение поможет решить эту проблему.

На мой взгляд, есть две статистики, которые в совокупности определят, кто выиграет MVP. Комбинация наивысшего PER и нахождения в команде с 1 семенем. При этом я могу припомнить несколько примеров, когда это не так.

2 Подготовка данных

2.1 Веб-разборка

Пакет Rvest использовался для удаления веб-страниц на https://www.basketball-reference.com/

Поскольку код довольно длинный, я подумал, что предоставлю его в ссылке. По этой ссылке вы можете найти код вместе с CSV-файлами, созданными с помощью веб-скрапинга. Использование csv «big_5.csv» и «Test2020.csv» предоставит вам все необходимые данные для этого руководства.



Однако, если вам нужен только код для очистки веб-страниц и подготовки данных: WebScraping_DataPrep.R

  • Этот код R создает csvs - all.csv, big_5.csv, large_5.csv и king.csv.
  • Два дополнительных csvs - names.csv (необходим для объединения данных) и test.csv, который мы будем использовать, чтобы предсказать, кто победит в этом году.

В этом руководстве будет использоваться только код« Updated_Final.R »

Посмотрите мой документ «Источники» в том же репозитории Github. Этот документ содержит качественные ссылки на все темы, затронутые в руководстве.

2.2 Предварительная обработка данных

В этом проекте мы использовали предварительную обработку данных двумя способами.

  1. Очистка данных
  2. Использование пакета каретки для предварительной обработки очищенного набора данных, чтобы можно было правильно реализовать определенные алгоритмы машинного обучения.

После того, как мы собрали данные из веб-парсинга. Мы использовали несколько методов для очистки данных. Это включает предварительную обработку текста и объединение разных таблиц.
Здесь вы можете найти код: WebScraping_DataPrep.R

Ниже представлена ​​обновленная модель, в которой используется обработка.

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

  • «центр«: вычесть среднее из значений.
  • «масштаб«: разделите значения на стандартное отклонение.

2.3 Разработка функций

С субъективной точки зрения, обычно есть 5 основных кандидатов на звание MVP. В этой группе из 5 кандидатов (опять же субъективный # выбор) мы обычно сравниваем игроков, говоря: «Я считаю, что игрок X - лучший выбор для первого игрока, потому что он возглавляет других кандидатов в PPG и играет в команде с наибольшим количеством побед».

Это всего лишь один из способов, которым мы, фанаты НБА, оправдываем, почему определенный игрок должен выиграть MVP над другими кандидатами. Приведенный ниже код имитирует этот мыслительный процесс. Для этого сначала фильтруется наш набор данных, чтобы включить только 5 лучших кандидатов. Затем он ранжирует каждую статистику в течение года. Окончательный набор данных называется «big_5» и включает в себя всю обычную статистику плюс набор ранжированных столбцов. Сначала мы рассмотрим код, а затем посмотрим на первые 3 года (15 строк) набора данных big_5.

# Create a df that ranks where the MVPS ended up each year. The Rankings range from 1 - 5 because it's ranking the top 5 MVP canidates of each year
big_5 <- all %>%
  group_by(Year) %>%
  filter(Rank < 6) %>%
  mutate(Points_Rank = order(order(PTS, decreasing = T))) %>%
  mutate(Rebounds_Rank = order(order(TRB, decreasing = T))) %>%
  mutate(Assists_Rank = order(order(AST, decreasing = T))) %>%
  mutate(Steals_Rank = order(order(STL, decreasing = T))) %>%
  mutate(Blocks_Rank = order(order(BLK, decreasing = T))) %>%
  mutate(Per_Rank = order(order(PER, decreasing = T)))  %>%
  mutate(TS_Rank = order(order(TS., decreasing = T)))%>%
  mutate(WS_Rank = order(order(WS, decreasing = T)))%>%
  mutate(Wins_Rank = order(order(W, decreasing = T)))
# Turn into df
big_5 <- as.data.frame(big_5)
# If a column is a interger mutate it into a numeric
big_5 <- mutate_if(big_5, is.integer, as.numeric)
big_5$Sum <- rowSums(big_5[,27:34], na.rm=TRUE)
# Display first 15 rows of big_5 data set - created in previous step
head(big_five, 15)

На изображении ниже показаны первые 15 строк нового набора данных big_five. Я использовал краску, чтобы визуализировать, что здесь есть данные за 3 года. Чтобы сделать этот график более понятным, я сделал пример трех статистических данных - Points_rank, Rebounds_Rank и Assists_Rank.

  • Коричневый = 5 лучших кандидатов в 2000
  • Синий = 5 лучших кандидатов в 2001
  • Розовый = 5 лучших кандидатов в 2002.

Давайте посмотрим на самый последний столбец под названием «Сумма». Этот столбец представляет собой сумму столбцов «_Rank». Чем меньше сумма, тем лучше. Как видно из красного текста, это единственный столбец, который мы используем в процессе моделирования. (Однако вы можете использовать любые другие, если попробуете это)

2.4 Данные обучения и данные тестирования

В наших базовых моделях будет использоваться простое разделение на обучение / тестирование. В то время как наши обновленные модели будут включать 10-кратную перекрестную проверку.

Базовый подход:

На изображении выше показано разделение наборов для обучения и тестирования для наших базовых моделей. Наш обучающий набор будет использовать 75% наших данных, а наш тестовый набор будет включать 25% наших данных.

Модернизированный подход:

Мы разделим наши данные на два отдельных набора.

  1. Набор данных обучение (фиолетовый)
  2. Набор удержания. (золото)

Затем выполните 10-кратную перекрестную проверку набора обучающих данных (фиолетовый теперь разделен на синий и оранжевый). Наконец, мы сделаем прогноз для набора данных невидимого удержания.

' This code is how we implement 10-fold cross-validation on the training data set IN CARET !! '
# fit control
fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 10)

Пакет каретки позволяет нам создать функцию, выполняющую перекрестную проверку. trainControl () довольно гибкий, вы можете изменять параметры в соответствии с вашими потребностями.

3 Выбор модели

Нашими эталонными моделями будут логистическая регрессия, многоклассовая логистическая регрессия и полилинейная регрессия, поскольку они являются обычно используемыми и относительно базовыми моделями. Каждая модель будет смоделирована дважды. Сначала к алгоритму применяется «базовая» версия, затем следует «обновленная» версия алгоритма. Смысл «обновленного» алгоритма - показать, как можно улучшить модели. Каждая «модернизированная» модель будет сопровождаться обоснованием / объяснением того, как она была улучшена.

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

Логистическая регрессия

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

Чтобы улучшить модели логистической регрессии, вы можете использовать методы регуляризации, которые могут помочь избежать переобучения. Его можно использовать в качестве хорошей эталонной модели при сравнении других, более сложных алгоритмов машинного обучения. Одна вещь, на которую следует обратить внимание при реализации логистической регрессии, - это то, что она не может решать нелинейные проблемы.

* При сравнении модели логистической регрессии с моделью линейной регрессии интерпретация усложняется, поскольку интерпретация весов является мультипликативной, а не аддитивной

Полиномиальная логистическая регрессия

Модель полиномиальной логистической регрессии является расширением модели биномиальной логистической регрессии. Логарифмические шансы результатов моделируются как линейная комбинация переменных-предикторов. Преимущества и недостатки бинарной логистической регрессии также могут быть применены к полиномиальной логистической регрессии.

*** Полиномиальный используется, когда зависимая переменная имеет более двух номинальных (неупорядоченных) категорий. Поскольку ранг является упорядоченной переменной, более подходящим алгоритмом машинного обучения для реализации является порядковая логистическая регрессия.

Множественная линейная регрессия (MLR)

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

Древо решений

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

Некоторые преимущества моделей дерева решений включают в себя:

  • Они интуитивно понятны и легко объяснимы
  • Может моделировать нелинейные отношения
  • Достаточно устойчив к выбросам
  • Деревья решений требуют меньше усилий на этапе подготовки данных, поскольку не требуют нормализации или масштабирования данных.
  • В деревьях решений выбор функций происходит автоматически.

К недостаткам деревьев решений можно отнести:

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

Искусственные нейронные сети

«ИНС лучше всего применять к проблемам, в которых входные и выходные данные
хорошо понятны или, по крайней мере, достаточно просты, но процесс, связывающий входные и выходные данные, чрезвычайно сложен»
- Бретт Ланц

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

Заметным недостатком ИНС является то, что это алгоритм «черного ящика». Он не объясняет, почему и как появилась окончательно выбранная модель. Соответствующая структура сети может быть получена методом проб и ошибок.

4. Метрики точности модели.

Существует множество различных показателей точности, которые можно использовать для сравнения моделей. Кратко рассмотрим, какие метрики мы используем.

4.1 Классификация:

Мы собираемся рассмотреть 3 различных показателя точности для классификации. Для нашей бинарной задачи мы выделим все 3, поскольку каждый из них важен. Чувствительность является самым важным из трех. Для нашей многозначной задачи мы сосредоточимся на общей точности.

  1. Точность (все правильные / все) = TP + TN / TP + TN + FP + FN
  2. Чувствительность, также известная как отзыв (истинные положительные результаты / все фактические положительные результаты) = TP / TP + FN.
  3. Специфичность (истинные отрицательные / все фактические отрицательные значения) = TN / TN + FP
  • Чувствительность сообщает нам, какой процент игроков НБА, выигравших MVP, был правильно идентифицирован.
  • Конкретность сообщает нам, какой процент игроков НБА, не получивших награду MVP, был правильно идентифицирован.

В нашем наборе данных тестирования будет 20% MVP и 80% Not MVP. Мы предпочитаем модель с высокой чувствительностью%, поскольку мы занимаемся прогнозированием того, кто выиграет MVP.

4.2 Регрессия:

Для нашей задачи регрессии мы будем использовать 3 показателя точности при выводе результатов из различных моделей.

  1. RMSE (среднеквадратичная ошибка) - это квадратный корень из усредненной квадратичной разницы между целевым значением и значением, предсказанным моделью. Чем ниже значение, тем лучше модель. RMSE придает относительно большой вес большим ошибкам. Это означает, что RMSE должен быть более полезным, когда большие ошибки особенно нежелательны.

2. R-квадрат (коэффициент детерминации) показывает долю дисперсии в переменной результата, которая объясняется прогнозами. Как правило, чем выше значение, тем лучше модель.

3. MAE (средняя абсолютная ошибка) представляет собой разницу между исходными и прогнозируемыми значениями, извлеченными путем усреднения абсолютной разницы по набору данных. Чем ниже значение, тем лучше модель.

Насколько мне известно, не существует единой метрики точности, которую можно было бы использовать изолированно. Рекомендуется объединить эти три показателя!

5. Бинарная классификация

В наших двоичных данных 80 не-MVP и только 20 MVP. Если наши модели машинного обучения просто предсказывают «Нет», точность прогнозов все равно будет высокой (80%). Этот дисбаланс классов будет рассмотрен после более глубокого изучения нашей целевой переменной.

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

  • Семя, Сумма, W, WS, WS48

Техника передискретизации синтетических меньшинств (SMOTE) позволяет создавать новые синтетические наблюдения. Вновь сгенерированные экземпляры относительно близки по пространству функций к существующим примерам в классе меньшинства (иначе говоря, они придуманы, но похожи на настоящие). Увеличение количества наблюдений позволяет алгоритму машинного обучения узнавать больше, что приводит к лучшему пониманию данных. Стандартный подход к реализации SMOTE заключается в увеличении только класса меньшинства, но, поскольку в нашем наборе данных так мало наблюдений, мы увеличили классы меньшинства и большинства до 75 наблюдений. Это число было выбрано на основе экспериментов с несколькими итерациями. Мы просто покажем соотношение 75/75. (всего 150)

# SMOTE
over_2 <- SMOTE(Results ~., Train_C2, perc.over = 400, perc.under = 125, k = 5)
over_2$Results <- factor(over_2$Results, levels = c("MVP", "Not_MVP"))
# Check target variable's distribution
table(over_2$Results)
75 75 

Теперь наш набор обучающих данных over_2 содержит 150 целевых наблюдений. 75 наблюдений MVP и 75 наблюдений Not_MVP.

  • Важно подчеркнуть, что мы применяем алгоритм SMOTE только к набору обучающих данных.

5.1 Логистическая регрессия

Логистическая регрессия - это алгоритм бинарной классификации, который принадлежит к семейству обобщенных линейных моделей (GLM). Модель делает прогноз, возвращая вероятность целевого класса. Он использует пороговое значение, чтобы определить, к какой группе целевого класса принадлежит прогноз.

c_logistic_model2 <- glm(Results ~ ., data = Train_C2[,3:15], 
                                     family = binomial)

Наша базовая модель использует glm () из библиотеки glmnet. Мы используем все переменные, чтобы предсказать нашу целевую переменную (Результаты).

upgraded_c_logistic_model2 <- train(Results ~ .,data= over_2[,3:15], 
                                    method = "glmboost", 
                                    trControl = fitControl)

Установите glm, используя алгоритм повышения (в отличие от MLE). В отличие от функции glm, glmboost будет выполнять выбор переменных.

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка
  • Повышение

Результаты:

Хотя наша обновленная модель имела худшую специфичность, важно отметить, что общая точность и чувствительность увеличились.

Ниже приведен еще один способ визуализировать матрицу путаницы для моделей логистической регрессии. Представленные ниже визуализации ценны для заинтересованных сторон (поклонников НБА), поскольку они могут интуитивно понять, что алгоритм машинного обучения считает «MVP».

Точность наших моделей бинарной логистической регрессии. Это те же результаты, что и в приведенных выше матрицах путаницы!

Наша базовая модель неверно предсказывала, что Джейсон Кидд в 2002 году и Леброн в 2011 и 2017 годах были MVP. Он также предсказал, что Аллен Айверсон 2001 и Тим Дункан 2002 не были MVP, хотя на самом деле они были MVP.

Наша обновленная логистическая модель была более щедрой с предсказанием, что наблюдение будет MVP. Он неверно предсказал Нэша ’07, Леброна ’11, KD ’13 и Леброна ’17 как MVP, когда они не были MVP. Он также предсказал, что A.I не был MVP в 2001 году, когда он был, по сути, MVP.

5.2 Дерево решений

c_tree_model2 <- rpart(Results ~ ., data = Train_C2[,3:15])

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

upgraded_c_tree_model2 <- train(Results ~ ., data = over_2[,3:15],
                                method = "rpart",
                                tuneLength = 10,
                                trControl = fitControl)

Наша обновленная модель реализована с кареткой, но за кулисами она использует библиотеку rpart. Для нашей обновленной модели мы добавили tuneLength. Параметр tuneLength сообщает алгоритму попробовать разные значения по умолчанию для основного параметра.

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка
  • TuneLength

Результаты:

Наша обновленная модель улучшила общую точность и чувствительность, сохранив при этом специфичность.

5.3 Искусственные нейронные сети

Из пакета нейронной сети мы реализуем простую нейронную сеть, используя все доступные объясняющие переменные. Учитывая сложность нейронных сетей, в пакете нейронных сетей есть много возможностей для изучения.

c_ann_model2 <- neuralnet(Results ~ ., data = Train_C2[,3:15],
                                      hidden = c(2,1))

Хотя ожидается, что модель ИНС будет работать лучше, как вы можете видеть на графике выше, ее гораздо труднее интерпретировать.

Когда вы обучаете нейронную сеть (nnet) с помощью Caret, вам необходимо указать два гиперпараметра: размер и затухание. Распад - это уменьшение веса, имеется три значения настройки. Это параметр регуляризации, позволяющий избежать чрезмерной подгонки. Размер - это количество единиц в скрытом слое.

* Для нашей обновленной модели мы используем пакет nnet вместо пакета нейронной сети, что означает, что у нас нет доступа к тем же графикам. Мы не будем строить nnet-сеть, поскольку она не так удобна для пользователя. Это также относится к моделям ИНС разделов 6 и 7.

nnetGrid <-  expand.grid(size = seq(from = 1, to = 10, by = 1),
                       decay = seq(from = 0.1, to = 0.5, by = 0.1))
set.seed(4321)
## ANN model
upgraded_c_ann_model2 <- train(Results ~ ., data = over_2[,3:15],
                               method = "nnet",
                               trControl = fitControl,
                               preProcess = c('center', 'scale'),
                               tuneGrid = nnetGrid)

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка
  • preProcess
  • nnetGrid

Результаты:

Наша обновленная модель улучшила общую точность и чувствительность, сохранив при этом специфичность.

6. Многозначная классификация

В нашем наборе многозначных данных есть 5 групп; 1 место, 2 место, 3 место, 4 место и 5 место. В каждой группе по 20 экземпляров. Поскольку целевые данные распределяются равномерно, мы больше сосредоточимся на точности как метрике. Точность - хороший показатель, когда целевые классы переменных в данных почти сбалансированы.

При проверке зрения нижеприведенные переменные выглядят как переменные, у которых может быть четкое различие.

  • Семя, Сумма, WS, WS48

Для наших «модернизированных» моделей мы снова применили технику SMOTE. Обоснованием этого является то, что в отношении небольшого количества наблюдений мы чувствовали, что создание большего количества наблюдений поможет алгоритмам машинного обучения уловить лежащие в основе отношения.

# SMOTE
set.seed(4321)
over_5 <- SMOTE(Rank ~., Train_C5, perc.over = 200, perc.under = 420, k = 5)

SMOTE случайным образом генерирует синтетические наблюдения, что означает, что мы не сделали это распределение намеренно таким. Если вы хотите изменить распределение, измените «perc.under» или «perc.over» в формуле SMOTE (). (или измените set.seed (), поскольку он создается случайным образом)

Это довольно большой рост обучающих данных, но это произошло после экспериментов с другими результатами. Наши более консервативные наборы данных дали ~ 100 и ~ 140 наблюдений, но их точность была значительно хуже.

6.1 Полиномиальная логистическая регрессия

Из пакета nnet воспользуемся функцией multinom. Это соответствует полиномиальным лог-линейным моделям через нейронные сети.

c_log_model5 <- multinom(Rank ~ ., data = Train_C5[,3:15])

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

upgraded_c_log_model5 <- train(Rank ~  ., data = over_5[,3:15],
                               method = 'multinom',
                               trControl = fitControl)

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка

Результаты:

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

6.2 Деревья решений

c_tree_model5 <- rpart(Rank ~ ., data = Train_C5[,3:15])

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

upgraded_c_tree_model5 <- train(Rank ~ ., data = over_5[,3:15],
                                method = "ctree",
                                trControl = fitControl)

Наша обновленная модель реализована с помощью Caret, но за кулисами она использует партийную библиотеку. Поскольку он не использует пакет rpart, мы не сможем построить дерево решений. В Ctree есть сюжетная функция, но она не так удобна для пользователя.

Улучшения включают

  • ctree вместо rpart (партийная библиотека вместо библиотеки rpart)
  • Smote data
  • 10-кратная перекрестная проверка

Результаты:

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

6.3 Искусственные нейронные сети

c_ann_model5 <- nnet(Rank ~  ., data = Train_C5[,3:15], size = 1)

Наша базовая модель ann использует пакет neural nnet для моделирования наших данных.

nnetGrid <-  expand.grid(size = seq(from = 1, to = 10, by = 1),
                       decay = seq(from = 0.1, to = 0.5, by = 0.1))
set.seed(4321)
# ANN model
upgraded_c_ann_model5 <- train(Rank ~  ., data = over_5[,3:15],
                               method = "nnet",
                               preProcess = c('center', 'scale'),
                               tuneGrid = nnetGrid,
                               trControl = fitControl)

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка
  • предварительная обработка
  • nnetGrid

Результаты:

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

7 Регресс

Наша целевая переменная для нашей задачи регрессии - Points_Won. На приведенном ниже рисунке ось Y показывает, сколько очков набрал кандидат, а ось X показывает другую статистику. Вы можете узнать, что такое ось X, посмотрев на заголовок (вверху посередине) каждого вспомогательного участка.

Вопрос: Если вы исследуете каждый участок, найдете ли вы какой-либо с линейной зависимостью?

Чтобы быть абсолютно уверенным в переменных линейной зависимости, мы также будем использовать корреляционную матрицу (поверх диаграммы разброса выше). Результаты помогут нам решить, какие переменные выбрать для нашей модели MLR.

# Correlation Matrix - Visual first
ggcorr(Train_r[,3:15], label = TRUE, label_size = 2.9, hjust = 1, layout.exp = 2)

Способ чтения этого изображения тем ближе к 1 или -1, чем больше коррелированы переменные друг с другом. Число корреляции, близкое к нулю, означает отсутствие линейной зависимости. Наша цель - найти переменные, которые коррелируют с «Points_Won». Мы делаем это, просматривая последнюю строку и ища поля с #, наиболее близкими к 1 или -1.

Чтобы подтвердить, какие переменные наиболее коррелируют со столбцом «Points_Won», мы выполнили матрицу корреляции для случайно выбранных обучающих данных. Поскольку это случайная выборка, мы подумали, что лучше всего выполнить выборку 5 раз и выбрать две переменные с наибольшей корреляцией с Points_Won.

# Correlation Matrix - Ran 5 times randomly 
cor(Train_r[,2:14])

Каждый столбец представляет собой новую коррелированную матрицу. Два самых высоких выделены в каждом столбце. Поскольку данные выбираются случайным образом, существует различие в корреляции от столбца к столбцу. После 5 прогонов кажется, что доля выигрышей (WS) и выигрыши (W) будут двумя переменными, на которых мы построим нашу модель MLR.

7.1 Мультилинейная регрессия

Наша базовая модель mlr использует пакет lm.

r_mlr_model <- lm(Points_Won ~ WS + W, data = Train_r)

Наша обновленная модель использует пакет glmnet для моделирования нашей обновленной модели mlr. Эластичная сетка сочетает в себе недостатки регресса гребня и лассо, чтобы получить лучшее из обоих миров. Elastic Net стремится минимизировать следующую функцию потерь:

где α - параметр смешивания между гребнем (α = 0) и лассо (α = 1).

# Make a custom tuning grid
tuneGrid <- expand.grid(alpha = 0:1, lambda = seq(0.0001, 1,
                        length = 10))
upgraded_r_mlr_model <- train(Points_Won ~., data = Train_r[,3:15],
                              method = "glmnet",
                              trControl = fitControl,
                              tuneGrid = tuneGrid)

Улучшения включают

  • 10-кратная перекрестная проверка
  • tuneGrid
  • Эластичная сетка

Результаты:

Наша обновленная модель привела к намного лучшим RMSE, R-квадрат и MAE.

7.2 Дерево решений

Наша базовая модель дерева решений использует пакет rpart.

r_tree_model <- rpart(Points_Won ~., data = Train_r[,3:15])

В нашей обновленной модели используется тот же пакет rpart, но добавлена ​​10-кратная перекрестная проверка через пакет каретки. Обе модели используют одни и те же объясняющие переменные.

upgraded_r_tree_model <- train(Points_Won ~., data = Train_r[,3:15],
                               method = "rpart",
                               trControl = fitControl)

Улучшения включают

  • 10-кратная перекрестная проверка

Результаты:

Наша обновленная модель привела к намного лучшим RMSE, R-квадрат и MAE.

7.3 Искусственная нейронная сеть

Наша Исходная модель ANN использует пакет nnet.

r_ann_model <- nnet(Points_Won ~ ., data = Train_r[,3:15], size =1)

Наша обновленная модель использует тот же пакет nnet, но добавляет несколько модификаций через пакет Caret. Обе модели используют одни и те же объясняющие переменные.

# Make a custom tuning grid
nnetGrid <-  expand.grid(size = seq(from = 1, to = 10, by = 1),
                         decay = seq(from = 0.0001, to = 0.5, by = 0.1))
set.seed(4321)
# ANN model
# You need to add ' linout = 1' to make it a regression model or else you'll only get 1 for an output
upgraded_r_ann_model <- train(Points_Won ~ ., data = Train_r[,3:15],
                              method = "nnet",
                              trControl = fitControl,
                              linout = 1,
                              tuneGrid = nnetGrid,
                              preProcess = c('center', 'scale'))

При обучении нейронной сети (nnet) с помощью Caret вам необходимо указать два гиперпараметра: размер и затухание. Размер - это количество единиц в скрытом слое (nnet соответствует одной нейронной сети скрытого слоя), а затухание - это параметр регуляризации, чтобы избежать чрезмерной подгонки.

Улучшения включают

  • Smote data
  • 10-кратная перекрестная проверка
  • предварительная обработка
  • nnetGrid

Результаты:

Наша обновленная модель привела к намного лучшим RMSE, R-квадрат и MAE.

8 Прогноз на кандидатов на звание MVP 2020

Мы возьмем лучшую модель из разделов 5 (Двоичные), 6 (Мультиклассы) и 7 (Регрессия) для прогнозирования данных Final_Test. Они считаются «лучшими моделями», потому что они дают самые высокие показатели точности (которые мы обсуждали в соответствующих разделах).

Ниже приведены результаты:

Как вы понимаете, явным фаворитом является Яннис, за ним следует Леброн. Согласно нашим моделям, Энтони Дэвис займет 3-е место в голосовании за MVP.

9 Краткое содержание (TLDR)

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

Вот список вещей, которые я с нетерпением жду исследования после публикации этого блога:

  1. Реализация порядковой полиномиальной логистической регрессии
  2. В моем следующем проекте машинного обучения будет гораздо больше данных. Это приведет к тому, что вы увидите истинное значение параметров настройки.
  3. Существует множество методов выборки для балансировки данных. SMOTE - лишь один из них. Поскольку нет единой лучшей техники. Я бы хотел поэкспериментировать с другими в будущем.