Watson APIのテキスト分析をPowerShellから叩く

PowerShellからWatsonのテキスト分析を叩いてみた。

$account = @{
“username” = ****
“password” = ****
}

$spass = ConvertTo-SecureString $account.password -AsPlainText -Force
$user = $account.username

$cred = New-Object System.Management.Automation.PSCredential $user, $spass

$endPoint = “https://gateway.watsonplatform.net/natural-language-understanding/api/v1/analyze?version=2018-03-16”
$text = “ColorfulのSSDめっちゃヤバいwww Galaxy S6や廃棄品のSSDから剥がしたフラッシュやIntelの偽物が搭載されているのが確認されてるらしいwww 安価なNVMe CN600もリマークチップを使ってるとのこと、、、 最近めっちゃ秋葉原で売ってるけど買わない方が良さそうだな、、、”
$targets = @(“stocks”, “stocks”)
$obj = @{
text = $text
features = @{
sentiment = @{
}
categories = @{
}
}
}
$json = ConvertTo-Json $obj
$result = Invoke-RestMethod $endPoint -Credential $cred -Body $json -Method Post -ContentType “application/json; charset=utf-8”
$sentiment = $result.sentiment.document.score
$category = $result.categories[0]

Cognitive Servicesのテキスト分析にPowerShellから投げてみる

PowerShellからCognitive Servicesのネガポジ分析をたたいてみました。

$apiKey = “************************”
$texts = @(“ColorfulのSSDめっちゃヤバいwww Galaxy S6や廃棄品のSSDから剥がしたフラッシュやIntelの偽物が搭載されているのが確認されてるらしいwww 安価なNVMe CN600もリマークチップを使ってるとのこと、、、 最近めっちゃ秋葉原で売ってるけど買わない方が良さそうだな、、、”)
$headers = @{ ‘Ocp-Apim-Subscription-Key’ = $apiKey }
$endPoint = “https://eastasia.api.cognitive.microsoft.com/text/analytics/v2.0/sentiment”

$texts | ForEach-Object {
$text = $_
$obj = @{
documents = @(@{
language = “ja”
id = “1”
text = $text
})
}
$json = ConvertTo-Json $obj
$result = Invoke-RestMethod -Uri $endPoint -Headers $headers -Body $json -ContentType      ‘application/json; charset=utf-8’ -Method Post
$items = $result.documents
$item = $items[0]
$item.score
}

 

ML.NET

Build 2018で.NET環境に機械学習を実装するML.NETが発表されました。今までですと、Accord.NETKelpNetMegalopolisなどいくつかの機械学習を可能にするライブラリがコミュニティベースで実装されてきたわけですが標準といえるものはありませんでした。ML.NETはフレームワークとして作られ、まさにその標準を担うものといえます。

ML.NETは機械学習の実装だけでなく、フレームワークを提供するのが肝といえます。また、クロスプラットフォームで.NET Coreで実装されているため、プラットフォームを選ばずに実行できます。とりあえず、German Credit のデータを放り込んで触っているところです。

現在のところ、Linear SVMなどいくつかのモデルが使えますが、おそらく、Accord.NET とかのExtensionがモデルに関してはかなりのものを実装してくれると期待しています。

Cognitive Services updates

2018/5/7から開催されている、Microsoft Build 2018で発表された、Cognitive Serviceのアップデートで、Custom Vision APIのモデルをエクスポートできる拡張が入るようです。公式 Blogの記事では以下のようになっています。

Custom Vision (in preview) makes it easy to build and refine customized image classifiers that can identify specific content in images. Today, we’re announcing that Custom Vision now performs object recognition as well.  Developers can now use Custom Vision to train models that can recognize the precise location of specific objects in images. In addition, developers can now download Custom Vision models in three formats: TensorFlow, CoreML, and ONNX.

記事によると、iOS系のCoreML、あと、TensorFlow, ONNXでエクスポートできるようです。

分析者目線のPowerShell活用シナリオ

PowerShellもバージョンを重ね、WindowsだけではなくLinuxでの稼働などいろいろな方向性が見えてきている。それらを踏まえて、インフラ側ではなく分析者として活用を過去の事例を踏まえて検討する。

私は、業務において分析者として、PowerShellを活用してきた。なぜならば、PowerShellは.NET Framework、そして、WindowsであればCOMコンポーネントを呼び出せるため、通常だと操作がしにくいものも操作できる可能性があるためである。

例えば、パスワード付きのExcelファイルなどは分析者泣かせである。ETLツールでの対応もほとんど見ないため、分析のワークロードの中にパスワード付きExcelが入ってくるとかなり面倒になる。しかし、コンプライアンス等々の観点から、パスワード付きExcelファイルなどを処理したいというニーズは存在するであろう。

さて、PowerShellをデータ分析で用いる場合、行志向のデータを行でイテレートして集計するなどの動きは容易に起こりえるが、この辺りがPowerShellでは厄介になるところである、たしかに、PowerShellにはforeach構文とForEach-Objectというイテレートが存在し、ForEach-ObjectにはIEnumerableなどを使って、行ごとのイテレートをこなせる可能性がある。

