С увеличением объема данных, которые мы генерируем, потребность в передовых алгоритмах машинного обучения возросла. Одним из таких алгоритмов является алгоритм K ближайших соседей. В этом блоге об алгоритме KNN в R вы поймете, как работает алгоритм KNN и его реализация с использованием языка R.

В этом блоге KNN Algorithm In R будут освещены следующие темы:

  1. Что такое алгоритм KNN?
  2. Особенности алгоритма KNN
  3. Как работает алгоритм KNN?
  4. Вариант использования алгоритма KNN
  5. Псевдокод алгоритма KNN
  6. Практическая реализация алгоритма KNN в R

Что такое алгоритм KNN?

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

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

Что такое алгоритм KNN? — Алгоритм KNN в R — Edureka

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

Теперь давайте обсудим особенности алгоритма KNN.

Особенности алгоритма KNN

Алгоритм KNN имеет следующие особенности:

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

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

Пример алгоритма KNN

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

  • На изображении выше у нас есть два класса данных, а именно класс A (квадраты) и класс B (треугольники).
  • Постановка задачи состоит в том, чтобы присвоить новую точку входных данных одному из двух классов с помощью алгоритма KNN.
  • Первым шагом в алгоритме KNN является определение значения «K». Но что означает буква «К» в алгоритме KNN?
  • «K» означает количество ближайших соседей и, следовательно, название K ближайших соседей (KNN).

  • На изображении выше я определил значение «K» как 3. Это означает, что алгоритм будет рассматривать трех соседей, которые находятся ближе всего к новой точке данных, чтобы определить класс этой новой точки данных.
  • Близость между точками данных рассчитывается с использованием таких мер, как евклидово и манхэттенское расстояние, которые я объясню ниже.
  • При ‘K’ = 3 соседями являются два квадрата и 1 треугольник. Итак, если бы я классифицировал новую точку данных на основе «K» = 3, то она была бы отнесена к классу A (квадраты).

  • Но что, если значение «К» установлено на 7? Здесь я в основном говорю своему алгоритму искать семь ближайших соседей и классифицировать новую точку данных по классу, на который она больше всего похожа.
  • При ‘K’ = 7 соседями являются три квадрата и четыре треугольника. Итак, если бы я классифицировал новую точку данных на основе «K» = 7, то она была бы отнесена к классу B (треугольники), поскольку большинство ее соседей относятся к классу B.

На практике при реализации алгоритма KNN следует учитывать гораздо больше. Об этом пойдет речь в демо-разделе блога.

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

  • Рассмотрим изображение выше, здесь мы собираемся измерить расстояние между точками P1 и P2, используя меру евклидова расстояния.
  • Координаты для P1 и P2 равны (1,4) и (5,1) соответственно.
  • Евклидово расстояние можно рассчитать следующим образом:

Это так просто! KNN использует простые меры для решения сложных задач, и это одна из причин, почему KNN является таким широко используемым алгоритмом.

Подводя итог, давайте посмотрим на псевдокод алгоритма KNN.

Псевдокод алгоритма KNN

Рассмотрим множество (Xi, Ci),

  • Где Xi обозначает переменные функции, а «i» — точки данных в диапазоне от i = 1, 2, ….., n
  • Ci обозначает выходной класс для Xi для каждого i

Условие Ci ∈ {1, 2, 3, ……, c} приемлемо для всех значений «i» при условии, что общее количество классов обозначается «c».

Теперь давайте представим, что есть точка данных «x», выходной класс которой необходимо предсказать. Это можно сделать с помощью алгоритма K-ближайших соседей (KNN).

Псевдокод алгоритма KNN:

head(loan.subset)
Creditability Age..years. Sex...Marital.Status Occupation Account.Balance Credit.Amount
1             1          21                    2          3               1          1049
2             1          36                    3          3               1          2799
3             1          23                    2          2               2           841
4             1          39                    3          2               1          2122
5             1          38                    3          2               1          2171
6             1          48                    3          2               1          2241
Length.of.current.employment Purpose
1                            2       2
2                            3       0
3                            4       9
4                            3       0
5                            3       0
6                            2       0

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

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

Вариант использования алгоритма KNN

Наверняка вы делали покупки на Amazon! Вы когда-нибудь замечали, что когда вы покупаете продукт, Amazon дает вам список рекомендаций на основе вашей покупки? Мало того, Amazon отображает раздел, в котором говорится: «Клиенты, купившие этот товар, также купили это…».

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

