Использование ML.NET - Введение в машинное обучение и ML.NET.

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Код к этой статье можно скачать здесь.


В прошлом месяце, в их построения, корпорация Microsoft поделилась с нами планами .Чистая сердечник 3. Wile акцент был преобразование настольных приложений и поддержка Windows Forms и WPF, ML.NET -была также внедрена система машинного обучения. Если вы посмотрите на картину, которая была вокруг интернета в последнее время мы можем ожидать, что этот модуль является неотъемлемой частью .NET Core 3. Пока, ML.NET только в зачаточном состоянии, и мы можем попробовать его первое воплощение. Всего несколько дней назад 0.2 версия ML.NET было объявлено, так что давайте посмотрим, что это за рамки.

ML.NET является с открытым исходным кодом и кросс-платформенной платформой и доступен в виде пакета NuGet. Вы можете проверить код здесь. Он был первоначально разработан в Microsoft Research и используется во многих продуктах Microsoft, таких как Windows, Bing, Azure и т.д. Одна очень классная вещь в этой структуре заключается в том, что ее можно расширить, чтобы добавить библиотеки машинного обучения, такие как TensorFlow, Accord.NET и CNTK. Прежде чем мы углубимся в детали этой структуры давайте краткое Введение в машинное обучение и тип проблем, которые он решает.

машинное обучение

Машинное обучение-это отрасль информатики, которая использует статистические методы, чтобы дать компьютерам возможность научиться решать определенные проблемы без явного программирования. Несмотря на то, что это большой модное слово в эти дни и “жизнь партии” на каждой конференции, первоначальные концепции машинного обучения уходят в 50-е годы. Вся идея заключается в том, чтобы разработать определенную модель, которая после того, как будет обучена некоторому набору данных, сможет сделать правильные прогнозы, используя новые данные.

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

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

Есть несколько подходов, когда это можно взять при обучении модели: контролируемое обучение, неконтролируемое обучение и усиленное обучение. При обучении под наблюдением модели предоставляются входные данные и ожидаемые результаты, а модель изучает, какие Выходные данные должны быть предоставлены для определенного типа входных данных. Этот тип обучения является наиболее популярным.

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

Проблема Классификации Цветков Ириса

Ок, теперь, когда мы находимся в курс основные понятия машинного обучения, давайте посмотрим, какую проблему мы собираемся решить с помощью ML.NET. Ирис набор данных известен набор данных в мире для распознавания и считается “Привет мировой” пример для машинного обучения классификации проблем. Он впервые ввел Рональд Фишер, британский статистик и ботаник, еще в 1936 году. В своей статье Тон использует несколько измерений в таксономических проблем, он использовал данные, полученные для трех различных классов растений Ирис: Ирис setosa, Ирис virginica, и Ирис лишай.

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

  • Sepal Длина в см
  • Ширина Sepal в см
  • Длина лепестка в см
  • Ширина лепестка в см
  • Класс (setosa Айрис, Айрис virginica, Ирис лишай)

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

Установка ML.NET

На данный момент ML.NET работает .Чистая ядра 2.0, поэтому убедитесь, что вы установили на вашем компьютере. Обратите внимание, что в настоящее время он должен выполняться в 64-разрядном процессе. Помните об этом при создании консольного приложения. Как и любой другой пакет NuGet, его можно установить с помощью консоли диспетчера пакетов с помощью команды

Установить-Пакет Microsoft.ML-версия 0.2

Другой способ сделать это-использовать CLI .NET Core. Если вы собираетесь использовать этот подход, убедитесь, что вы установили .Чистый базовый пакет SDK. Затем выполните эту команду из папки проекта консольного приложения

dotnet добавить пакет Microsoft.ML -- version 0.2.0

Также можно использовать графический интерфейс Visual Studio. Все, что вам нужно сделать, это щелкните правой кнопкой мыши проект и выберите Управление пакетов nuget вариант

После этого, вам нужно найти Майкрософт.Мл пакет и установить его.

Реализация

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

Однако обычной практикой при построении модели является наличие набора данных для обучения и другого набора данных для тестирования и оценки точности модели. Часто, как и в этом примере, мы получаем только один набор данных, который нам нужно разбить на два отдельных набора данных и который используется один для обучения, а другой для тестирования. Соотношение должно быть около 80% до 20%. Именно поэтому я выбрал 25 образцов из набора данных и сохранил их в отдельных файлах.

