Примеры кода на R — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Примеры алгоритмов)
(GBM)
(не показано 36 промежуточных версий этого же участника)
Строка 1: Строка 1:
  
 
== Особенности написания кода на R ==
 
== Особенности написания кода на R ==
Язык R изначально создавался как язык программирования для работы с графикой и статистической обработки данных. Поэтому он отличается большим количеством реализованных статистических алгоритмов, на основе которых можно создавать модели и алгоритмы машинного обучения.  
+
<code>Язык R</code> изначально создавался как язык программирования для работы с графикой и статистической обработки данных. Поэтому он отличается большим количеством реализованных статистических алгоритмов, на основе которых можно создавать модели и алгоритмы машинного обучения.  
  
 
Язык постоянно расширяется за счёт новых библиотек (пакетов). Для импорта одного пакета необходимо прописать в файле следующие строки:
 
Язык постоянно расширяется за счёт новых библиотек (пакетов). Для импорта одного пакета необходимо прописать в файле следующие строки:
Строка 15: Строка 15:
  
 
== Описание известных пакетов ==
 
== Описание известных пакетов ==
Для языка R написано много пакетов, каждый из которых предназначен для решения определенного круга проблем. Например, для обработки данных или реализации основных алгоритмов. В статье представлено несколько наиболее часто используемых пакетов.
+
Для языка <code>R</code> написано много пакетов, каждый из которых предназначен для решения определенного круга проблем. Например, для обработки данных или реализации основных алгоритмов. В статье представлено несколько наиболее часто используемых пакетов.
 
===Пакеты для обработки данных===
 