Рассмотрим пример, предположим, что покупатель А, который любит детективные романы, купил серию книг «Игра престолов» и «Властелин колец». Теперь, через пару недель, другой покупатель Б, читающий книги того же жанра, покупает «Властелина колец». Он не покупает серию книг «Игра престолов», но Amazon рекомендует ее покупателю Б, поскольку его покупательское поведение и его выбор книг очень похожи на покупателя А.

Таким образом, Amazon рекомендует продукты покупателям, основываясь на том, насколько похоже их покупательское поведение. Это сходство можно понять, реализуя алгоритм KNN, который в основном основан на сходстве признаков.

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

Практическая реализация алгоритма KNN в R

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

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

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

Теперь, когда вы знаете цель этого проекта, давайте начнем с части кодирования.

Шаг 1. Импорт набора данных

#Import the dataset loan <- read.csv("C:/Users/zulaikha/Desktop/DATASETS/knn dataset/credit_data.csv")

После импорта набора данных давайте посмотрим на структуру набора данных:

str(loan) 'data.frame': 1000 obs. of 21 variables: $ Creditability : int 1 1 1 1 1 1 1 1 1 1 ... $ Account.Balance : int 1 1 2 1 1 1 1 1 4 2 ... $ Duration.of.Credit..month. : int 18 9 12 12 12 10 8 6 18 24 ... $ Payment.Status.of.Previous.Credit: int 4 4 2 4 4 4 4 4 4 2 ... $ Purpose : int 2 0 9 0 0 0 0 0 3 3 ... $ Credit.Amount : int 1049 2799 841 2122 2171 2241 3398 1361 1098 3758 ... $ Value.Savings.Stocks : int 1 1 2 1 1 1 1 1 1 3 ... $ Length.of.current.employment : int 2 3 4 3 3 2 4 2 1 1 ... $ Instalment.per.cent : int 4 2 2 3 4 1 1 2 4 1 ... $ Sex...Marital.Status : int 2 3 2 3 3 3 3 3 2 2 ... $ Guarantors : int 1 1 1 1 1 1 1 1 1 1 ... $ Duration.in.Current.address : int 4 2 4 2 4 3 4 4 4 4 ... $ Most.valuable.available.asset : int 2 1 1 1 2 1 1 1 3 4 ... $ Age..years. : int 21 36 23 39 38 48 39 40 65 23 ... $ Concurrent.Credits : int 3 3 3 3 1 3 3 3 3 3 ... $ Type.of.apartment : int 1 1 1 1 2 1 2 2 2 1 ... $ No.of.Credits.at.this.Bank : int 1 2 1 2 2 2 2 1 2 1 ... $ Occupation : int 3 3 2 2 2 2 2 2 1 1 ... $ No.of.dependents : int 1 2 1 2 1 2 1 2 1 1 ... $ Telephone : int 1 1 1 1 1 1 1 1 1 1 ... $ Foreign.Worker : int 1 1 1 2 2 2 2 2 1 1 ...

Обратите внимание, что переменная «Кредитность» — это наша выходная переменная или целевая переменная. Значение переменной достоверности показывает, одобрен или отклонен кредит заявителя.

Шаг 2. Очистка данных

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

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

loan.subset<-loan[c('Creditability','Age..years.','Sex...Marital.Status','Occupation','Account.Balance','Credit.Amount','Length.of.current.employment','Purpose')]

В приведенном выше фрагменте кода я отфильтровал переменные-предикторы. Теперь давайте посмотрим, как выглядит наш набор данных:

str(loan.subset)
'data.frame': 1000 obs. of 8 variables:
$ Creditability : int 1 1 1 1 1 1 1 1 1 1 ...
$ Age..years. : int 21 36 23 39 38 48 39 40 65 23 ...
$ Sex...Marital.Status : int 2 3 2 3 3 3 3 3 2 2 ...
$ Occupation : int 3 3 2 2 2 2 2 2 1 1 ...
$ Account.Balance : int 1 1 2 1 1 1 1 1 4 2 ...
$ Credit.Amount : int 1049 2799 841 2122 2171 2241 3398 1361 1098 3758 ...
$ Length.of.current.employment: int 2 3 4 3 3 2 4 2 1 1 ...
$ Purpose : int 2 0 9 0 0 0 0 0 3 3 ...

Теперь мы сузили 21 переменную до 8 переменных-предикторов, которые важны для построения модели.

Шаг 3. Нормализация данных

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

