Watson StudioのJupyter NotebookでNLCの精度検証を行う

# はじめに
Watson APIのNLC(Natural Language Classifier)は、Watson APIサービスがはじまった当初からサービスを開始して、未だに継続してサービスを提供している息の長い(といっても3,4年程度ですが)APIです。
当初はAPIインターフェイスしか持っていなかったのですが、途中からベータ版のUIツールが提供され、よりUIが改善されたUIツールがWatson Studioの1機能として提供されて今に至っています。
Studio上のUIツールの利用ガイドについては、すでに別記事[Watson StudioでNLC学習を行う](https://qiita.com/makaishi2/items/abb85bf44d300beeb146)でご紹介しました。
このツールは簡易テスト機能も持っていて、テストもUIから行うことができるのですが、この場合の課題点は、テストを1件ずつしか行うことができず、対象のテストデータを同時に流して精度を求めるなどのことはできない点にあります。
この部分を補う簡易ツールを作りましたので、ご紹介します。

# 機能紹介
まず、このツールでどんなことができるのか、簡単にご紹介します。ここで紹介するのに使っている資材一式はすべてGithubにアップしてありますので、皆様の環境でも動作確認は可能です。
NLCは残念ながらライトプランはないのですが、Standardもインスタンス自体は無料で、以下の無料で動作確認できる範囲もありますので、このサンプルの確認をする分には無料の範囲で可能なはずです。

```
1カ月当たりに1つのNatural Language Classifierが無料
1カ月当たりに1000件のAPI呼び出しが無料
1カ月当たりに4件のトレーニング・イベントが無料
```

## 学習
学習については、すでに済んでいるものとします。学習はStudioの機能を使ってやっても、APIを直接呼び出してやっても関係ありません。
今回のサンプルでは、Wikipediaの次のテキストを使って、「日本史(j-hist)」「日本地理(j-geo)」「科学(science)」の3つのジャンル(クラス)の学習をさせました。

![スクリーンショット 2019-11-04 10.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/eb7695e2-d520-c696-1d81-de1142a1e03f.png)

## 検証データ
検証データは、次のようなexeclファイルを利用します。

![スクリーンショット 2019-11-04 10.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/41053541-b83a-f238-5c71-5d0fd4075f35.png)

EXCELの1行目は列名を意味します。
**text**という列名の項目は、NLCを呼び出す際に使うテキストデータを意味します。
**class**は、そのTextに対応する正解クラス名です。
それ以外の項目はテスト実施時には利用しないので、あってもなくても構いません。
今回のサンプルExcelでは便宜上キー項目の**text_id**がありますが、このような列はあってもなくても関係ないということになります。

## 出力データ
テストの結果、できあがる出力データもExcelです。そのサンプルを以下に示します。
(見やすいように見た目は後で細工しています。実際のアウトプットはもっとプレーンな状態です。)

![スクリーンショット 2019-11-04 10.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2339f5a0-71f7-6178-62fa-d47fc60d6f8b.png)

最初の3列はテスト用の入力データそのものです。それ以降は、Textをモデルにかけた結果を、
**クラス名**, **確信度** の順に出力しています。
何項目まで出力するかは、notebook上の変数で設定可能です。この例ではn=3としています。

## 混同行列
Excelとしての出力は以上のとおりですが、おまけ機能としてNotebook上では次のような混同行列(Confusion Matirx)も表示されます。
これで、どのクラスの精度がどの程度出ているのかも確認することができます。

![スクリーンショット 2019-11-04 10.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1a0d1e41-4b78-f73b-2127-3d8adf918f2f.png)

# 環境
サンプルを動かすために必要な環境を説明します。

## クラウド環境
IBM Cloudにアカウントがあり、NLCとWatson Studioがサービスとして利用可能になっている必要があります。残念ながら、NLCに関しては、クレジットカードのアカウントが必要です。
具体的な手順は、以下のリンクを参考として下さい。

### IBMクラウドのユーザー登録からJupyter Notebookが使えるまで
[クラウドでお手軽Jupyter Notebook - IBM CloudでJupyter Notebookを使えるまでの手順 -](https://qiita.com/makaishi2/items/3c95058bab17b22e10d6)

### クレジットカードアカウントへのアップグレード
[IBM Cloud(旧Bluemix)クレジットアカウントへのアップグレード手順](https://qiita.com/makaishi2/items/6d725292e39326743e62)

### 追加サービス登録手順
以下の記事ではSpark / Watson MLのサービスをStudioと関連づける手順が記載されていますが、同様の手順でNLCの関連づけが行えます。(サービスのグループはWatson ML同様に「**AI**」です)

[Watson Studioで追加サービスの登録を行う](https://qiita.com/makaishi2/items/39393d27d71301bafae5)

## 必要資材 
サンプルを動かすための必要資材は以下の通りです。

|ファイル名  |目的  |リンク  |
|---|---|---|
|nlc-test-tool-v1.ipynb  |精度検証用スクリプト本体  |[ダウンロード用](https://github.com/makaishi2/sample-data/raw/master/notebooks/nlc-test-tool-v1.ipynb) [コード確認用](https://github.com/makaishi2/sample-data/blob/master/notebooks/nlc-test-tool-v1.ipynb) |
|nlc-test-sample.xlsx  |検証用Excelサンプル  |[ダウンロード用](https://github.com/makaishi2/sample-data/raw/master/data/nlc-test-sample.xlsx)  |
|nlc-test-sample-output.xlsx  |検証結果Excelサンプル  |[ダウンロード用](https://github.com/makaishi2/sample-data/raw/master/data/nlc-test-sample-output.xlsx)  |
|nlc-train.csv  |学習用CSVサンプル  |[ダウンロード用](https://github.com/makaishi2/sample-data/raw/master/data/nlc-train.csv) [データ確認用](https://github.com/makaishi2/sample-data/blob/master/data/nlc-train.csv)|

# 手順
それでは、実際にサンプルアプリを動かすための手順を説明します。

## NLCモデルの学習
今回のサンプルアプリでは、上の ``nlc-train.csv``を学習データとして学習したモデルを使っています。
Watson Studioを利用した学習手順に関しては、別記事 [Watson StudioでNLC学習を行う](https://qiita.com/makaishi2/items/abb85bf44d300beeb146) で説明しているので、こちらを参照されて下さい。
学習が終わったら、Watson Studioのアセット管理画面で、作ったモデルのModel IDを確認します。
後で使うので、コピーしてテキストエディタなどで保存して下さい。

![スクリーンショット 2019-11-04 11.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/162043f0-339d-72ac-8f6f-dc72b91244a7.png)

## NLC資格情報の確認
https://cloud.ibm.com/services  
から、IBM Cloudのサービス一覧を表示し、NLCのリンクをクリックします。

![スクリーンショット 2019-11-04 12.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4da56483-5215-17ac-4092-6aaa8ea50c1a.png)

下のような画面になるので、
①　**サービス資格情報**をクリック
②　**資格情報の表示**をクリック
③　**クリップボードアイコン**をクリックして、資格情報のコピー
を順に行います。

![スクリーンショット 2019-11-04 12.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/62a4439b-ab7d-dec6-6f76-0d49d34045e4.png)

クリップボードの資格情報はテキストエディタなどに張り付けて保存します。この情報も後ほど利用します。

## ツールで利用するExcelのアップロード
検証に利用するExcel ``nlc-test-sample.xlsx``をクラウド上にアップロードします。
手順は、次のとおりです。

* https://dataplatform.cloud.ibm.com/projects から、プロジェクト管理のメイン画面を表示

* 画面上部の**Add to project**から**Data**を選択(下図)

![スクリーンショット 2019-11-04 12.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/20d7a2aa-4775-d1cf-5f91-057eb89c5baa.png)

![スクリーンショット 2019-11-04 12.22.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/76a897bb-1697-ca40-021f-9f875b84d66e.png)

* 下の画面の赤枠にExcelファイルをdrag and drop
 
![スクリーンショット 2019-11-04 12.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/97194cb9-39a8-2485-4c2c-7ae647e4cf60.png)

アップロードが正常に終わると、次の図のように、**Data Assets**の中に``nlc-test-sample.xlsx``が表示されるようになります。

![スクリーンショット 2019-11-04 12.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9ee44a72-21ed-6f2d-80ff-0baecb7f013c.png)

## NotebookのWatson Studioへの読み込み
事前にダウンロードした``nlc-test-tool-v1.ipynb``をWatson StudioのJupyter Notebookに読み込みます。
読み込み手順については、[クラウドでお手軽Jupyter Notebook - IBM CloudでJupyter Notebookを使えるまでの手順 -](https://qiita.com/makaishi2/items/3c95058bab17b22e10d6) を参照して下さい。

## COS資格情報の設定
読み込んだJupyter Notebookは環境に合わせて何カ所か修正する必要があります。  
まず、COS資格情報の設定を行います。読み込んだ直後のNotebookは、下の図のようになっているはずなので、画面上部の「**+**」アイコンをクリックしてセルの挿入を行います。

![スクリーンショット 2019-11-04 12.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5acf21d8-f1c8-84ed-8dc3-48cd437fc4bc.png)

下の図の状態で

①　画面上部の**ファイル**アイコンをクリック
②　ファイル一覧から、先ほどアップロードした``nlc-test-sample.xlsx``をクリック
③　出てきたメニューから**Insert Credenstails**をクリック

![スクリーンショット 2019-11-04 12.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ee7b900a-c6fd-63fb-1092-d4291b58b2ce.png)

先ほどInsertした空セルの中身が下のようになるはずなので、この中で**IAM_SRVICE_ID**から**BUCKET**までをクリップボードにコピーします。

![スクリーンショット 2019-11-04 12.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/499d71d1-18af-7f69-676a-475339a0306d.png)

コピーした情報はその下にある「**COS資格情報**」のセルに張り付けます。元のダミーデータの項目は削除します。  
最終的に、以下のような感じになるはずです。(一番下の ``FILE: infile``の行だけは元の情報を活かすので注意して下さい。)

![スクリーンショット 2019-11-04 12.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/91b0b5a3-8c24-20b6-60f9-928b04a87a73.png)

一連の作業が終わったら、作業用に追加したセルは、セルごと削除します。(消したいセルを選んだ状態でハサミアイコンをクリック)

## model_idの設定
次のmodel_idの設定を行います。事前準備してあったmodel_idを、「**変数定義**」セルのmodel_idの行に張り付けて下さい。文字列はシングルクオートで囲むようにします。

![スクリーンショット 2019-11-04 13.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b7c3349f-0be8-8180-917b-175ee866d360.png)

## NLC資格情報の設定
最後にNLC資格情報の設定を行います。事前準備してあった、NLC資格情報を「**NLC資格情報**」のセルに張り付けます。余分な括弧や、最初にあったダミー項目行を消して、下の図のような形にして下さい。

![スクリーンショット 2019-11-04 13.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b63ac0d1-b775-9ca5-56e7-6c5f8f052f1b.png)

# Notebookの実行
お疲れ様でした。これですべての準備作業は完了です。  
**Jupyter Notebook**ではカーソルを処理したいセルに合わせた状態で``SHift + Enter``キーで該当セルを実行し、選択セルを一つ先に進めてくれます。
選択状態のセルを一番頭のセルに戻して、``SHift+Enter``を繰り返すと、テストデータによるモデルの評価、Excelの生成、混同行列の表示などを行ってくれるはずです。
どこかのセルでエラーになった場合は、エラーメッセージを見て問題判別を行って下さい。

エラー表示がなく、実行結果が、下の図のようになっていれば、ツールの実行に成功しています。

![スクリーンショット 2019-11-04 13.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/544dc5e4-d36d-6cb9-2d56-3a0007e5002b.png)

# 出力EXCELの取得
生成したExcelは、COSに書き戻すところまでは上記のNotebookでできているのですが、このExcelをStudioの画面からダウンロードするには、もう一手間必要になります。その手順を説明します。
(同じファイル名で出力EXCELを作る場合、二回目以降は不要な手順となります)

まず、プロジェクト管理の画面から「**Add to project**」->「**Data**」を選択します。
(Excelファイルアップロードで説明した手順)

画面上部のタブを「File」にすると、新たに生成された``nlc-test-sample-output.xlsx``ファイルが一覧に含まれているはずです。
(一覧に出てこない場合は、いったんPorjectを閉じて再Openしてみて下さい)

![スクリーンショット 2019-11-04 13.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1c519a1d-1c67-c42f-5c97-3904cf5c4259.png)

下の画面で

①　このファイルのチェックボックスをクリック
②　点が縦に並んでいるアイコンをクリック
③　メニューから「**Add as data aseet**」を選択

とします。

![スクリーンショット 2019-11-04 13.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4c31a10c-df4b-ff0e-1ea2-a65bc21f8f89.png)

すると、下の画面のように、**Data asset**の欄に出力EXCELも表示されるようになります。
Actionsの下のアイコンをクリックし、**Download**をメニューから選択すると、出力用のExcelファイルがダウンロードできます。

![スクリーンショット 2019-11-04 13.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5c26fccd-05ee-194c-af87-f11ff16a260a.png)

加工前の素のExcelはこんな感じになります。

![スクリーンショット 2019-11-04 13.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/18d32e5d-221e-4cb1-81bd-60ca638e0f04.png)

# おまけ
いつの間にか、1枚しかシートのないEXCELはStudioのData Assetとして読み込めるようになったようです。
上記の手順でData Asset側に登録したExcelをStudioから読んだ結果を添付します。

![スクリーンショット 2019-11-05 8.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/76de7693-0ccb-d6f9-2847-c4c3f34e06c7.png)

![スクリーンショット 2019-11-05 8.11.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9c6288b9-7064-3700-3d6c-0b4a6b31e677.png)