Вот как выглядит один из этих файлов

Построение и обучение модели

Данные, отраженные в этом .csv-файлы должны быть преобразованы в какие-то объекты. Именно поэтому в нашем Ирис папку, мы имеем два класса: IrisFlower и IrisPredict. Информация из файлов наших наборов данных окажется в этих объектах, а затем мы сможем использовать их для обучения нашей модели и создания прогнозов. Мы увидим, как эти классы используются в минуту, на данный момент, посмотрите, как они реализуются

используя Майкрософт.Мл.Во время выполнения.API-интерфейс;

пространство имен IrisClassification.Ирис
{
общественный класс IrisFlower
{
[Столбец("0")]
публичных поплавок SepalLength;

[Столбец("1")]
публичных поплавок SepalWidth;

[Столбец("2")]
публичных поплавок PetalLength;

[Столбец("3")]
публичных поплавок PetalWidth;

[Столбец("4")]
[Имя_столбца("Метка")]
публичных строку ярлыка;
}

общественный класс IrisPredict
{
[Имя_столбца("PredictedLabel")]
общественного строка PredictedLabels;
}
}

вид сырья IrisFlowerAndIrisPredict.в CS размещенные  на сайте github

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

используя IrisClassification.Помощники;
с помощью системы;
используя Майкрософт.Мл.Данные;

пространство имен IrisClassification
{
класс программа
{
статический пустота главный(строка[] аргументы)
{
вар trainingDataLocation = @"сведения/Айрис-data_training.кшм";
вар testDataLocation = @"сведения/Айрис-data_test.кшм";

// Построения и оценки модели.
вар в modelbuilder = новое окно modelbuilder(trainingDataLocation);
вар модель = в modelbuilder.Построить();
вар точность = в modelbuilder.Оценки(модель, testDataLocation);

Консоль.Метода writeline($"*************************************************");
Консоль.Метода writeline($"* точность модели : {точность} *");
Консоль.Метода writeline($"*************************************************");

// Визуализации результатов.
вар testDataObjects = новый IrisCsvReader().GetIrisDataFromCsv(testDataLocation);
по каждому элементу (вар ирис в testDataObjects)
{
вар предсказание = модель.Прогнозирования(ирис);
Консоль.Метода writeline($"-------------------------------------------------");
Консоль.Метода writeline($"предсказал Тип : {предсказание.PredictedLabels}");
Консоль.Метода writeline($"фактический Тип : {Айрис.Метка}");
Консоль.Метода writeline($"-------------------------------------------------");
}

Консоль.С readline();
}
}
}

представления программы.в CS размещенные  на сайте github

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

