Машинное обучение является частью энциклопедии, известной как Искусственный интеллект. Он развился из изучения распознавания образов и теории вычислительного обучения в искусственном интеллекте, машинное обучение исследует изучение и построение алгоритмов, которые могут учиться и делать прогнозы на данных - такие алгоритмы преодолевают следование строго статическим программным инструкциям, создавая данные прогнозы или решения, основанные на построении модели на основе выборки входных данных.
Категории машинного обучения
Мы можем в общих чертах разделить машинное обучение на контролируемые и неконтролируемые категории на основе подхода. Есть и другие категории, но мы ограничимся этими двумя:
- Контролируемое обучение работает с набором данных, который содержит как входные данные, так и желаемый результат - Контролируемое обучение далее делится на две широкие подкатегории, называемые классификацией и регрессией:
- Алгоритмы Классификация связаны с категориальным выводом, например, занято ли свойство или нет
- Алгоритмы Регрессия относятся к непрерывному диапазону вывода, как и значение свойства
- Неконтролируемое обучение, с другой стороны, работает с набором данных, который имеет только входные значения.
Рабочий процесс машинного обучения
Что такое 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 («Прогноз модели на новых данных =« + прогноз »);
Нам часто требуется сохранить обученную модель в файловой системе и загрузить ее для прогнозирования производственных данных. Итак, мы сохраняем модель в файловую систему и загружаем ее обратно. После загрузки модель можно сразу использовать для прогнозирования вывода новых данных.
Спасибо за чтение 💜