とはいえ、IEnumerableのようなインターフェイスを使いたいもっとも、大きな理由、行を逐次的に扱うことでデータの行数に対するスケーラビリティを確保するが実現できるかどうかはここのオブジェクトの実装にも左右される面が多く一筋縄ではいかない。なぜなら、データを途中でメモリに全量バッファリングしてないかどうかは個々のオブジェクトによるからである。

Hiveなどを使って並列分散の処理環境を構築すれば回答としては単純であるが、そもそも、環境の準備に要する時間や、パスワード付きのExcelファイルが紛れ込んでいたりすると一筋縄ではいかない。そして、ただでさえデータの前処理は必要であり、なおかつ時間も要する作業であり、できるだけライトウェイトな作業を心掛けたいところではある。

分析者として、有用なcmdletを一つ上げるとすれば Measure-Object である。このcmdletは数値の合計、最大値、最小値、平均を算出できるため、データの確認に有用である。もちろん、データサイズのスケーラビリティには注意する必要があるが。

現在であれば、MCMDをWindowsで稼働させるのも容易になってきているので、PowerShellに頼るべき局面も減少してきているとは思うが、COMの呼び出しなどほかのソリューションでは困難な状況も打開できるため、PowerShellを活用した前処理基盤の構築を現在、もくろんでいる。

PowerShellの分析シーンでの活用としては、以下の記事を参照した。

DP マッチングのコードを公開しました

DPマッチングのコードをF#で書いてBitbucket で公開しました。基本的な考え方はあちこちで触れられているアルゴリズムをそのまま実装しているので特徴と呼べるものはあまりないですね。まあ、半分、知識の確認がてら作ったようなものですから。

Neural Network Console

ソニーが先に公開した、Neural Network Consoleで遊んでいる。ごくごく当たり前のモデルであればありがちな設定というのはある程度確立しているものがありその設定でいいだろう。しかし、それだけであると少し変化球を投げられると破綻する。結果、mnist +alpha で悶々とする事態は発生する。

例えば、文字と一緒にだれが書いたかモデルに組み込もうとすれば、文字種を増やして対応するとか弥縫策と思う対応はいくつも思いつくが仕組みとして組み込もうとすればどこかでモデルの構造に挑まざるを得ないだろう。そういったときに、現行のTensor FlowやCognitive Toolkit との格闘は正しいだろうかということになる。現在は、Deep Learning≒Python とみられていることもあり、半ばPython技能が必須に近くなっているがそれがいつまでも正しいだろうか。

ビジネス側の知見と、技術者の橋渡しができる超人がどんな現場でもいるとは限らない。というか、いないほうが多いだろう。技術者側がビジネス側にきちんと歩み寄れればいいがいつでも、どこでもとはいかないだろうと思っている。

実務におけるモデリング

TJOさんがなにやら、ためになる記事を書いているので乗ってみます。Let’s throwing Masakari.

汎化性能についてはそのままだと思います。基本的には、正にその通りです。ここで付け加えることは多くはないです。とはいえ、とはいえ、汎化性能でもそうなのですが、問題はどこまで求めるかですね。つまり、どこまで性能の引き上げを頑張るかです。

例えば、それがセールスとかのモデルであれば最終的なモデルの出来不出来の目安は売り上げとなるでしょう。まあ、売り上げに至るまでの細かい情報が取れる場合にはその辺の情報も加味されるかと思います。

ただ、モデルが外れることがそのまま、損失につながるような状況だと厄介です。当然ながら、モデルの結果が出るのは将来の話です。まあ、そういう場合にはモデルのモニターを通じて何らかのモデルの精度を損なうような事象が観測された場合にはリモデルの提案をするしかないかもしれません。まあ、すんなりいくかどうかは別としてですが。

まあ、そう考えると不安な事象をどうするかってことですね。例えば、モデルを作った段階で、CVとかで検証してそれなりのアウトプットが出たとしてゲインチャートなどで確認して形状の差異など不安を感じるものが出たときにどうジャッジするかとかになるのかなと思います。

モデルの解釈性と予測性のプライオリティは厄介です。両方、お客さんは取りたくなるからです。この辺は色々と厄介でございます。

う、いろいろ、表に出さないで書いたら、まったくとりとめがなくなった。

パーセプトロンによる分岐予測

PC Watchの後藤氏によるアーティクル “AMDの次世代CPUコア「ZEN」のニューラルネットワーク分岐予測機能“。注意すべきはCPUの分岐予測関連は完全に秘密のベールに包まれており、AMDが先行しているかどうかはよくわからないということに尽きる。AMDにしても殆どの情報は非公開でありほとんど情報はない。

恐らく、単層のパーセプトロンだろうってことぐらいしか、恐らくほとんど情報はないのではないか。ただ、実用上はいわゆるオンライン学習になっているだろうとも考えられる。ただ、そうすると学習したモデルの揮発からの保護はどうなっているのかという問題も生じる。一旦、学習させ尽くしてしまってコールドスタート時からはファクトリープリセットのモデルに戻すというのならばこの問題は生じないが。

ただ、パーセプトロンでも通常、過学習の問題は生じるので、コールドスタート時はファクトリープリセットのモデルに戻すというのも悪い発想ではないとも考えられる。