fc2ブログ

AzureのAnomaly Detectorを使う(1)

 AzureのCognitive ServiceにAnomaly Detectorという「異常検知」の機能があることを知りましたので、使ってみました。

 いつも通り、始めにAzure側のセッティングを行いました。Cognitive ServiceはTranslatorComputer Visionで経験があるので、Anomaly Detectorについても同様に設定を行いました。AzureAnomalyDetector_setting_1_211123.png動かすソフトから利用する情報は、エンドポイントとキー(2つのうちの1つ)です。AzureAnomalyDetector_setting_2_211123.png
 Anomaly Detectorは、過去データを学習して、最新のデータが異常か否かを判断、変化点や異常検出の境界も自動的に検出できるようです。AzureAnomalyDetector_spec_1_211123.png理論を説明したページにどのような異常点が検出できるかについて記載がありました。面白そうですね。AzureAnomalyDetector_spec_2_211123.png
 サンプルプログラム(Latest point detection with the Anomaly Detector API.ipynb)がGitHubにありましたので、実行してみました。実行はWeb API(RESTful API)を使うので、データはJSON形式でした(univariate_sample_daily.json)。また、JSONファイルの日時(timestamp)のフォーマットはISO8601で規定されているもので、'2018-01-01T12:00+09:00'のような感じです。単純な「2021/11/23 17:00:00」のような日時形式のcsvファイルしか手元にない場合は、前処理で日時形式変換とJSON変換を行う必要がありますが、プログラムを組めば簡単にできますね。

 サンプルプログラムでは、データを読み込んだ後に「detect_anomaly(x)」という関数を実行するだけですが、xは感度で、この値に応じて「異常検出の境界」が設定されるようですね。AzureAnomalyDetector_1_211123.pngAzureAnomalyDetector_2_211123.pngAzureAnomalyDetector_3_211123.png感度が高い(95)と境界が狭く、低い(85)と境界が広いことが分かりました。この境界に観測点が含まれていない場合が「異常」として判断され、赤点で表示されています。

 別のデータセットを試してみようと、日経平均の終値のデータセットを準備しました。csvファイルで日時も単純な形式だったので、ISO8601の日時に変換し、jsonファイルに保存しました。実行結果は以下の通りです。950レコードほどのデータですが、解析時間が2分弱かかりました。結構な計算量なのでしょうか??無料版だから??AzureAnomalyDetector_new_1_211123.pngAzureAnomalyDetector_new_2_211123.png結果は出力されますが、大事なのはこの異常データから何を読み取り、どうアクションにつなげるかですね。

 今回は1変数の時系列データの異常検知ですが、多変数データについてもサービスが準備されています。ただし、提供されているAzureのリージョンは(2021/11/23時点)、東南アジア、オーストラリア東部、カナダ中部、北ヨーロッパ、西ヨーロッパ、米国東部、米国東部2、米国中南部、米国西部2、英国南部の10か所とのことで、日本が含まれていないので、海外のリージョンに接続する必要があります。また、機会があれば試してみようと思います。
スポンサーサイト



AzureのTranslatorを使う(2)

 久々(1年ぶり)にAzureのCognitive Serviceにある翻訳機能「Translator」を使ってみようと思いました。1年前のブログではPython、Flaskを使ったサンプルコードそのままのWebアプリでしたが、今回はC#でデスクトップアプリに作り直す試みです。

 Azure上の設定は1年前のブログのままで何も触りませんでした。プログラムを動かすために必要な情報は、
 ① Subscription key
 ② Service endpoint
 ③ Service Region location
の3つです。

 作成したアプリは、GUI上で翻訳したい言語の文書を記入し、その言語と変換後の言語をドロップダウンリストで選択した上で、翻訳ボタンを押すと、Web API経由でAzureにデータを送り、変換後の翻訳を受け取り、表示する単純なものです。C#のConsoleアプリのサンプルがあったので、参考にして、Formアプリに作り直しました。言語は、日本語、英語、中国語、韓国語の4言語としました。コード(処理部のみ)は以下の通りです。
// Azure-Translator program(C#)
using System;
using System.Text;
using System.Windows.Forms;
using System.Net.Http;
using Newtonsoft.Json;

