Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Узнайте, как создать приложение обнаружения аномалий для данных временных рядов. В этом руководстве создается консольное приложение .NET с помощью C# в Visual Studio 2019.
В этом руководстве описано, как:
- Загрузка данных
- Определение периода для временных рядов
- Обнаружение аномалий для периодических временных рядов
Исходный код для этого руководства можно найти в репозитории dotnet/samples.
Предпосылки
Visual Studio 2022 с установленной рабочей нагрузкой .NET Desktop Development.
Создание консольного приложения
Создайте консольное приложение C# с именем PhoneCallsAnomalyDetection. Нажмите кнопку Далее.
Выберите .NET 8 в качестве платформы для использования. Нажмите кнопку Создать.
Создайте каталог с именем Data в проекте, чтобы сохранить файлы набора данных.
Установите пакет NuGet Microsoft.ML версии 1.5.2:
- В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet.
- Выберите nuget.org в качестве источника пакета.
- Перейдите на вкладку Browse.
- Выполните поиск Microsoft.ML.
- Выберите Microsoft.ML из списка пакетов и выберите версию 1.5.2 в раскрывающемся списке "Версия ".
- Нажмите кнопку Установить.
- Нажмите кнопку "ОК " в диалоговом окне "Предварительные изменения" , а затем нажмите кнопку "Принять" в диалоговом окне принятия лицензий, если вы согласны с условиями лицензии для перечисленных пакетов.
Повторите эти действия для Microsoft.ML.TimeSeries версии 1.5.2.
Добавьте следующие
using
директивы в верхней части файла Program.cs :using Microsoft.ML; using Microsoft.ML.TimeSeries; using PhoneCallsAnomalyDetection;
Скачайте свои данные
Скачайте набор данных и сохраните его в ранее созданной папке данных :
Щелкните правой кнопкой мыши phone-calls.csv и выберите "Сохранить ссылку (или цель) как..."
Убедитесь, что файл *.csv сохранен в папке данных или после сохранения в другом месте, переместите файл *.csv в папку данных .
В обозревателе решений щелкните правой кнопкой мыши файл *.csv и выберите "Свойства". В разделе Advancedизмените значение Копировать в выходной каталог на Копировать только если файл новее.
Следующая таблица — это предварительная версия данных из файла *.csv:
отметка времени | ценность |
---|---|
2018/9/3 | 36.69670857 |
2018/9/4 | 35.74160571 |
..... | ..... |
2018/10/3 | 34.49893429 |
... | .... |
Этот файл представляет временные ряды. Каждая строка в файле — это точка данных. Каждая точка данных имеет два атрибута, а именно timestamp
, и value
для представления количества телефонных звонков в каждый день. Количество телефонных звонков преобразуется для достижения пониженной чувствительности.
Создание классов и определение путей
Затем определите структуры данных входных и прогнозирующих классов.
Добавьте в проект новый класс:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт "Добавить > новый элемент".
В диалоговом окне "Добавление нового элемента" выберите класс и измените поле "Имя " на PhoneCallsData.cs. а затем щелкните Добавить.
Файл PhoneCallsData.cs откроется в редакторе кода.
Добавьте следующую
using
директиву в начало PhoneCallsData.cs:using Microsoft.ML.Data;
Удалите существующее определение класса и добавьте следующий код, имеющий два класса
PhoneCallsData
иPhoneCallsPrediction
файл PhoneCallsData.cs :public class PhoneCallsData { [LoadColumn(0)] public string? timestamp; [LoadColumn(1)] public double value; } public class PhoneCallsPrediction { // Vector to hold anomaly detection results, including isAnomaly, anomalyScore, // magnitude, expectedValue, boundaryUnits, upperBoundary and lowerBoundary. [VectorType(7)] public double[]? Prediction { get; set; } }
PhoneCallsData
указывает входной класс данных. Атрибут LoadColumn указывает, какие столбцы (по индексу столбца) в наборе данных должны быть загружены. У него есть два атрибутаtimestamp
иvalue
, которые соответствуют одинаковым атрибутам в файле данных.PhoneCallsPrediction
задает класс данных прогнозирования. Для детектора SR-CNN прогноз зависит от указанного режима обнаружения . В этом примере выберитеAnomalyAndMargin
режим. Выходные данные содержат семь столбцов. В большинстве случаев ,IsAnomaly
,UpperBoundary
ExpectedValue
иLowerBoundary
являются достаточно информативными. Они говорят вам, является ли точка аномалией, ожидаемым значением точки и нижней и верхней границы точки.Добавьте следующий код в строку справа от
using
директив, чтобы указать путь к файлу данных:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "phone-calls.csv");
Инициализация переменных
Замените
Console.WriteLine("Hello World!")
строку следующим кодом, чтобы объявить и инициализироватьmlContext
переменную:MLContext mlContext = new MLContext();
Класс MLContext — это отправная точка для всех операций ML.NET, и инициализация
mlContext
создает новую среду ML.NET, которую можно совместно использовать для объектов рабочего процесса создания модели. Концептуально, это похоже наDBContext
в Entity Framework.
Загрузка данных
Данные в ML.NET представлены в виде интерфейса IDataView.
IDataView
— это гибкий и эффективный способ описания табличных данных (числовых и текстовых данных). Данные можно загрузить из текстового файла или из других источников (например, базы данных SQL или файлов журналов) в IDataView
объект.
Добавьте следующий код под созданием переменной
mlContext
:IDataView dataView = mlContext.Data.LoadFromTextFile<PhoneCallsData>(path: _dataPath, hasHeader: true, separatorChar: ',');
LoadFromTextFile() определяет схему данных и считывает его в файле. Он принимает переменные пути к данным и возвращает значение
IDataView
.
Обнаружение аномалий временных рядов
Обнаружение аномалий временных рядов — это процесс обнаружения вылитых данных временных рядов; указывает на заданный временный ряд входных данных, где поведение не является ожидаемым или "странным". Как правило, эти аномалии свидетельствуют о некоторых событиях, представляющих интерес в области рассматриваемой проблемы: кибератака на учетные записи пользователей, сбой питания, рекордная активность RPS на сервере, утечка памяти и т. д.
Чтобы найти аномалию в временных рядах, сначала следует определить период ряда. Затем временные ряды можно разложить на несколько компонентов, так как Y = T + S + R
, где Y
является исходная серия, является компонентом тренда, T
S
является сезонным компонентом и R
является остаточным компонентом ряда. Этот шаг называется декомпозицией. Наконец, на остаточном компоненте выполняется обнаружение для выявления аномалий. В ML.NET алгоритм SR-CNN — это расширенный и новый алгоритм, основанный на сверточной остаточной нейронной сети (SR) и сверточной нейронной сети (CNN) для обнаружения аномалий в временных рядах. Дополнительные сведения об этом алгоритме см. в службе обнаружения аномалий Microsoft Time-Series.
В этом руководстве вы увидите, что эти процедуры можно выполнить с помощью двух функций.
Определение периода
На первом шаге вы вызываете DetectSeasonality
функцию, чтобы определить период ряда.
Создание метода DetectPeriod
DetectPeriod
Создайте метод в нижней части файла Program.cs с помощью следующего кода:int DetectPeriod(MLContext mlContext, IDataView phoneCalls) { }
Используйте функцию DetectSeasonality для обнаружения периода. Добавьте его в
DetectPeriod
метод со следующим кодом:int period = mlContext.AnomalyDetection.DetectSeasonality(phoneCalls, nameof(PhoneCallsData.value));
Отображение значения периода путем добавления следующей строки кода в
DetectPeriod
методе:Console.WriteLine($"Period of the series is: {period}.");
Возвращает значение периода.
// <SnippetSetupSrCnnParameters>
Добавьте следующий вызов
DetectPeriod
методу ниже вызоваLoadFromTextFile()
метода.int period = DetectPeriod(mlContext, dataView);
Результаты распознавания интервалов времени
Запустите приложение. Ваши результаты должны совпадать со следующими.
Period of the series is: 7.
Обнаружение аномалий
На этом шаге DetectEntireAnomalyBySrCnn метод используется для поиска аномалий.
Создайте метод DetectAnomaly
DetectAnomaly
Создайте метод подDetectPeriod
методом, используя следующий код:void DetectAnomaly(MLContext mlContext, IDataView phoneCalls, int period) { }
Настройте SrCnnEntireAnomalyDetectorOptions в методе
DetectAnomaly
с помощью следующего кода:var options = new SrCnnEntireAnomalyDetectorOptions() { Threshold = 0.3, Sensitivity = 64.0, DetectMode = SrCnnDetectMode.AnomalyAndMargin, Period = period, };
Для обнаружения аномалий с помощью алгоритма SR-CNN добавьте следующую строку кода в метод
DetectAnomaly
.var outputDataView = mlContext.AnomalyDetection.DetectEntireAnomalyBySrCnn(phoneCalls, nameof(PhoneCallsPrediction.Prediction), nameof(PhoneCallsData.value), options);
Преобразуйте представление выходных данных в строго типизированный
IEnumerable
для упрощения отображения с помощьюCreateEnumerable
метода со следующим кодом:var predictions = mlContext.Data.CreateEnumerable<PhoneCallsPrediction>( outputDataView, reuseRowObject: false);
Создайте заголовок дисплея с помощью следующего кода как следующую строку в методе
DetectAnomaly
.Console.WriteLine("Index,Data,Anomaly,AnomalyScore,Mag,ExpectedValue,BoundaryUnit,UpperBoundary,LowerBoundary");
В результатах обнаружения точек изменения отображаются следующие сведения:
-
Index
— это индекс каждой точки. -
Anomaly
является индикатором того, обнаружена ли каждая точка как аномалия. -
ExpectedValue
— это предполагаемое значение каждой точки. -
LowerBoundary
является наименьшим значением, при котором каждая точка не является аномалией. -
UpperBoundary
является максимальным значением, при котором каждая точка не считается аномалией.
-
Выполните итерацию по
predictions
IEnumerable
и отобразите результаты, используя следующий код:var index = 0; foreach (var p in predictions) { if (p.Prediction is not null) { string output; if (p.Prediction[0] == 1) output = "{0},{1},{2},{3},{4}, <-- alert is on! detected anomaly"; else output = "{0},{1},{2},{3},{4}"; Console.WriteLine(output, index, p.Prediction[0], p.Prediction[3], p.Prediction[5], p.Prediction[6]); } ++index; } Console.WriteLine("");
Добавьте следующий вызов метода
DetectAnomaly
ниже вызова методаDetectPeriod()
.DetectAnomaly(mlContext, dataView, period);
Результаты обнаружения аномалий
Запустите приложение. Ваши результаты должны быть похожи на следующие. Во время обработки отображаются сообщения. Вы можете видеть предупреждения или обрабатывать сообщения. Некоторые сообщения были удалены из следующих результатов для ясности.
Detect period of the series
Period of the series is: 7.
Detect anomaly points in the series
Index Data Anomaly AnomalyScore Mag ExpectedValue BoundaryUnit UpperBoundary LowerBoundary
0,0,36.841787256739266,41.14206982401966,32.541504689458876
1,0,35.67303618137362,39.97331874865401,31.372753614093227
2,0,34.710132999891826,39.029491313022824,30.390774686760828
3,0,33.44765248883495,37.786086547816545,29.10921842985335
4,0,28.937110922276364,33.25646923540736,24.61775260914537
5,0,5.143895892785781,9.444178460066171,0.843613325505391
6,0,5.163325228419392,9.463607795699783,0.8630426611390014
7,0,36.76414836240396,41.06443092968435,32.46386579512357
8,0,35.77908590657007,40.07936847385046,31.478803339289676
9,0,34.547259536635245,38.847542103915636,30.246976969354854
10,0,33.55193524820608,37.871293561337076,29.23257693507508
11,0,29.091800129624648,33.392082696905035,24.79151756234426
12,0,5.154836630338823,9.455119197619213,0.8545540630584334
13,0,5.234332502492464,9.534615069772855,0.934049935212073
14,0,36.54992549471526,40.85020806199565,32.24964292743487
15,0,35.79526470980883,40.095547277089224,31.494982142528443
16,0,34.34099013096804,38.64127269824843,30.040707563687647
17,0,33.61201516582131,37.9122977331017,29.31173259854092
18,0,29.223563320561812,33.5238458878422,24.923280753281425
19,0,5.170512168851533,9.470794736131923,0.8702296015711433
20,0,5.2614938889462834,9.561776456226674,0.9612113216658926
21,0,36.37103858487317,40.67132115215356,32.07075601759278
22,0,35.813544599026855,40.113827166307246,31.513262031746464
23,0,34.05600492733225,38.356287494612644,29.755722360051863
24,0,33.65828319077884,37.95856575805923,29.358000623498448
25,0,29.381125690882463,33.681408258162854,25.080843123602072
26,0,5.261543539820418,9.561826107100808,0.9612609725400283
27,0,5.4873712582971805,9.787653825577571,1.1870886910167897
28,1,36.504694001629254,40.804976568909645,32.20441143434886 <-- alert is on, detected anomaly
...
Поздравляю! Теперь вы успешно создали модели машинного обучения для обнаружения периода и аномалии в периодической серии.
Исходный код для этого руководства можно найти в репозитории dotnet/samples.
Из этого руководства вы узнали, как:
- Загрузка данных
- Определение периода данных временных рядов
- Обнаружение аномалий в данных временных рядов
Дальнейшие действия
Ознакомьтесь с примерами машинного обучения GitHub, чтобы изучить пример обнаружения аномалий потребления питания.