Изменения

Перейти к: навигация, поиск

Примеры кода на R

16 429 байт добавлено, 00:00, 16 декабря 2020
Небольшие правки + замена англоязычных терминов
== Особенности написания кода на R ==
<code>Язык R </code> изначально создавался как язык программирования для работы с графикой и статистической обработки данных. Поэтому он отличается большим количеством реализованных статистических алгоритмов, на основе которых можно создавать модели и алгоритмы машинного обучения.
Язык постоянно расширяется за счёт новых библиотек (пакетов). Для импорта одного пакета необходимо прописать в файле следующие строки:
<pre> install.packages(<font color="green">"packageName"</font>) require(<font color="green">"packageName")</prefont>)
Для того чтобы импортировать пакет с его зависимостями в код следует включить следующие строки:
<pre> library(<font color="green">"packageName")</prefont>)
== Описание известных пакетов ==
Для языка <code>R </code> написано много пакетов, каждый из которых предназначен для решения определенного круга проблем. Например, для обработки данных или реализации основных алгоритмов. В статье представлено несколько наиболее часто используемых пакетов.
===Пакеты для обработки данных===
==== Pipelearner ====
Пакет <code>Pipelearner</code><ref>[https://github.com/drsimonj/pipelearner Pipelearner github repository]</ref> предоставляет базовые возможности для разбиения набора данных на блоки для обучения моделей. В основе пакета лежит концепция работы конвейера. Принцип работы очень прост и описывается 3 шагами: # '''Инициализация'''#: Функция <code>pipelearner()</code> инициализирует новый объект, который используется в следующих функциях обработки. На этом этапе необходимо указать датасет, с которым производится работа. Также можно указать набор обучающих моделей и предсказываемую модель данных.# '''Настройка'''#: Для настройки есть 3 основных функции:#* <code>learn_cvpairs()</code> отвечает за [[Кросс-валидация|кросс-валидацию]]. Функция генерирует набор пар из тестовой и обучающей выборки на основе входного датасета. #: В качестве ядра разделения можно использовать <code>crossv_mc</code> ([[Кросс-валидация#Случайные разбиения (Random subsampling)|случайные разбиения]]), <code>crossv_kfold</code> ([[Кросс-валидация#k-fold кросс-валидация|k-fold кросс-валидация]]) или <code>crossv_loo</code> ([[Кросс-валидация#Кросс-валидация по отдельным объектам (Leave-One-Out)|leave-one-out разбиения]]) из пакета <code>modelr</code><ref>[https://github.com/tidyverse/modelr Modelr github repository]</ref>. Но если данных способов недостаточно, можно написать свою функцию разбиения.#* <code>learn_curves()</code> служит для настройки [[Переобучение#Кривые обучения|кривых обучения]]. Используется метод увеличивающихся пропорций относительно начала датасета.#: Например, вызов <code>learn_curves(.5, .75, 1)</code> создаст <tex>3</tex> сценария работы: в первом будет взята первая половина выбоки, во втором {{---}} первые <tex>\frac{3}{4}</tex> объектов, и в третьем {{---}} вся выборка. Авторы пакета утверждают, что брать случайные объекты выборки не имеет смысла, потому что выборка уже случайно разбита с помощью <code>learn_cvpairs()</code>.#* <code>learn_models()</code> предназначен для добавления новых обучающих моделей. # '''Обучение'''#: С помощью функции <code>learn()</code> все сконструированные ранее модели обучаются и выдается таблица результатов работы В итоге работа с пакетом выглядит приблизительно следующим образом: <font color="gray"># Load the dependencies</font> library(pipelearner) library(dplyr) iris %>% <font color="gray"># Use iris dataset</font> pipelearner() %>% <font color="gray"># Initialize a blank pipelearner object</font> learn_cvpairs(crossv_mc, <font color="#660099">n</font> = <font color="blue">50</font>) %>% <font color="gray"># Creating 50 random cross-validation pairs </font> learn_curves(seq(<font color="blue">.5</font>, <font color="blue">1</font>, <font color="#660099">by</font> = <font color="blue">.1</font>)) %>% <font color="gray"># Copy each cv-pair to be fitted in sample size proportions of .5 to 1 in increments of .1.</font> learn_models(lm, Sepal.Width ~ .*.) %>% <font color="gray"># Use regression modell</font> learn_models(rpart::rpart, Sepal.Width ~ .) %>% <font color="gray"># Use decision tree modell</font> learn() <font color="gray"># Fit all models on all partitions and return the results</font> Пакет хорошо документирован, все непонятные моменты можно прояснить, просто изучив структуру объекта на каждом этапе работы алгоритма.
==== MICE ====
Пакет <code>MICE</code><ref>[https://cran.r-project.org/web/packages/mice/mice.pdf MICE package documentation]</ref> используется для заполнения пропущенных значений в данных. При этом нет необходимости думать о типах значений: для каждого из них в пакете предусмотрено заполнение по умолчанию.  Принцип работы основан на методе множественного восстановления<ref>[https://en.wikipedia.org/wiki/Imputation_(statistics)#Multiple_imputation Multiple Imputation]</ref>. Пропущенные данные заполняются не один, а несколько раз. После этого, каждый из полученных наборов обучается на определенной модели. Затем, результаты агрегируются и выдаются итоговые параметры модели.  Стандартный процесс работы выглядит так: <font color="gray"># Load the dependencies</font> library(mice) <font color="gray"># Impute the missing data m times</font> imp <- mice(nhanes, <font color="#660099">m</font> = <font color="blue">5</font>) <font color="gray"># Analize completed datasets using linear model</font> fit <- with(imp, lm(chl ~ bmi + age)) <font color="gray"># Combine parameter estimates</font> est <- pool(fit) <font color="gray"># Print summary of estimation</font> summary(est) 
==== 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> представлены модели для регрессии и классификации, а также большая часть популярных метрик. В настоящее время имеется возможность использовать более 180 различных алгоритмов.
Основная функция в составе <code>Caret - </code> — функция <code>train()</code>. Параметры обучения в ней задаются аргументом <code>trControl</code>, а оценка качества модели - аргументом <code>metric</code>.Отличительными особенностями <code>Caret </code> является универсальность используемых команд, наличие автоматического подбора гиперпараметров для алгоритмов, в также наличие параллельных вычислений.==== party =Party ====Пакет <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-средних (Алгоритм Ллойда) |метод K-средних]]'' (k-means), ''mini-batch-kmeans'', ''k-medoids'') и распределений (''GMM''). Кроме того, пакет предлагает функции для:* проверки результатов,* построения графика результатов, используя ''[[Оценка качества в задаче кластеризации |метрики]]''* прогнозирования новых наблюдения,* оценки оптимального количества кластеров для каждого алгоритма
==== ClusterR =E1071 ====Пакет <ref>[https://www.rdocumentation.org/packages/e1071/versions/1.7-3 1071 package documentation]</ref> содержит в себя функции для анализа классов, ''кратковременного преобразование Фурье'', ''нечеткой кластеризации'', реализации ''[[Метод опорных векторов (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 ====
В пакете <code>H20 </code> <ref>[https://cran.r-project.org/web/packages/h2o/index.html H20 main info page]</ref> представлены линейные модели, такие как ''[[Бустинг, AdaBoost |градиентный бустинг]]'', ''[[Метод главных компонент (PCA)|метод главных компонент]]'' (PCA), ''GLRM'', KNN''[[Метрический классификатор и метод ближайших соседей|метод k ближайших соседей]]'', Radom forest''[[Дерево решений и случайный лес|случайный лес]]'', ''[[Байесовская_классификация#Наивный байесовский классификатор | наивный Байесовский байесовский классификатор]]''. Сильная сторона этой библиотеки {{---}} работа с большими объемами данных и поддержка многопоточных вычислений.Однако в ней нет возможности задавать параметры используемых алгоритмов
== Примеры алгоритмов ==
В интернете много хороших примеров реализации алгоритмов на <code>R</code>, но среди них хотелось бы особо отметить один учебник<ref>[https://coderlessons.com/tutorials/kompiuternoe-programmirovanie/learn-r-programmirovanie/uchebnik-po-r Учебник по R]</ref> c портала coderlessons.com. В нем представлена реализация основных алгоритмов в порядке, удобном для изучения.
=== Задачи регрессии ===
==== Линейная регрессия ====
<pre>#$$reading datadata <- read.csv("input.csv", sep {{Main|Линейная регрессия|ll= ',', header = FALSE) #evaluating linear regression modelmodel <- lm(data$x ~ data$y) #getting summary print(summary(model))Линейная регрессия}}
<font color="gray"># reading data</font> data <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) <font color="gray"># evaluating linear regression model</font> model <- lm(data$<strong><font color="#660E7A">x</font></strong> ~ data$<strong><font color="#660E7A">y</font></strong>) <font color="gray"># getting summary</font> print(summary(model)) <font color="gray">#visualizing data </font> plot(data$<strong><font color="#660E7A">y</font></strong>, data$<strong><font color="#660E7A">x</font></strong>) lines(data$<strong><font color="#660E7A">y</font></strong>, predict(fit), <font color="#660099">col </font> = <font color= "green">'red')</prefont>)
==== Множественная регрессия ====
<pre>
#$$reading data
rdata <- read.csv("input.csv", sep = ',', header = FALSE)
 
#evaluating regression model
model <- lm(target ~ x + y + z, data = rdata)
<font color="gray"># reading data</font> rdata <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) <font color="gray"># evaluating regression model</font> model <- lm(target ~ x + y + z, <font color="#660099">data</font> = rdata) <font color="gray">#getting summary </font> print(summary(model))</pre>
==== Логистическая регрессия ====
{{Main|Логистическая регрессия|ll=Логистическая регрессия}}Логистическая регрессия – это модель регрессии, в которой переменная ответа принимает значения 0 или 1 (True или False). Реализация на языке <code>R </code> представлена в следующем фрагменте:
<prefont color="gray">#$$reading data</font> rdata <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep </font> = <font color= "green">','</font>, <font color="#660099">header </font> = FALSE) <font color="gray"># evaluating model</font> model = glm(<font color="#660099">formula</font> = target ~ x + y + z, <font color="#660099">data</font> = rdata, <font color="#660099">family</font> = binomial) <font color="gray"># printing summary</font> print(summary(model))
#evaluating modelmodel = glm(formula = target ~ x + y + z, data = rdata, family Метод главных компонент === binomial{{Main|Метод главных компонент (PCA)|ll=PCA}}
<font color="gray">#printing summaryimporting library and its' dependencies</font>print library(summaryh2o) h2o.init(model) path <- system.file(<font color="green">"extdata"</font>, <font color="green">"data.csv"</font>, <font color="#660099">package</font> = <font color="green">"h2o"</font>) data <- h2o.uploadFile(<font color="#660099">path</prefont>= data) <font color="gray"># evaluating</font> h2o.prcomp(<font color="#660099">training_frame</font> = data, <font color="#660099">k</font> = <font color="blue">8</font>, <font color="#660099">transform</font> = <font color="green">"STANDARDIZE"</font>)
=== Деревья решений, случайный лес ===
{{Main|Дерево решений и случайный лес |ll=деревьев решений}}
==== Деревья решений ====
Для создания ''[[Дерево решений и случайный лес |деревьев решений ]]'' в <code>R </code> используется функция <code>ctree ()</code> из пакета <code>party</code>.
<prefont color="gray">#importing package </font> install.packages(<font color="green">"party"</font>) <font color="gray">#reading data</font> rdata <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep </font> = <font color="green">','</font>, <font color="#660099">header </font> = FALSE) <font color="gray">#evaluating model</font> output.tree <- ctree(target ~ x + y + z, <font color="#660099">data </font> = rdata) <font color="gray">#plotting results</font> plot(output.tree)</pre>
==== Случайный лес ====
Для создания ''[[Дерево решений и случайный лес|случайного леса ]]'' необходимо импортировать пакет randomForest <precode>#importing packages install.packages("party")install.packages("randomForest") #reading datardata <- read.csv("input.csv", sep = ',', header = FALSE) #creating the forestoutput.forest <- randomForest(target ~ x + y + z, data = rdata)/code>
<font color="gray"># importing packages </font> install.packages(<font color="green">"party"</font>) install.packages(<font color="green">"randomForest"</font>) <font color="gray">#getting resultsreading data</font>print rdata <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) <font color="gray"># creating the forest</font> output.forest<- randomForest(target ~ x + y + z, <font color="#660099">data</font> = rdata) <font color="gray"># getting results</prefont> print(output.forest)
=== Наивный Бейесовский классификатор ===
{{Main|Байесовская классификация|ll=Байесовская классификация}}
<prefont color="gray">#$$importing package and it's dependencies</font> library(e1071) <font color="gray">#reading data</font> data <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep </font> = <font color="green">','</font>, <font color="#660099">header </font> = FALSE) <font color="gray">#splitting data into training and test data sets</font> index <- createDataPartition(<font color="#660099">y </font> = data$<strong><font color="#660E7A">target</font></strong>, <font color="#660099">p </font> = <font color= "blue">0.8</font>,<font color="#660099">list </font> = FALSE) training <- data[index,] testing <- data[-index,] <font color="gray"># create objects x and y for predictor and response variables</font> x <- training[, -<font color="blue">9</font>] y <- training$<strong><font color="#660E7A">target</font></strong> <font color="gray"># training model</font> model <- train(x, y, <font color="green">'nb'</font>, <font color="#660099">trControl</font> = trainControl(<font color="#660099">method</font> = <font color="green">'cv'</font>, <font color="#660099">number</font> = <font color="blue">10</font>)) <font color="gray"># predicting results</font> predictions <- predict(model, <font color="#660099">newdata</font> = testing)
#create objects x and y for predictor and response variablesx = training[,-9]== Метод опорных векторов ===y {{Main|Метод опорных векторов (SVM)|ll= training$targetSVM}}
<font color="gray"># importing package and its' dependencies</font> library(caret) <font color="gray">#reading data</font> data <- read.csv(<font color="green">"input.csv"</font>, <font color="#660099">sep</font> = <font color="green">','</font>, <font color="#660099">header</font> = FALSE) <font color="gray"># splitting data into train and test sets</font> index <- createDataPartition(<font color="#660099">y</font> = data$<strong><font color="#660E7A">target</font></strong>, <font color="#660099">p</font> = <font color="blue">0.8</font>, <font color="#660099">list</font> = FALSE) training <- data[index,] testing <- data[-index,] <font color="gray"># evaluating model</font>model = fit <- train(target ~ x+ y + z,y <font color="#660099">data</font> = train_flats,'nb' <font color="#660099">method</font> = <font color="green">"svmRadial"</font>, <font color="#660099">trControl</font> =trainControl(<font color="#660099">method</font> = <font color='cv'"green">"repeatedcv"</font>,<font color="#660099">number</font> =<font color="blue">10</font>, <font color="#660099">repeats</font> = <font color="blue">3</font>)) <font color="gray"># printing parameters</font> print(fit)
#predicting results=== Бустинг ===predictions <- predict(model{{Main|Бустинг, newdata AdaBoost|ll= testing)</pre>Бустинг}}
<font color="gray"># loading libraries</font> install.packages(<font color== SVM ==="green">"mlr"<pre/font>)#$$ importing package and its' dependencies library(caretmlr) <font color="gray">#reading loading data</font>data train <- read.csv(<font color="green">"input.csv"</font>) test <- read.csv(<font color="green">"testInput.csv"</font>) <font color="gray"># loading GBM</font> getParamSet(<font color="green">"classif.gbm"</font>) baseLearner <- makeLearner(<font color="green">"classif.gbm"</font>, sep <font color= ',', header "#660099">predict.type</font> = <font color= FALSE"green">"response"</font>) <font color="gray"># specifying parameters</font> controlFunction <- makeTuneControlRandom(<font color="#splitting data into train and test sets660099">maxit</font> = <font color="blue">50000</font>) <font color="gray"># specifying tuning method</font> cvFunction <- makeResampleDesc(<font color="green">"CV"</font>, <font color="#660099">iters</font> = <font color="blue">100000</font>) <font color="gray"># definig cross-validation function</font> index gbmParameters<- createDataPartitionmakeParamSet( makeDiscreteParam(<font color="green">"distribution"</font>, <font color="#660099">values</font> = <font color="green">"bernoulli"</font>), makeIntegerParam(y <font color= data$target"green">"n.trees"</font>, <font color="#660099">lower</font> = <font color="blue">100</font>, <font color="#660099">upper</font> = <font color="blue">1000</font>), p<font color="gray"># number of trees</font> makeIntegerParam(<font color=0"green">"interaction.8depth"</font>, list <font color="#660099">lower</font> = <font color="blue">2</font>, <font color="#660099">upper</font> = FALSE<font color="blue">10</font>), <font color="gray"># depth of tree</font>training makeIntegerParam(<- data[indexfont color="green">"n.minobsinnode"</font>, <font color="#660099">lower</font> = <font color="blue">10</font>, <font color="#660099">upper</font> = <font color="blue">80</font>),]testing makeNumericParam(<font color="green">"shrinkage"</font>, <font color="#660099">lower</font> = <font color="blue">0.01<- data[-index/font>,]<font color="#660099">upper</font> = <font color="blue">1</font>) ) <font color="gray">#evaluating model tunning parameters</font>fit gbmTuningParameters <- traintuneParams(target ~ x + y + z<font color="#660099">learner</font> = baseLearner, data <font color="#660099">task</font> = train_flatstrainTask, method <font color= "svmRadial#660099">resampling</font> = cvFunction, trControl <font color="#660099">measures</font> = trainControl(method acc, <font color= "repeatedcv#660099">par.set</font> = gbmParameters, number <font color= 10, repeats "#660099">control</font> = 3)controlFunction) <font color="gray">#printing creating model parameters</font>print model <- setHyperPars(fit<font color="#660099">learner</font> = baseLearner, <font color="#660099">par.vals</font> = gbmTuningParameters) <font color="gray"># evaluating model</prefont> fit <- train(model, train) predictions <- predict(fit, test)
=== Кластеризация ===
{{Main|Кластеризация}}Для реализации алгоритма кластеризации ''k-средних '' используется пакет <code>ClusterR</code>. В нем реализовано 2 функции: <code>KMeans_arma ()</code> и <code>KMeans_rcpp()</code>. В примере далее рассмотрена реализация с использованием функции KMeans_arma. <precode>#$$ importing package and its' dependencieslibraryKMeans_arma(ClusterR#reading datadata <- read.csv("data/code>.csv") #evaluating modelmodel = KMeans_arma(data, clusters = 2, n_iter = 10, seed_mode = "random_subset", verbose = T, CENTROIDS = NULL) #predicting resultspredictions = predict_KMeans(test_data, model)
<font color="gray"># importing package and its' dependencies</prefont> library(ClusterR) <font color="gray"># reading data</font> data <- read.csv(<font color="green">"data.csv"</font>) <font color="gray"># evaluating model</font> model <- KMeans_arma(data, <font color="#660099">clusters</font> = <font color="blue">2</font>, <font color="#660099">n_iter</font> = <font color="blue">10</font>, <font color="#660099">seed_mode</font> = <font color="green">"random_subset"</font>, <font color="#660099">verbose</font> = T, <font color="#660099">CENTROIDS</font> = NULL) <font color="gray"># predicting results</font> predictions <- predict_KMeans(test_data, model)
==См. также==
*[[:Примеры кода на Scala|Примеры кода на Scala]]
*[[:Примеры кода на Java|Примеры кода на Java]]
*[[:Примеры кода на Kotlin|Примеры кода на Kotlin]]
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]
286
правок

Навигация