namespace translate_test
{
public partial class Tranlate_test : Form
{
// Azure setting
private static readonly string subscriptionKey = "……………………"; // Subscription key
private static readonly string endpoint = "https://api.cognitive.microsofttranslator.com/"; // Service endpoint
private static readonly string location = "japaneast"; // Service Region location
private string FromLang = "";
private string ToLang = "";

public Tranlate_test()
{
InitializeComponent();
}

private string[] LangList = {"日本語", "英語", "中国語", "韓国語" };
private string[] LangCode = { "ja", "en", "zh-Hans", "ko" };

private void Tranlate_test_Load(object sender, EventArgs e)
{
this.FromTextBox.Text = "";
this.ToTextBox.Text = "";
foreach (string a in LangList)
{
this.FromComboBox.Items.Add(a);
this.ToComboBox.Items.Add(a);
}
this.FromComboBox.SelectedIndex = 0;
FromLang = LangCode[this.FromComboBox.SelectedIndex];
this.ToComboBox.SelectedIndex = 1;
ToLang = LangCode[this.ToComboBox.SelectedIndex];
}

private async void TranslateRun_Click(object sender, EventArgs e)
{
// Input and output languages are defined as parameters.
string route = "/translate?api-version=3.0&from="+ FromLang + "&to=" + ToLang;
string textToTranslate = this.FromTextBox.Text;
object[] body = new object[] { new { Text = textToTranslate } };
var requestBody = JsonConvert.SerializeObject(body);

using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
// Build the request.
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(endpoint + route);
request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
request.Headers.Add("Ocp-Apim-Subscription-Region", location);

// Send the request and get response.
HttpResponseMessage response = await client.SendAsync(request).ConfigureAwait(false);
// Read response as a string.
string result = await response.Content.ReadAsStringAsync();

// Remove [ ] from result string
string result_temp1 = result.Replace("[", "");
result = result_temp1.Replace("]", "");

// Deserialize data
dynamic d = JsonConvert.DeserializeObject(result);

// View of result sentense
this.Invoke((Action)(() => { this.ToTextBox.Text = d.translations.text; }));
}
}

private void FromComboBox_TextChanged(object sender, EventArgs e)
{
FromLang = LangCode[this.FromComboBox.SelectedIndex];
}

private void ToComboBox_TextChanged(object sender, EventArgs e)
{
ToLang = LangCode[this.ToComboBox.SelectedIndex];
}

}
}
 久々にC#でコードを組んだので、つまづいて難儀した所もありました。はまったのは以下の2点です。
 ① 63-70行目のWeb APIのリターンであるJSONから必要なテキスト部分を抜き出す所
   → リターンの文字列から[]を取り除くという格好が悪いことをして対応・・。
 ② 73行目のテキストボックスに表示する所
   → フォームアプリにありがちなことを忘れていました・・。別スレッドでしたね。

 作成したソフトで、以下の日本語の文章を英語、中国語、韓国語に変換し、韓国語に変換された文章を再度日本語に変換しました。「NTTドコモは10日、10月に起きた大規模通信障害について、影響人数は音声通話で約460万人、データ通信サービスで830万人以上だったと発表した。のべ1290万人に達する。」

この文章の10日はニュースが出された11月10日のことなので、10月10日というのは違いますね。よくよく調べてみると、英語への変換でも、日本語から英語に変換した時点で、すでに10月10日になってしまっていました。
 NTT DOCOMO announced on October 10 that ...
中国語は正常でした。
 NTT DoCoMo公司10日宣布,10月份发生的大规模通信故障・・
また、韓国語への変換もGoogle翻訳で確認すると、正常であることが分かりました。結局、韓国語から日本語の変換で間違ったようです。このAzureのTranslatorの例では、「日→英」と「韓→日」が誤訳した結果でしたが、Google翻訳をかけてみると、すべて正しい翻訳でした。Google翻訳、さすがですね。

 今回、C#でAzure-Translatorの簡便なGUIを作成できました。また、久々にコードを組んで、はまりながら大変勉強になりました。感覚が鈍らない程度にコードを組まなくてはならないですね・・。