head(loan.subset)
Creditability Age..years. Sex...Marital.Status Occupation Account.Balance Credit.Amount
1             1          21                    2          3               1          1049
2             1          36                    3          3               1          2799
3             1          23                    2          2               2           841
4             1          39                    3          2               1          2122
5             1          38                    3          2               1          2171
6             1          48                    3          2               1          2241
Length.of.current.employment Purpose
1                            2       2
2                            3       0
3                            4       9
4                            3       0
5                            3       0
6                            2       0

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

#Normalization
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x))) }

В приведенном ниже фрагменте кода мы сохраняем нормализованный набор данных в переменной «loan.subset.n», а также удаляем переменную «Доверие», поскольку это переменная ответа, которую необходимо предсказать.

loan.subset.n <- as.data.frame(lapply(loan.subset[,2:8], normalize))

Это нормализованный набор данных:

head(loan.subset.n)
Age..years. Sex..Marital Occupation Account.Balance Credit.Amount
1  0.03571429   0.3333333   0.6666667    0.0000000      0.04396390
2  0.30357143   0.6666667   0.6666667    0.0000000      0.14025531
3  0.07142857   0.3333333   0.3333333    0.3333333      0.03251898
4  0.35714286   0.6666667   0.3333333    0.0000000      0.10300429
5  0.33928571   0.6666667   0.3333333    0.0000000      0.10570045
6  0.51785714   0.6666667   0.3333333    0.0000000      0.10955211
Length.of.current.employment Purpose
0.25                0.2
0.50                0.0
0.75                0.9
0.50                0.0
0.50                0.0
0.25                0.0

После очистки набора данных и его форматирования следующим шагом является объединение данных. Объединение данных в основном включает в себя разделение набора данных на набор данных для обучения и тестирования. Это делается в следующем фрагменте кода:

set.seed(123)
dat.d <- sample(1:nrow(loan.subset.n),size=nrow(loan.subset.n)*0.7,replace = FALSE) #random selection of 70% data.
train.loan <- loan.subset[dat.d,] # 70% training data
test.loan <- loan.subset[-dat.d,] # remaining 30% test data

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

#Creating seperate dataframe for 'Creditability' feature which is our target.
train.loan_labels <- loan.subset[dat.d,1]
test.loan_labels <-loan.subset[-dat.d,1]

Шаг 5. Создание модели машинного обучения

На этом этапе мы должны построить модель, используя набор обучающих данных. Поскольку мы используем алгоритм KNN для построения модели, мы должны сначала установить пакет «class», предоставленный R. В этом пакете есть функция KNN:

#Install class package
install.packages('class')
# Load class package
library(class)

Далее мы собираемся подсчитать количество наблюдений в наборе обучающих данных. Причина, по которой мы это делаем, заключается в том, что мы хотим инициализировать значение «K» в модели KNN. Один из способов найти оптимальное значение K — вычислить квадратный корень из общего количества наблюдений в наборе данных. Этот квадратный корень даст вам значение «К».

#Find the number of observation
NROW(train.loan_labels)
[1] 700

Итак, у нас есть 700 наблюдений в нашем наборе обучающих данных. Квадратный корень из 700 равен примерно 26,45, поэтому мы создадим две модели. Одна со значением «К» 26, а другая модель со значением «К» 27.

knn.26 <- knn(train=train.loan, test=test.loan, cl=train.loan_labels, k=26)
knn.27 <- knn(train=train.loan, test=test.loan, cl=train.loan_labels, k=27)

Шаг 6. Оценка модели

После построения модели пришло время рассчитать точность созданных моделей:

#Calculate the proportion of correct classification for k = 26, 27
ACC.26 <- 100 * sum(test.loan_labels == knn.26)/NROW(test.loan_labels)
ACC.27 <- 100 * sum(test.loan_labels == knn.27)/NROW(test.loan_labels)
ACC.26
[1] 67.66667
ACC.27
[1] 67.33333

Как показано выше, точность для K = 26 составляет 67,66, а для K = 27 — 67,33. Мы также можем сравнить прогнозируемый результат с фактическим значением в табличной форме:

# Check prediction against actual value in tabular form for k=26
table(knn.26 ,test.loan_labels)

test.loan_labels
knn.26   0     1
0        11    7
1        90   192
knn.26
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
[51] 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[101] 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[151] 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
[201] 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
[251] 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1
Levels: 0 1
# Check prediction against actual value in tabular form for k=27 table(knn.27 ,test.loan_labels) test.loan_labels knn.27 0 1 0 11 8 1 90 191 knn.27
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
[51] 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[101] 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[151] 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
[201] 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
[251] 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1
Levels: 0 1