/// <резюме>
/// С помощью обучающих данных местоположения, который передается через конструктор этот метод строит
/// и обучение машинного обучения модели.
/// </резюме>
/// <возвращает>обучение машинного обучения модели.</возвращает>
общественные PredictionModel<IrisFlower, IrisPredict> BuildAndTrain()
{
вар трубопровода = новый LearningPipeline();
трубопровода.Добавить(новый TextLoader(_trainingDataLocation).CreateFrom<IrisFlower>(useHeader: правда, разделитель: ','));
трубопровода.Добавить(новый Dictionarizer("метка"));
трубопровода.Добавить(новый ColumnConcatenator("функции", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"));
трубопровода.Добавить(новый StochasticDualCoordinateAscentClassifier());
трубопровода.Добавить(новый PredictedLabelColumnOriginalValueconverter() { PredictedLabelColumn = "PredictedLabel" });

возврат трубопровод.Поезд<IrisFlower, IrisPredict>
}

вид сырья BuildAndTrain.в CS размещенные  на сайте github

Для создания модели, мы используем LearningPipeline. Этот класс используется для определения задач, которые наши модели должен делать. Он инкапсулирует загрузку данных, обработку данных/featurization и алгоритм обучения. Все эти шаги Добавлено через Добавить способ из этого класса.

Обучение данные о местоположении передается через конструктор в modelbuilder, и используется в первый шаг – загрузка данных. Здесь мы используем TextLoader класс и уже реализованных IrisFlower класс. В этой линии, мы говорим, что как только тренировка началась, мы должны загрузить данные из обучающих данных местоположения и сопоставить его с IrisFlower объектов. После этого, мы добавляем Dictionizer в трубопровод. Чтобы понять, что этот шаг сделает, мы должны снова взглянуть на наши данные.

Обратите внимание, что последний столбец в данных представляет специи цветка ириса в строковом формате. Алгоритмы машинного обучения не могут работать со строками. Также обратите внимание, что этот столбец отображается на этикетке собственность IrisFlower. Под капотом, это Dictionizer класс кодировать текст в некоторое количество, поэтому наш алгоритм машинного обучения, умеет использовать его. Наконец, мы добавляем ColumnConcatanator собрать все атрибуты. С этим, мы закончили с подготовкой данных для нашего процесса обучения.

Три последних шагов в BuildAndTrain способа являются критическими. Мы добавляем тип модели, который мы собираемся использовать. Для этой цели мы используем Стохастическийдвойнойкоординатподъемклассификатором класс. Этот шаг построит нашу модель. Затем мы добавляем PredictedLabelColumnOriginalValueconverter класса, который используется для преобразования закодированных выходное значение обратно в строку. Наконец, мы называем железнодорожного метод, трубопровод выполнен и обучения модели.

Оценка

Второй способ построения модели используется модель оценки. Вот код этого метода

/// <резюме>
/// Уссинг прошли тестирование данных и модели, расчет модели по точности.
/// </резюме>
/// <возвращает>точность модели.</возвращает>
публичных двойной оценке(PredictionModel<IrisFlower, IrisPredict> модель, строку testDataLocation)
{
Варе данных testdata = новый TextLoader(testDataLocation).CreateFrom<IrisFlower>(useHeader: правда, разделитель: ',');
вар метрики = новый ClassificationEvaluator().Оценки(модель, ними);
возврат метрики.AccuracyMacro;
}

вид сырья оценивать.в CS размещенные  на сайте github

Это гораздо проще, что BuildAndTrain способ. В основном, мы загружаем данные с помощью TextLoader класс снова, но на этот раз мы с помощью тестовых данных. После этого, мы используем ClassigicationEvaluator класса и оценивать способ на предоставленную модель и тестовых данных. Этот метод возвращает объект, который содержит метрическую информацию о модели – ClassificationMetrics объекта. Мы хотим видеть только точность, поэтому мы возвращаемся AccuracyMacro.

Визуализация выходных данных

Просто чтобы увидеть, как наша модель работает, мы добавили один класс, который читает от .CSV-файл и создает IrisFlowers объекты – IrisCsvReader класс. Это довольно просто

общественный класс IrisCsvReader
{
публичный интерфейс ienumerable<IrisFlower> GetIrisDataFromCsv(строка dataLocation)
{
вернуть файл.ReadAllLines(dataLocation)
.Пропустить(1)
.Выберите(х => х.Сплит(','))
.Выберите(х => новый IrisFlower()
{
SepalLength = поплавок.Разбираем(х[0]),
SepalWidth = поплавок.Разбираем(х[1]),
PetalLength = поплавок.Разбираем(х[2]),
PetalWidth = поплавок.Разбираем(х[3]),
Метка = х[4]
});
}
}

вид сырья IrisCsvReader.в CS размещенные  на сайте github

Этот метод вызывается в основной способ нашего приложения. Для каждого объекта, который GetIrisDataFromCsv метод возвращает, мы называем прогнозирования метод модели, а мы потом распечатать прогнозируемое значение с фактическим значением. Так выглядит вывод нашего приложения

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

Вывод

Машинное обучение процветает в течение последних нескольких лет. Люди в этой области, как правило, используют Python или R. до этого момента, было бы очень трудно манипулировать данными и сделать быстрые решения в c#. С ML.NET это медленно меняется. Хотя в Python и R все еще отсутствуют некоторые функции, это большой шаг в правильном направлении. Я очень рад видеть, где ML.NET Платформа будет приземляться и как она будет интегрирована с остальными функциями .NET world в .NET Core 3. Машинное обучение пересекает пропасть раннего усыновтеля и Microsoft помогает ему.


Источник: rubikscode.net

Комментарии:

Олег Назаренко, 2019-03-24 22:31:24
Что за даун переводил статью? Дайте ссылку на оригинальный ресурс