Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

Windows Phoneアプリ作りました

前回のエントリーから2か月も経ってる。。。

VSOもMLほったらかして完全に別ごとやってました。ということでWindows Phoneアプリ作りました。 もちろんおでこんに向けて。

※「おでこん」は@od_10zさん主催のWindows Phoneアプリケーションコンテストです。

MADOSMAを買ったこともあり、最近Windows Phoneづいてます。昨年のde:codeで配布された教材Phoneは完全にWindows10 Mobileプレビューの評価機と化してますが、MADOSMAはがっつり通常運用です(2台持ちのサブ機ですが)

で、此度作ったアプリは「Memotch」という名のToDo管理とメモの中間的なアプリです。なんか買わなきゃいけないとか調べなきゃいけないとか、日々のちょっとしたタスクを登録できます。タッチデバイスで文字入力するのが心底めんどくさい派なので、出来るだけ文字入力を減らして、付箋的な気軽さでメモれるようにしてみました。

Memotch

スクリーンショットその1。
アイコンと内容だけのシンプルなToDoリスト。
f:id:sadynitro:20150722143840p:plain

スクリーンショットその2。
名詞だけ文字入力して、それに対する行動をタイルから選択するだけでToDoメモが作成できます。
f:id:sadynitro:20150722143901p:plain

ということで、Windows Phoneをお持ちの方はお試しいただけるとこれ幸い。

Git-TFを使ってTFVCリポジトリを履歴ごとGitリポジトリに移行する

事の発端は@kkamegawaさんのツイート↓

そんなまさか…。あの気難しいTFSのリポジトリでそんなにさくっといくはずが…。
そう思っていた時代が私にもありました。

実際にやってみる

こういうのは実際にやってみるに限る。ということで検証してみます。
基本的には@kkamegawaさんのツイートにあるBlogの説明沿ってやれば簡単に出来ます。

Migrating a TFVC team project to a Git team project along with changeset history in TFS. - Microsoft Team Foundation Server setup support Team's Blog - Site Home - MSDN Blogs

Git-TFの導入

※Gitの導入の説明は割愛します(他所で山ほど情報転がってると思いますし)
 何かしらの方法で入れておいてください。

Git-TFのページからダウンロードします。2015/5/20現在の最新はGit-TF 2.0.3.1の模様。
Git-TF - Home

ダウンロードしたzipファイルを解凍して、適切な場所に配置します(C:\git-tf等)
配置したパスを環境変数のPATHに登録しておくと後が楽な気がします。
何とこれだけで完了。

Gitリポジトリの準備

TFVCを使用しているチームプロジェクトは既に存在していると仮定して、移行先のGitリポジトリを持つチームプロジェクトを準備します。
ちなみにここでの説明用環境はVisual Studio Onlineを利用します。

Home画面からNewを選択して…
f:id:sadynitro:20150520234029p:plain

Version ControlでGitを選択したプロジェクトを作成します。 f:id:sadynitro:20150520234040p:plain

作成したプロジェクトのCode画面を開くとこんな感じですね。 f:id:sadynitro:20150520234346p:plain

TFVCリポジトリからローカルのGitリポジトリにクローン

もうセクションの見出しからしてちょっと何言ってるかわからないレベルですが、クローンするんです。
Git bashなど、ターミナル上で適当に用意したワークスペースに移動しておきます。

そして、以下のコマンドを実行します。

Git-tf clone "http://<TFS Server Name>:Port/tfs/<CollectionName> "$/TeamProjectName" --deep

ここではDefaultCollection上のIPTimeLinerというプロジェクトからTFVCリポジトリをクローンします。 f:id:sadynitro:20150520235657p:plain これだけでTFVCのリポジトリがGitのリポジトリとしてクローンされます。

クローンしたリポジトリをリモートリポジトリにプッシュする

あとはクローンしたリポジトリをローカルからリモートにプッシュするだけです。
フォルダを移動してremote addします。 f:id:sadynitro:20150520235659p:plain

そしてpushするだけ。 f:id:sadynitro:20150520235700p:plain

これで見事にTFVCのリポジトリをGitのリポジトリに履歴ごと移動できました! f:id:sadynitro:20150521000543p:plain

以上、本当にさくっと移行できてしまいました…。小一時間も掛からないレベル…。
TFVCでプロジェクト作っちゃったけど、プルリク使ってレビューのサイクル回したい!とかいう方はゼヒ試してみると良いかと思います。

Azure Machine Learning できるとこまでやってみよう Vol.3

過去の記事はこちら↓
Azure Machine Learning できるとこまでやってみよう Vol.1 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.1.5 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.2 - Jack of all trades

此度はそれほど間を空けずに投稿できた…。

ということでVol.3です。今回はクラスタリングのモジュールを使ってモデルを構成します。と言っても、Azure ML(ML Studio)で用意されているクラスタリングのモジュールは「K-Means Clustering」のみ*1なので、こやつの説明に終始する感じです。

ClassificationとClusteringの違い

ClassificationとClusteringって同じじゃないの?と思われそうなので、軽く説明しておきます。平たく言うと、Classificationは既知の分類に対する振り分けを行うのに対して、Clusteringは未知の分類を生成します。
Classificationでは、パラメータと分類ラベルを持ったデータ群を学習データとして学習させます。学習済みの学習器に対して、パラメータのみ持ったデータを与えてやると、パラメータに応じた分類ラベルが出力されるといった寸法です。
一方Clusteringでは、パラメータのみを持ったデータ群(分類ラベルを持たない)を入力すると、そのデータ群をパラメータに応じて分類し、幾つかの塊として出力します。

K-Means Clusteringとは

上述の通り、クラスタリング用のモジュールは1つだけということで、せっかくなのでこのアルゴリズムについて簡単に説明しておきます(その他のモジュール(アルゴリズム)は種類が多すぎてカバーしきれませんが、これ一つぐらいならなんとか…)
K-Means Clusteringは以下の手順で実行されます*2

  • 分類されるグループの数(k)を設定します
  • 与えられたデータ群をランダムに分類します(k個のグループに分類)
  • 各グループごとに重心を算出します
  • 各データと各グループの重心の距離を計算し、最も距離の近いグループにデータを再分類します
  • 上記プロセスを分類に変化がなくなる、もしくは設定された回数繰り返すまで実行します f:id:sadynitro:20150519202708p:plain

例題

今回クラスタリングのモジュールを使ってモデルを構築するにあたって、簡単な例題を作成しました。
ショッピングモールのように、テナントが多数入ってる商業施設の購買データを想定します。 顧客ごとの各テナントに対する購買回数が入ったダミーデータを作成し、それを元に顧客をクラスタリングします。 ここでのポイントは、年代や性別という既知のラベルを一切使用せず、購買データ(購買行動)に基づく新たなグループに分類するということです。 せっかくなので生成したグループを使って、多少の分析もしてみましょう。

学習データの準備

例題に基づいたダミーデータをCSVファイルで準備し、新規DatasetとしてML Studioにアップロードします。
f:id:sadynitro:20150519204018p:plain
f:id:sadynitro:20150519204035p:plain
f:id:sadynitro:20150519204041p:plain

モジュールの配置

ここからモデルを構築していきます。

まずアップロードしたDatasetを配置します。
今回は予測や近似ではなく、クラスタリングなのでSplitで学習データと検証データに分割はしません。
データに接続する学習モジュールはClustering用のTrain Clustering Modelを使用します(普通のTrain Modelでない点に注意)
f:id:sadynitro:20150519204259p:plain

右のプロパティから「Launch column selector」をクリックし、グルーピングされる要素を選択します。
f:id:sadynitro:20150519204859p:plain

Train Clustering ModelにK-Means Clusteringのモジュールを接続します。ここでモジュールの設定について簡単に説明します。

  • Number of Centroids : 分類するグループ数
  • Metric : 距離計算種類
  • Initialization : 初期化手法の選択
  • Iterations : プロセスの繰り返し回数

f:id:sadynitro:20150519205042p:plain

しつこいようですが、今回は予測や近似ではないので、スコアリングや評価モジュールは接続しません。 結果を取得するためのモジュールとして、ここでは「Metadata Editor」と「Convert to CSV」を接続します。
f:id:sadynitro:20150519205808p:plain
f:id:sadynitro:20150519210101p:plain

学習の実行と結果表示

モジュールの配置が完了したら「RUN」をクリックして作成したモデルを実行します。
実行が完了したら結果を確認します。まず「Metadata Editor」の下○をクリックして「Visualize」を選択します。
f:id:sadynitro:20150519210323p:plain

元のデータの右端に分類番号が追加されていることを確認できます。 f:id:sadynitro:20150519210429p:plain

これだけだと「フーン」なので「Convert to CSV」モジュールから結果のCSVファイルをダウンロードして多少の分析を試みます。

アウトプットからさらに分析

「Convert to CSV」モジュールの下○をクリックし「Download」を選択し、CSVファイルをダウンロードします。
f:id:sadynitro:20150519210701p:plain

ダウンロードしたファイルをローカルで加工し、分析してみます。ここではExcelを使用します。
Excelのピボットテーブルを使用して、各グループの各テナントに対する平均購買回数を算出します。
算出した結果をグラフにしてみると、各グループごとに贔屓にしているテナントの傾向に明らかな差異があることが確認できます。
f:id:sadynitro:20150519211357p:plain

グラフの代わりに、グループごとに購買回数の多いテナントTOP3などを抽出しておけば、DM等の販促に利用できるかもしれません。また、視点をテナント側からに変えれば、相性の良いテナントをグルーピングして、テナントの配置や入れ替えに役立つ情報になるかもしれません*3

ちなみにここでは手動でデータ加工を実施していますが、RやPythonスクリプト実行モジュールを用いれば、自動で出力することも可能かと思います。

まとめ

今回はクラスタリングを用いたモデル作成を解説しました。少しは面白い例題になっていると良いのですが…。 一見何の役に立つかわかりづらいクラスタリングも発想次第で有用なものになる、ということが感じ取っていただけると幸いです。

ということで今回は以上です。次回はテキスト分析にチャレンジ。

*1:分類(Classification)のモジュールは沢山用意されてますね。

*2:ここで解説しているのは標準的な手順です。実際にはK-Meansの弱点を補うアイデアを盛り込んだ種々のアルゴリズムが存在します。

*3:これについてもある程度有効な手法は既にあるのですが、業務上の理由でここでは書けません…。みなさん試行錯誤してみてください。

Azure Machine Learning できるとこまでやってみよう Vol.2

過去の記事はこちら↓

Azure Machine Learning できるとこまでやってみよう Vol.1 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.1.5 - Jack of all trades

またしても随分間が空いてしまった…。

ということでVol.2です。今回もまだまだチュートリアル的内容ですがよろしくお願いします。

前回は簡単な予測モデルを作成して、ML Studio上で性能評価をするところまででしたが、今回は作成した学習済みのモデルを登録して、それをWeb Serviceとして公開する一連の流れを説明していきます。

学習済みモデルの保存

学習済みのtrain modelの下○をクリックして「Save as Trained Model」を選択します。
f:id:sadynitro:20150509122027p:plain

保存するモデルの名称と説明を入力して保存します。
f:id:sadynitro:20150509122036p:plain

学習済みモデルの配置

保存が完了すると、左側のメニューにある「Trained Models」に保存したモデルが表示されるようになります。
f:id:sadynitro:20150509122059p:plain

これを配置すると以下のようになります。
f:id:sadynitro:20150509122135p:plain

Web Serviceとして発行

学習済みモデルの配置が完了したら、下段の「PUBLISH WEB SERVICE」をクリックします。
f:id:sadynitro:20150509122650p:plain

すると…
f:id:sadynitro:20150509122659p:plain
なんかミヨーンと出てきます。これはWeb Service(API)として発行した際のInputとOutPutをどこに接続するか、というモジュールです。

「PUBLISH WEB SERVICE」をクリックすると自動でモジュールが生えてきますが、自分で自由に配置することもできます。
左側のメニューからWeb Serviceを開いてInputもしくはOutputモジュールをドラッグアンドドロップで配置、接続するだけです。
f:id:sadynitro:20150509122717p:plain

何はともあれ、これでWeb Serviceとして発行する準備ができました。
f:id:sadynitro:20150509122705p:plain

あとは下段の「RUN」をクリックして実行した後、「PUBLISH WEB SERVICE」をクリックすることで作成したモデルがWeb Serviceとして発行されます。
発行が完了すると以下のような画面が表示されます。
f:id:sadynitro:20150509122854p:plain

「REQUEST/RESPONSE」をクリックすると、実際にAPIを利用する際の情報が一式表示されます。
f:id:sadynitro:20150509122902p:plain

Request(もしくはResponse)のJSON
f:id:sadynitro:20150509122938p:plain

Input(もしくはOutput)のパラメータなど
f:id:sadynitro:20150509122954p:plain

さらにはプログラムから呼び出して利用する場合のサンプルコード(C#, Python, R)もあります。
f:id:sadynitro:20150509123004p:plain

またWeb Serviceのトップ画面から「TEST」ボタン(水色のヤツ)をクリックすると、この画面上でAPIの動作テストができます。
パラメータを入力して実行すると…
f:id:sadynitro:20150509123038p:plain

通知領域にResponse結果が表示されます。
f:id:sadynitro:20150509123050p:plain

その他にも「Excel Workbook」なるものが用意されています。Web Serviceのトップ画面にある「Download Excel Workbook」(Excelのアイコンがついてるやつ)をクリックすると、Excel上でパラメータを入力して、結果を受け取る仕組みが組み込まれたファイルをダウンロードできます。
f:id:sadynitro:20150509123032p:plain

コンソールアプリのサンプルコード

上記のサンプルコードを利用して、C#によるコンソールアプリのサンプルを作ってみました。バリデーションとか、JSONのパースがグズグズなのはご容赦。実際に画面から入力した値をパラメータとして投げて、受け取った結果から必要な値を取り出して画面に表示する際のサンプルです。

sadynitro/ExpectedVisitorConsole · GitHub

まとめ

以上、いかがだったでしょうか。ML StudioのGUIによる簡単操作もさることながら、Web Service発行についても実際に利用するパターンを幅広く想定したかなりの親切設計になっていると思います。RやPythonのコードが実行できるということもあり、既存の資産をAPI化するというだけでも使い道としてはありなんじゃないかと思ったりもします。

次回はクラスタリング(分類)について、何かしら面白そうな例題を作りつつ(Irisデータ使ったサンプルとかもう噛んでも味せぇへんでしょ)ML Studio上での手順ベースでお伝えできればと思っております。

Azure Machine Learning の更新 - モジュールの追加

Azure Machine Learningの更新があったようで、新しいモジュールが追加されています。

Permutation Feature Importance - Machine Learning - Site Home - TechNet Blogs

どうやら主成分分析的*1なモジュールのようで、Train Modelモジュールと学習データのモジュールを連結すると、学習データの内「どの項目(説明変数)」が目的の予測や分類に「どの程度」関わっているか(重要か)を数値化してくれます。 詳細なアルゴリズムについては上述のtechnet blogの方を見ていただくとして、実際に使用したサンプルを掲載します(このサンプルもtechnet blogと対して変わりませんが…)
サンプルでは「 Azure Machine Learning できるとこまでやってみよう Vol.1 - Jack of all trades 」で使用したモデルを流用します。

左側のメニューにある「Feature Selection」を開き、その中にある「Permutation Feature Importance」モジュールを配置します。配置場所としては、学習モデルの構築で「Score Model」が配置される場所です(モジュール同士の接続も同様です)
f:id:sadynitro:20150418185131p:plain
f:id:sadynitro:20150418184356p:plain

配置された「Permutation Feature Importance」モジュールを選択した状態で、右側にあるプロパティから評価指標を選択します。 選択された評価指標に基づいて、学習に使用される各説明変数を評価(スコア計算)します。
ここではRegressionの中からRelative Squared Errorを選択します。 f:id:sadynitro:20150418184406p:plain

上図の様に配置&設定ができたら、下段のメニューから「RUN」を実行します。
実行が完了したら「Permutation Feature Importance」モジュールの下○をクリックして、メニューからVisualizeを選択します。 各説明変数に対してスコアが振られており、結果的にこのサンプルでは気温が来客数の予測精度に最も関連していることがわかります。 f:id:sadynitro:20150418184711p:plain

サンプルの様に、目的変数に対してわかりやすい説明変数が用意されている場合はさておき、そもそも項目同士がどういった関係性を持っているかもわからないような大量のデータを扱う場合には非常に有効であると言えます。
また、説明変数が多かったり、単純にデータ量が多くなると、学習データのクリーニングも重要な要素になってくるかと思います。
こういった予備分析的な処理が簡単に実施できる機能が準備されているとありがたいですね。

*1:主成分分析と書くと怒られそうな…。要因分析とか単なる重要度計算とか…?