===Пакеты для обработки данных===
==== Pipelearner<ref>[https://github.com/drsimonj/pipelearner Pipelearner github repository]</ref> ====
+
==== Pipelearner ====
Пакет предоставляет базовые возможности для разбиения набора данных на блоки для обучения моделей. В основе пакета лежит концепция работы конвейера. Пакет хорошо документирован, все непонятные моменты можно прояснить, просто изучив структуру объекта на каждом этапе работы алгоритма.
+
Пакет <code>Pipelearner</code><ref>[https://github.com/drsimonj/pipelearner Pipelearner github repository]</ref> предоставляет базовые возможности для разбиения набора данных на блоки для обучения моделей. В основе пакета лежит концепция работы конвейера. Пакет хорошо документирован, все непонятные моменты можно прояснить, просто изучив структуру объекта на каждом этапе работы алгоритма.
  
==== MICE <ref>[https://cran.r-project.org/web/packages/mice/mice.pdf MICE package documentation]</ref>====
+
==== MICE ====
Пакет MICE используется для заполнения пропущенных значений в данных. При этом нет необходимости думать о типах значений: для каждого из них в пакете предусмотрено заполнение по умолчанию.  
+
Пакет <code>MICE</code><ref>[https://cran.r-project.org/web/packages/mice/mice.pdf MICE package documentation]</ref> используется для заполнения пропущенных значений в данных. При этом нет необходимости думать о типах значений: для каждого из них в пакете предусмотрено заполнение по умолчанию.  
==== Ggplot2 <ref>[https://cran.r-project.org/web/packages/ggplot2/index.html Ggplot2 main info page]</ref> ====
+
==== Ggplot2 ====
Данный пакет используется для отрисовки данных и графиков.  
+
Данный пакет<ref>[https://cran.r-project.org/web/packages/ggplot2/index.html Ggplot2 main info page]</ref> используется для отрисовки данных и графиков.  
 
=== Пакеты с реализованными алгоритмами машинного обучения ===  
 
=== Пакеты с реализованными алгоритмами машинного обучения ===  
==== Caret <ref>[http://topepo.github.io/caret/index.html Caret guide book]</ref> ====
+
==== Caret ====
В данном пакете представлены модели для регрессии и классификации, а также большая часть популярных метрик. В настоящее время имеется возможность использовать более 180 различных алгоритмов.  
+
В данном пакете <ref>[http://topepo.github.io/caret/index.html Caret guide book]</ref> представлены модели для регрессии и классификации, а также большая часть популярных метрик. В настоящее время имеется возможность использовать более 180 различных алгоритмов.  
Основная функция в составе Caret - функция train(). Параметры обучения в ней задаются аргументом trControl, а оценка качества модели - аргументом metric.
+
Основная функция в составе <code>Caret</code> — функция <code>train()</code>. Параметры обучения в ней задаются аргументом <code>trControl</code>, а оценка качества модели аргументом <code>metric</code>.
Отличительными особенностями Caret является универсальность используемых команд, наличие автоматического подбора гиперпараметров для алгоритмов, в также наличие параллельных вычислений.
+
Отличительными особенностями <code>Caret</code> является универсальность используемых команд, наличие автоматического подбора гиперпараметров для алгоритмов, в также наличие параллельных вычислений.
==== Mlr <ref>[https://cran.r-project.org/web/packages/mlr/mlr.pdf Mlr package documentation]</ref> ====
+
==== Party ====
В пакете Mlr представлены модели для регрессии, классификации, кластеризации и анализа выживаемости, а также  широкие возможности для оценки качества (в том числе функции для анализа ROC-кривых).
+
Пакет <code>Party</code> <ref>[https://cran.r-project.org/web/packages/party/index.html party package main info page]</ref> содержит в себе инструменты для рекурсивного разбиения данных на классы. В пакета также доступна расширяемая функциональность для визуализации древовидных регрессионных моделей.
 +
Основная функция пакета — <code>ctree()</code>, которая используется для создания деревьев решения для таких задач регрессии как номинальные, порядковые, числовые а также многовариантные переменные отклика. На основе деревьев условного вывода <code>cforest()</code> предоставляет реализацию ''случайных лесов Бреймана''. Функция <code>mob()</code> реализует алгоритм рекурсивного разделения на основе параметрических моделей (например, ''линейных моделей'', ''GLM'' или ''регрессии выживания''), использующих тесты нестабильности параметров для выбора разделения.
 +
 
 +
==== RandomForest ====
 +
<code>RandomForest</code> <ref>[https://cran.r-project.org/web/packages/randomForest/index.html RandomForest package main info]</ref> — пакет с реализацией алгоритма ''[[Дерево решений и случайный лес | randomForest]]''. Используется для решения задач регрессии и классификации, а также для поиска аномалий и отбора предикторов.
 +
 
 +
==== ClusterR ====
 +
Пакет <code>ClusterR</code> <ref>[https://cran.r-project.org/web/packages/ClusterR/vignettes/the_clusterR_package.html ClusterR documentation]</ref> состоит из алгоритмов кластеризации на основе центроидов (''k-means'', ''mini-batch-kmeans'', ''k-medoids'') и распределений (''GMM''). Кроме того, пакет предлагает функции для:
 +
* проверки результатов,
 +
* построения графика результатов, используя ''[[Оценка качества в задаче кластеризации |метрики]]''
 +
* прогнозирования новых наблюдения,
 +
* оценки оптимального количества кластеров для каждого алгоритма
 +
 
 +
==== E1071 ====
 +
Пакет <ref>[https://www.rdocumentation.org/packages/e1071/versions/1.7-3 1071 package documentation]</ref> содержит в себя функции для анализа классов, ''кратковременного преобразование Фурье'', ''нечеткой кластеризации'', реализации ''[[Метод опорных векторов (SVM) | SVM]]'', ''вычисления кратчайшего пути'', а также реализации ''наивного байесовского классификатора''.
 +
 
 +
==== Mlr ====
 +
В пакете <code>Mlr</code> <ref>[https://cran.r-project.org/web/packages/mlr/mlr.pdf Mlr package documentation]</ref> представлены модели для регрессии, классификации, кластеризации и анализа выживаемости, а также  широкие возможности для оценки качества (в том числе функции для анализа ''[https://en.wikipedia.org/wiki/Receiver_operating_characteristic ROC-кривых]'').
 
Есть поддержка параллельных вычислений и конвейерных операций.
 
Есть поддержка параллельных вычислений и конвейерных операций.
==== H2O <ref>[https://cran.r-project.org/web/packages/h2o/index.html H20 main info page]</ref> ====
+
 
В пакете представлены линейные модели, такие как градиентный бустинг, PCA, GLRM, KNN, Radom forest, наивный Байесовский классификатор. Сильная сторона этой библиотеки – работа с большими объемами данных и поддержка многопоточных вычислений.Однако в ней нет возможности задавать параметры используемых алгоритмов
+
==== H2O ====
 +
В пакете <code>H20</code> <ref>[https://cran.r-project.org/web/packages/h2o/index.html H20 main info page]</ref> представлены линейные модели, такие как ''[[Бустинг, AdaBoost |градиентный бустинг]]'', ''[[Метод главных компонент (PCA)|PCA]]'', ''GLRM'', ''KNN'', ''[[Дерево решений и случайный лес|RadomForest]]'', ''наивный Байесовский классификатор''. Сильная сторона этой библиотеки – работа с большими объемами данных и поддержка многопоточных вычислений. Однако в ней нет возможности задавать параметры используемых алгоритмов
  
 
== Примеры алгоритмов ==
 
== Примеры алгоритмов ==
В интернете много хороших примеров реализации алгоритмов на R, но среди них хотелось бы особо отметить один учебник<ref>[https://coderlessons.com/tutorials/kompiuternoe-programmirovanie/learn-r-programmirovanie/uchebnik-po-r Учебник по R]</ref> c портала coderlessons.com. В нем представлена реализация основных алгоритмов в порядке, удобном для изучения.   
+
В интернете много хороших примеров реализации алгоритмов на <code>R</code>, но среди них хотелось бы особо отметить один учебник<ref>[https://coderlessons.com/tutorials/kompiuternoe-programmirovanie/learn-r-programmirovanie/uchebnik-po-r Учебник по R]</ref> c портала coderlessons.com. В нем представлена реализация основных алгоритмов в порядке, удобном для изучения.   
 
=== Задачи регрессии ===
 
=== Задачи регрессии ===
 
==== Линейная регрессия ====
 
==== Линейная регрессия ====
 +
{{Main|Линейная регрессия|ll=Линейная регрессия}}
 
<pre>
 
<pre>
 
#$$reading data
 
#$$reading data
Строка 67: Строка 86:
  
 
==== Логистическая регрессия ====
 
==== Логистическая регрессия ====
Логистическая регрессия – это модель регрессии, в которой переменная ответа принимает значения 0 или 1 (True или False). Реализация на языке R представлена в следующем фрагменте:  
+
{{Main|Логистическая регрессия|ll=Логистическая регрессия}}
 +
Логистическая регрессия – это модель регрессии, в которой переменная ответа принимает значения 0 или 1 (True или False). Реализация на языке <code>R</code> представлена в следующем фрагменте:  
  
 
<pre>
 
<pre>
Строка 78: Строка 98:
 
#printing summary
 
#printing summary
 
print(summary(model))
 
print(summary(model))
 +
</pre>
 +
 +
=== PCA ===
 +
{{Main|Метод главных компонент (PCA)|ll=PCA}}
 +
<pre>
 +
#importing library and its' dependencies
 +
library(h2o)
 +
h2o.init()
 +
 +
path <- system.file("extdata", "data.csv", package = "h2o")
 +
data <- h2o.uploadFile(path = data)
 +
 +
#evaluating
 +
h2o.prcomp(training_frame = data, k = 8, transform = "STANDARDIZE")
 
</pre>
 
</pre>
  
 
=== Деревья решений, случайный лес ===
 
=== Деревья решений, случайный лес ===
 +
{{Main|Дерево решений и случайный лес |ll=деревьев решений}}
 
==== Деревья решений ====
 
==== Деревья решений ====
Для создания деревьев решений в R используется функция ctree из пакета party.  
+
Для создания ''[[Дерево решений и случайный лес |деревьев решений]]'' в <code>R</code> используется функция <code>ctree()</code> из пакета <code>party</code>.  
  
 
<pre>
 
<pre>
Строка 99: Строка 134:
  
 
==== Случайный лес ====
 
==== Случайный лес ====
Для создания случайного леса необходимо импортировать пакет randomForest
+
Для создания ''[[Дерево решений и случайный лес|случайного леса]]'' необходимо импортировать пакет <code>randomForest</code>
  
 
<pre>
 
<pre>
Строка 118: Строка 153:
  
 
=== Наивный Бейесовский классификатор ===
 
=== Наивный Бейесовский классификатор ===
 
+
{{Main|Байесовская классификация|ll=Байесовская классификация}}
 
<pre>
 
<pre>
 
#$$importing package and it's dependencies
 
#$$importing package and it's dependencies
Строка 143: Строка 178:
  
 
=== SVM ===
 
=== SVM ===
 +
{{Main|Метод опорных векторов (SVM)|ll=SVM}}
 
<pre>
 
<pre>
 
#$$ importing package and its' dependencies
 
#$$ importing package and its' dependencies
Строка 163: Строка 199:
 
#printing parameters
 
#printing parameters
 
print(fit)
 
print(fit)
 +
</pre>
 +
 +
=== GBM ===
 +
{{Main|Бустинг, AdaBoost|ll=Бустинг}}
 +
<pre>
 +
#loading libraries
 +
install.packages("mlr")
 +
library(mlr)
 +
 +
#loading data
 +
train <- read.csv("input.csv")
 +
test <- read.csv("testInput.csv")
 +
 +
#loading GBM
 +
getParamSet("classif.gbm")
 +
baseLearner <- makeLearner("classif.gbm", predict.type = "response")
 +
 +
#specifying parameters
 +
controlFunction <- makeTuneControlRandom(maxit = 50000)#specifying tuning method
 +
cvFunction <- makeResampleDesc("CV",iters = 100000) #definig cross-validation function
 +
 +
gbmParameters<- makeParamSet(
 +
makeDiscreteParam("distribution", values = "bernoulli"),
 +
makeIntegerParam("n.trees", lower = 100, upper = 1000), #number of trees
 +
makeIntegerParam("interaction.depth", lower = 2, upper = 10), #depth of tree
 +
makeIntegerParam("n.minobsinnode", lower = 10, upper = 80),
 +
makeNumericParam("shrinkage",lower = 0.01, upper = 1)
 +
)
 +
 +
#tunning parameters
 +
gbmTuningParameters <- tuneParams(learner = baseLearner, task = trainTask,resampling = cvFunction,measures = acc,par.set = gbmParameters,control = controlFunction)
 +
 +
#creating model parameters
 +
model <- setHyperPars(learner = baseLearner, par.vals = gbmTuningParameters)
 +
 +
#evaluating model
 +
fit <- train(model, train)
 +
predictions <- predict(fit, test)
 
</pre>
 
</pre>
  
 
=== Кластеризация ===
 
=== Кластеризация ===
Для реализации алгоритма кластеризации k-средних используется пакет ClusterR. В нем реализовано 2 функции:  KMeans_arma и KMeans_rcpp. В примере далее рассмотрена реализация с использованием функции KMeans_arma.
+
Для реализации алгоритма кластеризации ''k-средних'' используется пакет <code>ClusterR</code>. В нем реализовано 2 функции:  <code>KMeans_arma()</code> и <code>KMeans_rcpp()</code>. В примере далее рассмотрена реализация с использованием функции <code>KMeans_arma()</code>.
  
 
<pre>
 
<pre>

Версия 18:13, 23 апреля 2020

Особенности написания кода на R

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

Язык постоянно расширяется за счёт новых библиотек (пакетов). Для импорта одного пакета необходимо прописать в файле следующие строки:

install.packages("packageName")
require("packageName")

Для того чтобы импортировать пакет с его зависимостями в код следует включить следующие строки:

library("packageName")

Описание известных пакетов

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

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

Pipelearner

Пакет Pipelearner[1] предоставляет базовые возможности для разбиения набора данных на блоки для обучения моделей. В основе пакета лежит концепция работы конвейера. Пакет хорошо документирован, все непонятные моменты можно прояснить, просто изучив структуру объекта на каждом этапе работы алгоритма.

MICE

Пакет MICE[2] используется для заполнения пропущенных значений в данных. При этом нет необходимости думать о типах значений: для каждого из них в пакете предусмотрено заполнение по умолчанию.

Ggplot2

Данный пакет[3] используется для отрисовки данных и графиков.

Пакеты с реализованными алгоритмами машинного обучения

Caret

В данном пакете [4] представлены модели для регрессии и классификации, а также большая часть популярных метрик. В настоящее время имеется возможность использовать более 180 различных алгоритмов. Основная функция в составе Caret — функция train(). Параметры обучения в ней задаются аргументом trControl, а оценка качества модели — аргументом metric. Отличительными особенностями Caret является универсальность используемых команд, наличие автоматического подбора гиперпараметров для алгоритмов, в также наличие параллельных вычислений.

Party

Пакет Party [5] содержит в себе инструменты для рекурсивного разбиения данных на классы. В пакета также доступна расширяемая функциональность для визуализации древовидных регрессионных моделей. Основная функция пакета — ctree(), которая используется для создания деревьев решения для таких задач регрессии как номинальные, порядковые, числовые а также многовариантные переменные отклика. На основе деревьев условного вывода cforest() предоставляет реализацию случайных лесов Бреймана. Функция mob() реализует алгоритм рекурсивного разделения на основе параметрических моделей (например, линейных моделей, GLM или регрессии выживания), использующих тесты нестабильности параметров для выбора разделения.

RandomForest

RandomForest [6] — пакет с реализацией алгоритма randomForest. Используется для решения задач регрессии и классификации, а также для поиска аномалий и отбора предикторов.

ClusterR

Пакет ClusterR [7] состоит из алгоритмов кластеризации на основе центроидов (k-means, mini-batch-kmeans, k-medoids) и распределений (GMM). Кроме того, пакет предлагает функции для:

  • проверки результатов,
  • построения графика результатов, используя метрики
  • прогнозирования новых наблюдения,
  • оценки оптимального количества кластеров для каждого алгоритма

E1071

Пакет [8] содержит в себя функции для анализа классов, кратковременного преобразование Фурье, нечеткой кластеризации, реализации SVM, вычисления кратчайшего пути, а также реализации наивного байесовского классификатора.

Mlr

В пакете Mlr [9] представлены модели для регрессии, классификации, кластеризации и анализа выживаемости, а также широкие возможности для оценки качества (в том числе функции для анализа ROC-кривых). Есть поддержка параллельных вычислений и конвейерных операций.

H2O

В пакете H20 [10] представлены линейные модели, такие как градиентный бустинг, PCA, GLRM, KNN, RadomForest, наивный Байесовский классификатор. Сильная сторона этой библиотеки – работа с большими объемами данных и поддержка многопоточных вычислений. Однако в ней нет возможности задавать параметры используемых алгоритмов

Примеры алгоритмов

В интернете много хороших примеров реализации алгоритмов на R, но среди них хотелось бы особо отметить один учебник[11] c портала coderlessons.com. В нем представлена реализация основных алгоритмов в порядке, удобном для изучения.

Задачи регрессии

Линейная регрессия

Основная статья: Линейная регрессия
#$$reading data
data <- read.csv("input.csv", sep = ',', header = FALSE)

#evaluating linear regression model
model <- lm(data$x ~ data$y)

#getting summary 
print(summary(model))

#visualizing data 
plot(data$y, data$x)
lines(data$y, predict(fit), col = 'red')

Множественная регрессия

#$$reading data
rdata <- read.csv("input.csv", sep = ',', header = FALSE)

#evaluating regression model
model <- lm(target ~ x + y + z, data = rdata)

#getting summary 
print(summary(model))

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

Основная статья: Логистическая регрессия

Логистическая регрессия – это модель регрессии, в которой переменная ответа принимает значения 0 или 1 (True или False). Реализация на языке R представлена в следующем фрагменте:

#$$reading data
rdata <- read.csv("input.csv", sep = ',', header = FALSE)

#evaluating model
model = glm(formula = target ~ x + y + z, data = rdata, family = binomial)

#printing summary
print(summary(model))

PCA

#importing library and its' dependencies
library(h2o)
h2o.init()

path <- system.file("extdata", "data.csv", package = "h2o")
data <- h2o.uploadFile(path = data)

#evaluating
h2o.prcomp(training_frame = data, k = 8, transform = "STANDARDIZE")

Деревья решений, случайный лес

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

Для создания деревьев решений в R используется функция ctree() из пакета party.

#importing package 
install.packages("party")

#reading data
rdata <- read.csv("input.csv", sep = ',', header = FALSE)

#evaluating model
  output.tree <- ctree(target ~ x + y + z, data = rdata)

#plotting results
plot(output.tree)

Случайный лес

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

#importing packages 
install.packages("party")
install.packages("randomForest")

#reading data
rdata <- read.csv("input.csv", sep = ',', header = FALSE)

#creating the forest
output.forest <- randomForest(target ~ x + y + z, 
           data = rdata)

#getting results
print(output.forest) 

Наивный Бейесовский классификатор

#$$importing package and it's dependencies
library(e1071)

#reading data
data <- read.csv("input.csv", sep = ',', header = FALSE)

#splitting data into training and test data sets
index <- createDataPartition(y = data$target, p = 0.8,list = FALSE)
training <- data[index,]
testing <- data[-index,]

#create objects x and y for predictor and response variables
x = training[,-9]
y = training$target

#training model
model = train(x,y,'nb',trControl=trainControl(method='cv',number=10))

#predicting results
predictions <- predict(model, newdata = testing)

SVM

#$$ importing package and its' dependencies
library(caret)

#reading data
data <- read.csv("input.csv", sep = ',', header = FALSE)

#splitting data into train and test sets
index <- createDataPartition(y = data$target, p=0.8, list = FALSE)
training <- data[index,]
testing <- data[-index,]

#evaluating model 
fit <- train(target ~ x + y + z,
             data = train_flats,
             method = "svmRadial",
             trControl = trainControl(method = "repeatedcv", number = 10, repeats = 3))

#printing parameters
print(fit)

GBM

Основная статья: Бустинг, AdaBoost
#loading libraries
install.packages("mlr")
library(mlr)

#loading data
train <- read.csv("input.csv")
test <- read.csv("testInput.csv")

#loading GBM
getParamSet("classif.gbm")
baseLearner <- makeLearner("classif.gbm", predict.type = "response")

#specifying parameters
controlFunction <- makeTuneControlRandom(maxit = 50000)#specifying tuning method
cvFunction <- makeResampleDesc("CV",iters = 100000) #definig cross-validation function

gbmParameters<- makeParamSet(
makeDiscreteParam("distribution", values = "bernoulli"),
makeIntegerParam("n.trees", lower = 100, upper = 1000), #number of trees
makeIntegerParam("interaction.depth", lower = 2, upper = 10), #depth of tree
makeIntegerParam("n.minobsinnode", lower = 10, upper = 80),
makeNumericParam("shrinkage",lower = 0.01, upper = 1)
)

#tunning parameters
gbmTuningParameters <- tuneParams(learner = baseLearner, task = trainTask,resampling = cvFunction,measures = acc,par.set = gbmParameters,control = controlFunction)

#creating model parameters
model <- setHyperPars(learner = baseLearner, par.vals = gbmTuningParameters)

#evaluating model
fit <- train(model, train)
predictions <- predict(fit, test)

Кластеризация

Для реализации алгоритма кластеризации k-средних используется пакет ClusterR. В нем реализовано 2 функции: KMeans_arma() и KMeans_rcpp(). В примере далее рассмотрена реализация с использованием функции KMeans_arma().

#$$ importing package and its' dependencies
library(ClusterR)

#reading data
data <- read.csv("data.csv")

#evaluating model
model = KMeans_arma(data, clusters = 2, n_iter = 10, seed_mode = "random_subset", 
                 verbose = T, CENTROIDS = NULL)

#predicting results
predictions = predict_KMeans(test_data, model)

См. также

Примечания