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

Категории машинного обучения

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

Рабочий процесс машинного обучения

Что такое Spark MLlib?

Spark MLlib - это компонент Машинное обучение Apache Spark. Одним из главных достоинств Spark является возможность массового масштабирования вычислений, и это именно то, что вам нужно для алгоритмов машинного обучения. Вдобавок к этому MLlib предоставляет большинство популярных алгоритмов машинного обучения и статистических алгоритмов. Это значительно упрощает задачу работы над масштабным проектом машинного обучения.

Алгоритмы MLlib

Популярные алгоритмы и утилиты в Spark MLlib:

1. Базовая статистика
2. Регрессия
3. Классификация
4. Система рекомендаций
5. Кластеризация
6. Уменьшение размерности
7. Извлечение характеристик < br /> 8. Оптимизация

«Привет, мир» машинного обучения

Рассмотрим многомерный помеченный набор данных, состоящий из длины и ширины чашелистиков и лепестков разных видов ириса. Это ставит перед нашей проблемой цель: можем ли мы предсказать вид ириса по длине и ширине чашелистника и лепестка?

Конфигурации

‹dependency›
‹groupId› org.apache.spark ‹/groupId›
‹artifactId› spark-mllib_2.X ‹/artifactId›
‹version› 2.X ‹/ версия ›
‹scope› предоставлена ​​‹/scope›
‹/dependency›

Настройка данных

Инициализируйте SparkContext для работы с API Spark -

SparkConf conf = new SparkConf (). setAppName («Main»)
.setMaster («local [X]»);
JavaSparkContext sc = new JavaSparkContext (conf);

затем нам нужно загрузить данные в Spark -

String dataFile = «file_location»;
JavaRDD ‹String› data = sc.textFile (dataFile);

Spark MLlib предлагает несколько типов данных, как локальных, так и распределенных, для представления входных данных и соответствующих меток. Самыми простыми из типов данных являются векторные -

JavaRDD ‹Vector› inputData = data
.map (строка - ›{
String [] parts = line.split («, »);
double [] v = новый двойной размер [parts.length - 1];
for (int i = 0; i ‹parts.length - 1; i ++) {
v [i] = Double.parseDouble (parts [i] );
}
return Vectors.dense (v);
});

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

Map ‹String, Integer› map = new HashMap ‹› ();
map.put («Iris-setosa», 0);
map.put («Iris-versicolor ”, 1);
map.put (« Iris-virginica », 2);


JavaRDD ‹LabeledPoint› labeledData = data
.map (строка - ›{
String [] parts = line.split («, »);
double [] v = new double [parts.length - 1];
for (int i = 0; i ‹parts.length - 1; i ++) {
v [i] = Double.parseDouble (parts [i]);
}
вернуть новую LabeledPoint (map.get ( parts [parts.length - 1]), Vectors.dense (v));
});

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

Исследовательский анализ данных

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

Наш набор данных в этом примере небольшой и хорошо сформирован. Следовательно, нам не нужно тратить много времени на анализ данных. Spark MLlib, однако, снабжен API-интерфейсами, чтобы предложить достаточно глубокое понимание. Начнем с простого статистического анализа -

MultivariateStatisticalSummary summary = Statistics.colStats (inputData.rdd ());
System.out.println («Среднее значение:»);
System.out.println (summary.mean ());
System.out.println («Суммарная дисперсия:»);
System.out.println (summary.variance ());
System.out.println («Сводная Ненулевое значение: ”);
System.out.println (summary.numNonzeros ());

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

Matrix correlMatrix = Statistics.corr (inputData.rdd (), «pearson»);
System.out.println («Correlation Matrix:»);
System.out.println (correlMatrix.toString ());

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

Разделение данных

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

JavaRDD ‹LabeledPoint› [] splits = parsedData.randomSplit (new double [] {0.7, 0.2}, 10L);
JavaRDD ‹LabeledPoint› trainingData = splits [0];
JavaRDD ‹LabeledPoint› testData = splits [1];

Модельное обучение

Мы достигли стадии, когда мы проанализировали и подготовили набор данных. Осталось только скормить это модели и начать волшебство.

LogisticRegressionModel model = new LogisticRegressionWithLBFGS ()
.setNumClasses (3)
.run (trainingData.rdd ());

Здесь мы используем трехклассный классификатор на основе Limited Memory BFGS.

Оценка модели

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

JavaPairRDD ‹Object, Object› predictionAndLabels = testData
.mapToPair (p - ›new Tuple2‹ ›(model.predict (p.features ()), p.label ())); < br /> MulticlassMetrics metrics = new MulticlassMetrics (predictionAndLabels.rdd ());
double precision = metrics.accuracy ();
System.out.println («Точность модели на тестовых данных:« + точность) ;

Теперь, как нам измерить эффективность модели? Есть несколько показателей, которые мы можем использовать, но одна из самых простых - это точность. Проще говоря, точность - это отношение правильного количества прогнозов к общему количеству прогнозов. Однако точность не очень эффективный показатель в некоторых проблемных областях. Другие более сложные показатели - это точность и отзыв (оценка F1), кривая ROC и матрица неточностей.

Наконец, сохраните модель

model.save (sc, «тест \\ модель \\ логистическая регрессия»);
LogisticRegressionModel sameModel = LogisticRegressionModel
.load (sc, «тест \\ модель \\ логистическая -regression »);
Vector newData = Vectors.dense (new double [] {1,1,1,1});
двойное предсказание = sameModel.predict (newData);
System .out.println («Прогноз модели на новых данных =« + прогноз »);

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

Спасибо за чтение 💜