Вы также можете использовать матрицу путаницы для расчета точности. Для этого мы должны сначала установить печально известный пакет Caret:

install.packages('caret')
library(caret)

Теперь давайте используем матрицу путаницы для расчета точности модели KNN со значением K, равным 26:

confusionMatrix(table(knn.26 ,test.loan_labels))
Confusion Matrix and Statistics
test.loan_labels
knn.26   0   1
0  11   7
1  90 192
Accuracy : 0.6767
95% CI : (0.6205, 0.7293)
No Information Rate : 0.6633
P-Value [Acc > NIR] : 0.3365
Kappa : 0.0924
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.10891
Specificity : 0.96482
Pos Pred Value : 0.61111
Neg Pred Value : 0.68085
Prevalence : 0.33667
Detection Rate : 0.03667
Detection Prevalence : 0.06000
Balanced Accuracy : 0.53687
'Positive' Class : 0

Итак, из вывода мы видим, что наша модель предсказывает результат с точностью 67,67%, что хорошо, поскольку мы работали с небольшим набором данных. Следует помнить, что чем больше данных (оптимальных данных) вы передаете машине, тем эффективнее будет модель.

Шаг 7. Оптимизация

Чтобы повысить точность модели, вы можете использовать n методов, таких как метод локтя и график максимальной процентной точности. В приведенном ниже фрагменте кода я создал цикл, который вычисляет точность модели KNN для значений «K» в диапазоне от 1 до 28. Таким образом, вы можете проверить, какое значение «K» приведет к наиболее точной модели:

i=1
k.optm=1
for (i in 1:28){
+ knn.mod <- knn(train=train.loan, test=test.loan, cl=train.loan_labels, k=i)
+ k.optm[i] <- 100 * sum(test.loan_labels == knn.mod)/NROW(test.loan_labels)
+ k=i
+ cat(k,'=',k.optm[i],'
')
+ }
1 = 60.33333
2 = 58.33333
3 = 60.33333
4 = 61
5 = 62.33333
6 = 62
7 = 63.33333
8 = 63.33333
9 = 63.33333
10 = 64.66667
11 = 64.66667
12 = 65.33333
13 = 66
14 = 64
15 = 66.66667
16 = 67.66667
17 = 67.66667
18 = 67.33333
19 = 67.66667
20 = 67.66667
21 = 66.33333
22 = 67
23 = 67.66667
24 = 67
25 = 68
26 = 67.66667
27 = 67.33333
28 = 66.66667

Из вывода видно, что при K = 25 мы достигаем максимальной точности, т.е. 68%. Мы также можем представить это графически, например:

#Accuracy plot
plot(k.optm, type="b", xlab="K- Value",ylab="Accuracy level")

На приведенном выше графике показано, что для значения «K», равного 25, мы получаем максимальную точность. Теперь, когда вы знаете, как построить модель KNN, я оставляю вам возможность построить модель со значением «K» равным 25.

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

Если вы хотите прочитать больше статей о самых популярных на рынке технологиях, таких как Python, DevOps, Ethical Hacking, вы можете обратиться к официальному сайту Edureka.

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

1.Учебник по науке о данных

2.Математика и статистика для науки о данных

3.Линейная регрессия в R

4.Алгоритмы машинного обучения

5.Логистическая регрессия в R

6.Алгоритмы классификации

7.Случайный лес в R

8.Дерево решений в R

9.Введение в машинное обучение

10.Наивный Байес в R

11.Статистика и вероятность

12.Как создать идеальное дерево решений?

13.10 главных мифов о роли специалистов по данным

14.Лучшие проекты по науке о данных

15.Аналитик данных, инженер данных и специалист по данным

16.Типы искусственного интеллекта

17. R против Python

18.Искусственный интеллект, машинное обучение и глубокое обучение

19.Проекты машинного обучения

20.Вопросы и ответы на интервью с аналитиком данных

21.Наука о данных и инструменты машинного обучения для непрограммистов

22.10 лучших фреймворков машинного обучения

23.Статистика для машинного обучения

24.Случайный лес в R

25.Алгоритм поиска в ширину

26.Линейный дискриминантный анализ в R

27.Предпосылки для машинного обучения

28.Интерактивные веб-приложения с использованием R Shiny

29.10 лучших книг по машинному обучению

30.Контролируемое обучение

31.10 лучших книг по науке о данных

32.Машинное обучение с использованием R

Первоначально опубликовано на https://www.edureka.co 16 апреля 2019 г.