M1 Macで「Windows11」を使う

 前回のブログでM1 Macに「.NET 6」をインストールしたお話をしましたが、その流れを受けて、Parallels Desktopで動かしているWindows10にも「.NET 6」を入れておこうと思いました。「.NET Multi-platform App UI」(.NET MAUI)やWPF(Windows Presentation Foundation)を利用できればという思惑です。

 その前に、Parallels DesktopでWindows10を立ち上げる度に、Insider版ではなく、正規版で認証しなさいと何度も警告が出るので、遊休のWindows10 Proのライセンスで認証しました。認証は以前もトライして、その時は何度もエラーではじかれていたので放っておいたのですが、今回はうまく行きました。(Windows、よく分からないですね。単にバグがあり、直されただけかも・・)

 Windows版の「.NET 6」のインストーラ「dotnet-sdk-6.0-100-win-arm64.exe」を所定のサイトからダウンロードして実行すると、早速出鼻をくじかれました。(またか、やれやれ・・)dotnet6_win_211120_1.png インストール先のPathが干渉しているとのこと。そう言えば、Visual Studio 2019 Communityをインストールしていて、その際に「.NET 5」もインストールしていたことを思い出しました。「.NET 5」をアンインストールして、再度「.NET 6」のインストーラを実行すると、今回はうまく行きました。ことごとく、Windowsから嫌われていますね・・。(自分が嫌っているだけ・・)dotnet6_win_211120_2.png
 Windows10を使っているうちに、Windows11へのUpgradeが勧められました。以前、Win11へのUpgradeも失敗に終わっていたので、M1 Macで「できるか/できないか」分かりませんでしたが、今回はできるかもと思い、試してみました。結果、今回はうまく行きました。win11_arm64_211120_1.pngUpgrade結果も問題なさそうですね。win11_arm64_211120_2.png
 Windows11にUpgradeできたので、先程の「.NET 6」でwpfアプリの動作を試してみました。結果、問題なく動作し、XamlのWindowフォームが立ち上がりました。ちなみにこのアプリをmacOS環境で実行しようとしましたが、うまく行きませんでした。そもそもパッケージのインストールができないので当然ですが・・。dotnet6_win_211120_3.pngmauiはWindows(Arm64)でもまだですね。dotnet6_win_211120_4.png
 結局、今回の進展をまとめると、以下の2点です。
 ・M1 Mac(Arm64)上で「.NET 6」がインストールできて、Consoleアプリが実行できた。
 ・M1 Mac(Arm64)からParallels Desktop経由のWindows11上で、Consoleアプリとwpfアプリが実行できた。

 最後に、Windows環境の刷新の仕上げとして、Visial Studio 2022 Communityを所定サイトからダウンロードしてインストールしました。VS2022_arm64_211120_1.png 無事にインストールできたので、起動させました。VS2022_arm64_211120_2.pngVS2019の起動画面は個人的に好きだったのですが、VS2022は地味になった感じがします。じっくり触れていませんが、操作性、画面構成はVS2019と同じようですね。違和感なく使えそうです。「.NET 6」のConsoleアプリのサンプルコードも問題なく実行できました。VS2022_arm64_211120_3.png
 今回、Arm64のM1 mac環境にWindows11を入れることができました。今まで、Windows11はAzure上で味見をしていた所なので、M1 macに切り替えても良いかなと思いました。日々のお金もかからないですしね。

M1 Macで「.NET 6」を味見する

 「.NET 6」の正式版が先週(11/8)リリースされたので早速味見をしてみました(新しいもの好き)。プレビュー版7回、rc版2回を経ての正式版(LTS)です。

 利用しているM1 MacがArm製のCPUなので「.NET 5」の時は対応しておらず、「.NET 6」のバージョン「6.0.100-preview.2」で初めてArm64に対応したようですが、その後何かとバグフィックスがあると思われたので、今回の正式版を待っていました。
 このM1 Macですが、Parallels DesktopWindows環境を作っているので「.NET 5」はインストールできて、利用していました。

 「.NET 6」は、Microsoftの所定ページから「macOSのArm64」をダウンロードしました。dotnet6_211119_1.pngインストール後の情報確認画面は以下の通り。Version 6.0.100のSDKとRuntimeが無事にインストールされました。dotnet6_211119_2.png
 早速、consoleアプリの動作確認を行うために、ターミナルから
dotnet new console -o hello
を実行して、Program.csを確認しました。dotnet6_211119_3.png うっ、コードがこの1行だけ・・。Main関数は?
Console.WriteLine("Hello, world!");
 Microsoftのドキュメントを調べてみると、「C# 9 以降では、Main メソッドを省略し、Main メソッド内にあるかのように C# ステートメントを記述することができます。」とのこと。また、追加情報で、C# 9.0は「.NET 5」以降でサポートされていたようですね。「.NET 5」の正式版リリースが2020/6/10。いまさらですが気付きました・・。dotnet6_211119_4.png
 脱線はそれぐらいにして、1行のコードですが、実行すると無事に結果が出ました。dotnet6_211119_5.png Consoleアプリでなく、GUIアプリも1日でも早く、M1 Macで「楽に」動かしてみたいところですが、現時点(21/11/19)ではまだですね。「.NET Multi-platform App UI」(.NET MAUI)やWPF(Windows Presentation Foundation)が対応したら、面白いと思うのですが・・。ちなみにParallels Desktopで起動させたWindows上では、Arm64でもWPFアプリは動作しました。開発過渡期と思いますので、楽しみに待つことにします。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: