Jack of all trades

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

ComCamp 2016 Powered By MVPs 岡山会場でVSTSのお話をしてきました

去る2016/2/20にComCamp 2016 Powered By MVPsというMicrosoft & Microsoft MVPsによる無料のIT勉強会が開催されました。

technet.microsoft.com

私も岡山会場にて「Visual Studio Team Services スモールスタート」というタイトルでセッション担当させていただきました。 きよくらさん( @kiyokura )と2人体制のセッションだったので割と気持ちは楽だったのですが、諸事情によりトークボリューム的には 7、8割方私がしゃべることに。

セッション中、アンケート的に「VSTS知ってる方、使ってる方はどれくらいいらっしゃいますか?」「じゃあTFSは?」という 投げかけをしたところ、約50人の参加者の方で挙手をいただいたのはパラパラと数名…。 やはり中身どうこういう前に製品・サービスの認知度が低いのも課題かなと感じました(まぁ参加者の方が皆様shy boyだった可能性もありますが)

とはいえ、本セッションはそういったVSTS自体をよく知らない方もターゲットとして、出来るだけ導入のハードルを下げるための内容だったので ある程度の成果はあったと信じたい。

セッション資料についてはDocs.comにアップしておりますので、必要に応じてご参照いただければと思います。

また、懇親会と兼ねる形でなだれ込ませていただいた「座駆動LT大会20160220」でもLT発表させていただきましたが、開始前のプロジェクタートラブルと そのあとのトップバッターだったこともあって誰も覚えてないんじゃないかな…。まぁビールクズの与太話なので特に問題ありません。

今後も実業務でVSTSの運用は続けていきますし、そこで得た知見や独自に調査・研究した内容をブログ等で発信できればと考えておりますので何卒よろしくお願い致します。

Visual Studio Team Servicesのユーザー追加とステークホルダー

Visual Studio Team Services(VSTS)のライセンス周りを調べているうちにVSTSのユーザー管理やユーザーのアクセスレベルに関する情報があまりまとまってないように感じました。 いや、情報はあるんですけど "日本語のドキュメントで" 実際に利用する際の手順というか時系列に沿ったチュートリアルみたいなものが無いように思いまして。 ということで、VSTSのユーザー管理の入り口として、ユーザー追加とチームメンバー追加について解説します。ついでにアクセスレベルが「ステークホルダー」のユーザーについて軽く解説します。

ユーザーの追加

VSTSのホーム画面から「Users」の画面に移動します。
「Add」をクリックすると、追加したいユーザーのアドレスとアクセスレベルの設定フォームが表示されます。
アクセスレベルについては以下の3種類が存在します。

  • Basic
    • 基本ライセンスのレベル
    • 5ユーザーまで無料
  • Stakeholder
    • ステークホルダー(利害関係者)ライセンス
    • 利用可能な範囲は一部機能(主にタスク管理の機能)に限定される
    • 開発者以外の関係者をユーザーとして割り当てることができる
  • Visual Studio/MSDN Subscriber
    • VS/MSDNサブスクリプションを保有しているユーザーにはこのレベルを割り当てる
    • このレベルをユーザーに割り当ててもBasicの無料枠は消費されない

ここではStakeHolderレベルを選択します。

f:id:sadynitro:20160206145457p:plain

「Send Invitation」をクリックすると、一覧に追加したユーザーが表示されます。

f:id:sadynitro:20160206145503p:plain

ユーザーの追加が完了すると、追加されたユーザーのメールアカウントに対して以下の様なメールが送られます。 「Join」をクリックするとVSTSのホームが開きます。

f:id:sadynitro:20160206145512p:plain

ホーム画面まで開くことができましたが、このままではまだプロジェクトのページにはアクセスできません。 プロジェクトのページへのアクセス権限は各プロジェクトの設定で追加する必要があります。

f:id:sadynitro:20160206145518p:plain

チームメンバーへのユーザー追加

プロジェクトのホーム画面(ダッシュボード)に「Team Members」のパネルが配置してある場合はそこからチームメンバーの編集画面を開きます。

f:id:sadynitro:20160206145528p:plain

チームメンバーの編集画面でAddをクリックします。

f:id:sadynitro:20160206150148p:plain

メンバーの追加画面で、追加したいユーザーのアカウント名を入力して「Save Changes」をクリックします。

f:id:sadynitro:20160206150154p:plain

対象のユーザーがチームメンバーとして追加されます。StakeHolderレベルのユーザーを追加するとやたらと長いNOTEが表示されますが「このユーザーはステークホルダーライセンスが割り当てられています。ユーザーハブからライセンスの変更ができます。」的なメッセージなのでとりあえず放っておいて問題ありません。

f:id:sadynitro:20160206150159p:plain

因みにダッシュボードのパネルからだけでなく、プロジェクトページの設定からも同じ画面を開くことができます。 右上の歯車アイコンをクリックします。

f:id:sadynitro:20160206150204p:plain

プロジェクトの設定ページが表示されたら、対象のチーム名をクリックします。

f:id:sadynitro:20160206150212p:plain

チームの詳細画面が開くので「Members」タブ内のAddをクリックすると上述と同じ画面が開くのでメンバーを追加します。

f:id:sadynitro:20160206150217p:plain

ステークホルダーユーザーでプロジェクトページにアクセス

ユーザー追加&チームメンバー追加が完了すると対象のユーザーでプロジェクトのページにアクセスできるようになります。 VSTSのホーム画面で「Browse」をクリックして、対象のプロジェクトを選択します。

f:id:sadynitro:20160206161328p:plain

f:id:sadynitro:20160206150222p:plain

プロジェクトページでメニューを確認すると「CODE」が使用できないことがわかります。 ステークホルダーユーザーは使用できる機能は主にタスク管理機能に限定されています。 ここではバックログアイテムを新規に作成してそれにリンクしたタスクを作成できることを確認します。

f:id:sadynitro:20160206150227p:plain

ホーム画面から「WORK」をクリックして、タスク管理の画面を開きます。 バックログアイテムの画面で「New」のタブを開いてTypeに「Product Backlog Item」を選択して、Titleに任意のタイトル(要件の概要的なもの)を入力してAddをクリックするとBacklog Itemが作成されます。

f:id:sadynitro:20160206150231p:plain

追加されたバックログアイテムを開きます。

f:id:sadynitro:20160206150240p:plain

バックログアイテムの詳細を確認できます。右寄りに配置されているメニューから「New Linked Work Item」を選択すると、バックログにリンクしたタスクやバグのアイテムを作成できます。

f:id:sadynitro:20160206150244p:plain

ここではWork Item Typeに「Task」を選択し、任意のタイトルを入力して「OK」をクリックします。

f:id:sadynitro:20160206150315p:plain

作成されたタスクの詳細が開きます。

f:id:sadynitro:20160206150322p:plain

このようにステークホルダーユーザーでもタスク管理機能についてアイテムの閲覧だけでなく作成や編集も可能なので、 開発者以外の関係者に対して要望の集約や課題管理の為に利用することも可能ですね。

ステークホルダーが利用可能な機能の詳細は、以下のページを見たほうがわかりやすいかと思います。Basicライセンスとの対比表になっています。
Visual Studio Team Services Feature Matrix

以上、後半雑な感じになりましたが、VSTSのユーザー管理についてはじめの一歩的な解説でした。

Visual Studio Dev Essentialsの特典が解放されました

ようやく来ましたね。月額25$のAzureクレジット(だけじゃないけど)

sadynitro.hatenablog.jp

↑の記事を書いた時には未だComing soon状態だったVisual Studio Dev Essentialsの特典が解放されました。 やはり注目は月額25$のAzureクレジット(サインアップから12ヶ月間)*1ですね。 此度はこの特典を実際に使えるようにサインアップする(Activate)ところまでやってみたいと思います。

Visual Studio Dev EssentialsのHome画面を確認すると新たに解放された特典を確認できます。 Azureの月額クレジットだけでなく、Universal Windows Platform VMMicrosoft R Server Developer Edition、Xamarin University Mobile Trainingなどがいつの間にか利用可能になっています。 *2
f:id:sadynitro:20160205212411p:plain

Azureの月額クレジットのパネルで「Activate」をクリックすると特典のサブスクリプションでサインアップするページに飛びます。
f:id:sadynitro:20160205213236p:plain

ここから先は通常と変わらないAzureのサインアップ画面なので、順番に情報を入力して進めていきます。
まず個人情報を入力。
f:id:sadynitro:20160205213044p:plain

電話 or テキストメッセージでコードを取得し、認証。
f:id:sadynitro:20160205213052p:plain

残念ながら!残念ながら!(大事な事なので2回言いまs)支払情報の入力も通常のサインアップと同様です。 学生の方はDream Sparkを利用したらいいと思うので、個人開発者の方は諦めてカード情報を入力しましょう。
f:id:sadynitro:20160205213057p:plain

カード情報を入力できたら、契約やら何やらに関する声明に同意のチェックを入れて「サインアップ」をクリックします。
f:id:sadynitro:20160205213103p:plain

準備中の画面。
f:id:sadynitro:20160205213111p:plain

準備完了後にサブスクリプションページに移動したところ。「開発者プログラム特典」という名称のサブスクリプションが登録されています。 f:id:sadynitro:20160205213120p:plain

サブスクリプション名をクリックして詳細を開くとちゃんと3000円分のクレジットが付与されていることを確認できました。 f:id:sadynitro:20160205213128p:plain

以上、待望の特典解放についてご紹介しました。無償評価版(1ヶ月)と比べて、ハンズオン形式の勉強会等でも利用しやすいと思います。*3 皆様ゼヒご活用いただければと思います。

*1:MSDN特典と同じく開発、テスト目的で使用する為に提供されています。3000円分なのでやらないとは思いますが本番環境用途では使用されませんように。保証されませんしね。

*2:個人的にはMicrosoft R Serverの検証をしたいところですね。

*3:1ヶ月分だとハンズオンで意識が高まっても、その後に本格的な実験や検証ができないケースが見受けられたので…

Visual Studio Team ServicesのPull Requestに関する最近の追加機能

本エントリーはVisual Studio / Visual Studio Code Advent Calendar 2015の15日目です。

qiita.com

まずはお詫びから…。実際の担当日からかなりの日数経過してしまいました…。 担当日の夜中から体調不良を起こしており、色々検査に回された結果、軽い胆嚢炎の模様です…。*1

とりあえず、何とか書き物をする気力を持ち直してきたので本記事書きあげて投稿致します。

昨年は「Visual Studio OnlineでPull Request駆動開発」という記事でアドベントカレンダーに参加させていただきました。

sadynitro.hatenablog.jp

今年は名称も新たに「Visual Studio Team Services(VSTS)」となった本サービスのPull Request機能に注目して、最近追加された幾つかの機能をピックアップしてご紹介します。 昨年のアドベントカレンダー時点よりさらに便利にPull Request駆動開発ができること請け合いです。*2

1. Home画面のPull Requestウィジェット

最近一新されたHome画面(ダッシュボード)でPull Requestのウィジェットを追加することができます。

f:id:sadynitro:20151219000530p:plain

設定の画面でブランチやアサインの向き先を選択できます。

f:id:sadynitro:20151219002651p:plain

設定した内容に従ってアクティブなPull Requestが一覧で表示されます。

f:id:sadynitro:20151219000602p:plain

2. Pull Request一覧画面の追加機能

Pull Request一覧画面を開くと、最上段に直近の変更があったブランチ名と「Create Pull Request」ボタンが表示されます。

f:id:sadynitro:20151219000611p:plain

このボタンをクリックすると、直近の変更があったブランチをデフォルトブランチ(規定ではmaster)にマージする設定が入った Pull Request作成画面に飛ぶことができます。

f:id:sadynitro:20151219000615p:plain

また、Pull Request一覧画面の情報量が増え、かなり見やすくなりました。

Pull Requestのステータス表示や対象のソースブランチとターゲットブランチの表示、レビュアーをアイコン表示(レビュアーの付けた評価もアイコンで表示!)さらにPull Requestにつけられたコメントの数など、この一画面で大体の状況を把握できるようになりました。

f:id:sadynitro:20151219004529p:plain

3. Pull Request詳細画面の追加機能

Pull Requestの詳細画面で、右のサイドバー領域にコミットにリンクされたワークアイテム(タスクなど)が一覧表示されるようになりました。

f:id:sadynitro:20151219000830p:plain

4. Visual Studio 2015 Update1のチームエクスプローラ

おまけとして、最近リリースされたVisual Studio 2015のUpdate 1で追加されたPull Request関連の機能をご紹介します。

「プル要求」という何とも微妙な日本語訳のメニューが新たに追加され、ここからPull Requestを作成することができるようになりました。

f:id:sadynitro:20151219000842p:plain

「新しいプル要求」をクリックするとPull Request作成画面が開くので、ソースブランチとターゲットブランチを選択、Pull Requestのタイトルと内容を入力してPull Requestを作成します。 「ブラウザーで開く」にチェックを入れておくと、作成したPull RequestをVSTSの画面で開きます。*3

f:id:sadynitro:20151219000846p:plain

また「プル要求」の画面では、アクティブなPull Requestを一覧で表示してくれます。

f:id:sadynitro:20151219000856p:plain

まとめ

以上、VSTSのPull Requestに関する最近の追加機能についてご紹介しました。Marketplaceからインストール可能なExtentionも登場し、これからさらに便利になるであろうVSTSを是非お試しいただければと思います。

(そして、改めてお詫びを…穴をあけてしまって申し訳ない…。)

*1:担当日当日に急に上腹部が痛み出して、夜中に救急送りになり、痛み止めで凌いでいたもののどうにも良くならないので再度外来受診したら胆嚢炎の診断…。年の瀬に何たるアンラッキー…。

*2:そうでもなかったらすみません…。

*3:あれ?レビュアーの設定は…?ブラウザーで開いた後に設定するしかない…?

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

↓同シリーズの過去記事

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
Azure Machine Learning できるとこまでやってみよう Vol.3 - Jack of all trades

本エントリーはMicrosoft Azure Advent Calendar 2015の13日目です。

qiita.com

Vol.3からかなり期間が空いてしまい既に忘却の彼方ですが、Vol.4ではテキスト解析的なことをやってみます。

実現したいこと

適当なテキスト(ベタなところでTwitter上のツイートとか)にポジティブorネガティブのラベルを付加したデータを学習させて、入力したテキストに対してネガティブorポジティブを返すというフィルタ的なものを作成したいと思います。

実装

1. データの準備

任意のテキストに対して、その内容がネガティブかポジティブかを判定できるように学習させたいので、テキスト列(text)と評価列(value)を持ったCSVファイルを作成しました。
テキスト列についてはとりあえず評価しやすそうな文章をTwitterから拾ってきて、それらに手動で評価列をnegativeかpositiveで付加しています。
今回使用するモジュールの特性上(というかテキスト解析の場合ほぼそうなのですが)テキスト列には元の文章を分かち書きしたものが入っています。*1ちなみに分かち書きにはMeCabを使用しています。

f:id:sadynitro:20151212230225p:plain

準備したCSVファイルをこれまでの記事でやったのと同様、MLStudio上にアップロードしてDatasetとして保存します。

f:id:sadynitro:20151212230242p:plain

f:id:sadynitro:20151213113926p:plain

2. データの読み込み

まずは新しいExperimentを作成します。

f:id:sadynitro:20151212230312p:plain

Experimentの編集画面で「Saved Datasets」→「My Datasets」の中から、アップロードしたDatasetを選択、配置します。

f:id:sadynitro:20151213114005p:plain

f:id:sadynitro:20151212230328p:plain

3. Feature Hashing

Azure MLで使用可能な分類、予測等の学習アルゴリズムは基本的に説明変数として数値しか扱うことができません。 このままでは分かち書きしたテキストを説明変数、ネガポジの判定を目的変数にして学習させてもテキストが変な数値に置き換わって意味のない学習になるか 最悪エラーで学習が実行できないか、まぁそんなことになってしまいます。

そこでまずFeature Hashingというモジュールを使用して、分かち書きしたテキストをハッシュ化(ベクトル化)します。

Feature Hashingとは…については、先人たちのお知恵をWebの世界で探索していただければと思うのですが、ザックリいうと、その文書がどういった特徴で構成されているかを0 or 1の行列で表現するように変換する手法です。 例えば、テキストxに対してv[hoge]=0であればテキストxはhogeという特徴が含まれていない、逆にv[hoge]=1であれば含まれている、といった表現になります。

Feature Hashing - Wikipedia

Feature HashingモジュールはText Analyticsの中にあるので、これを選択・配置します。

f:id:sadynitro:20151213114048p:plain

f:id:sadynitro:20151212230353p:plain

適用する列はもちろんtextにします。

f:id:sadynitro:20151212230422p:plain

Feature Hashingのプロパティには対象列の選択以外に「Hashing bitsize」と「N-grams」を設定します。 Hashing bitsizeはハッシュ化後のベクトルの長さを設定します。N-gramsは平たく言うと文書中の文字をいくつまでまとめて判断するかという数値を設定します。 「私は田中一郎です」という文章を対象とした場合、N=2で設定すると

  • 私は
  • は田
  • 田中
  • 中一
  • 一郎
  • 郎で
  • です

という感じで文書を解析していきます。

全文検索 - Wikipedia

とりあえず今回は以下のような設定で実行してみます。本来はこのハッシュ化が学習に大きく影響するのでもっと真面目にチューニングすべきところかと思います。

f:id:sadynitro:20151212230449p:plain

ハッシュ化されてしまえば、textは不要なので、「Project Columns」モジュールで得られたハッシュ(ベクトル)とネガポジ判定(value)の列だけを選択します。

f:id:sadynitro:20151212230547p:plain

ハッシュ化して列を取捨選択した後のデータセットの中身を見てみるとこんな感じです。0ばかり並んでますが、ベクトルの後ろの方にはちゃんと幾つかの1が入ってます。

f:id:sadynitro:20151212230528p:plain

4. 学習モデルの構築

これで学習データの準備が整ったので、あとは毎度おなじみ「Split Data」でデータを学習用と評価用に分割して学習アルゴリズムと評価のモジュールを接続していくだけです。

f:id:sadynitro:20151212230609p:plain

今回は0.8で設定(全データ中80%を学習データ、20%を評価用データに振り分ける)

f:id:sadynitro:20151212230615p:plain

学習アルゴリズムとして「Two-Class Bayes point machine」を選択しました。2種類の分類フィルターといえばベイジアン…的な思い込みで選択しています。 これも本来はきちんと適用ケースに応じてアルゴリズムを選択、チューニングすべきところかと思います。

f:id:sadynitro:20151212230642p:plain

Labelにはもちろんvalueを選択。

f:id:sadynitro:20151212230711p:plain

「Two-Class Bayes point machine」モジュールのプロパティはこんな感じ。Iteration回数を変えるだけでも学習の結果が少し変わってくると思います。

f:id:sadynitro:20151212230716p:plain

5. 学習の実行

最後に評価のための「Score Model」モジュールを接続して、さらに評価結果を見やすくするために「Project Columns」モジュールで必要な列のみ取り出すようにします。

f:id:sadynitro:20151212230741p:plain

f:id:sadynitro:20151212230753p:plain

ここまで設定できたら、下のメニューにある「RUN」をクリックして学習を実行します。

f:id:sadynitro:20151213114146p:plain

6. 評価

学習の実行が完了したら、一番下に接続した「Project Column」モジュールの下○をクリックして、開いたメニューから「Visualize」を選択します。

f:id:sadynitro:20151213114157p:plain

「value」が実際の判定、「Scored Labels」が学習済みモデルが出力した判定です。

…精度が低い…正解率およそ70%…。

要は二択なので、適当に出力しても正解率は50%程度になるはず、と考えるともう少し精度が欲しいですね。

f:id:sadynitro:20151212230821p:plain

7. 改善のアイデア

学習の精度を上げるアイデアは幾つかあります。

ここまでに何度か言い訳のように「もう少し真面目に~」「もう少しきちんと~」と書いていた部分があるかと思いますが、そのあたりを改善するだけである程度効果があると考えています。 以下に改善すべきポイントを箇条書きします。

  • 学習データをクリーニングする。今回もできるだけネガティブ、ポジティブの感情がわかりやすいテキストをチョイスしているが、できるだけ特徴量が抽出しやすいデータを準備する。
  • 学習データの量を増やす。今回はたったの100件強のデータしか用意できなかった。本来テキストから特徴量を抽出してフィルタを作成しようと思うとデータが圧倒的に足りていない。*2
  • Azure ML上における「Feature Hashing」モジュールの特性をもう少しちゃんと理解してチューニングする。与えるテキストのエンコードやパラメータの設定によって学習に影響があると考えられる。
  • 学習アルゴリズムのパラメータを適切に設定する。これに関しては実際に実行してみながら、実験ベースでチューニングするしかないと思います。
  • 学習アルゴリズムとしてより適切なものを探す。各アルゴリズムに対して一般的に言われている「○○に強い」などの特徴を参考に、これも基本的には実験ベースで確認するしかないと思います。

まとめ

本記事では、Azure ML上でテキスト解析を行い、ネガポジ判定をする学習フィルタを構築する方法を説明しました。

因みに、学習の精度を上げるアイデアについても幾つか記述しましたが、それらを全部施したからといって思わしい精度まで向上する保証はありません。 さらにいうと、ここでの評価で精度が高かったからといって、全ての文書に対して同様の精度が得られるとも限りません。 さすがに厳密な精度を求められるシステムにおいては、綿密なチューニングともう少し複雑なモデルの構築が求められるでしょう。

しかしながら、上述のような簡単な操作で、お手軽にテキスト分類をしてくれる学習フィルタを構築できると考えると、やはりAzure ML恐るべしと言わざるを得ません。

ということで以上です。明日のMicrosoft Azure Advent Calendar 2015 14日目はtksarahさんです。よろしくどうぞ。

*1:なぜ分かち書きが必要かというと、日本語のように全ての単語が区切られることなくベタで書かれていて読み手がよしなに判断する言語というのは、まず形態素解析して分割(分かち書き)する必要があるわけです。逆に英語をはじめとするラテン言語等は全ての単語が必ずスペースによって区切られているため、この手間をかけることなくテキストの解析手法を適用することができます。

*2:様々な種類の文書に対してある程度の精度(汎用性)が欲しいという場合は特にデータの質と量が重要かと思います