Watson NLCとNLUの精度を比べてみた

# はじめに
[こちらの記事](https://qiita.com/mihoicchi/items/ee4ae01adfdc3815ce4e)でも書いた通り、Natural Language Classifier(以降、NLC)が2022年8月でサービス終了し、機能がNatural Language Understanding(以降、NLU)に統合されます。となると俄然、NLCとNLUの精度の違いが気になりますよね。
今日はざっくりどのくらい精度が違うのか目安だけでも確認しておきたいと思います！

# 訓練データとテストデータ
訓練データに使ったのは[ライブドアニュース](https://news.livedoor.com/)から取得したニュースタイトル。対象は5カテゴリで、1カテゴリにつき100件ずつ。合計500件です。ファイルフォーマットはNLCに合わせ、CSVとしました。
テストデータは同じく各ジャンル20件ずつ、合計100件を準備しました。
・スポーツ
・海外
・経済
・グルメ
・宇宙

表1.訓練データのカテゴリ別文字数

|サービス|スポーツ|海外|経済|グルメ|宇宙|
|--|--:|--:|--:|--:|--:|
|平均|36|32.41|29.5|32.04|31.4|
|中央値|34|32|29|34|32|
|最頻値|33|36|23|16|33|
|標準偏差|6.76|6.32|7.99|10.91|4.28|


# 正解の判定方法
NLC・NLUのどちらも、**「confidence」値が一番大きい「class_name」がカテゴリと一致すれば正解** としています。

NLC：「confidence」値が一番大きい「class_name」は**スポーツ**

```
{
    "classifier_id": "605c7ax977-nlc-392",
    "url": "https://api.us-south.natural-language-classifier.watson.cloud.ibm.com/instances/xxxxxxxxxxxxx/v1/classifiers/xxxxxxxxxxxxx",
    "text": "西勇輝やっとやっと…８試合ぶり白星で通算１００勝マツダの連敗４でストップ巨人と３差に拡大",
    "top_class": "スポーツ",
    "classes": [
        {
            "class_name": "スポーツ",
            "confidence": 0.9856064490253699
        },
        {
            "class_name": "グルメ",
            "confidence": 0.005623363905789924
        },
        {
            "class_name": "海外",
            "confidence": 0.003777655693367114
        },
        {
            "class_name": "経済",
            "confidence": 0.003079640591322321
        },
        {
            "class_name": "宇宙",
            "confidence": 0.0019128907841507862
        }
    ]
}
```

NLU：「confidence」値が一番大きい「class_name」は**スポーツ**

```
{
    "usage": {
        "text_units": 1,
        "text_characters": 44,
        "features": 1
    },
    "language": "ja",
    "classifications": [
        {
            "confidence": 0.900122,
            "class_name": "スポーツ"
        },
        {
            "confidence": 0.160062,
            "class_name": "経済"
        },
        {
            "confidence": 0.021802,
            "class_name": "海外"
        },
        {
            "confidence": 0.021197,
            "class_name": "宇宙"
        },
        {
            "confidence": 0.015938,
            "class_name": "グルメ"
        }
    ]
}
```

# 精度の比較
NLCとNLUの Confusion Matrixが下記の図です。NLCはグルメと宇宙が、NLUは海外がちょっと苦手のようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/f7db5616-0f9a-2e2c-6f82-0ef5aa3ca3fb.png)
正解率(Accuracy),適合率(Precision),再現率(Recall),F1値(F1-measure)を見ていきたいとおもいます。

表2.正解率(Accuracy),適合率(Precision),再現率(Recall),F1値(F1-measure)

|サービス|Accuracy|Precision|Recall|F1|
|--|--:|--:|--:|--:|
|NLC|0.8800|0.8826|0.8800|0.8776|
|NLU|0.9300|0.9443|0.9300|0.9286|

## 正解率(Accuracy)
正解率(Accuracy)はNLCが0.88、NLUが0.93とNLUの方が高いです。
カテゴリごとにみると、宇宙ではNLCが0.6500、NLUが1.0000と正解率の開きが見られます。

表3.カテゴリごとの正解率(Accuracy)

|サービス|スポーツ|海外|経済|グルメ|宇宙|平均|
|--|--:|--:|--:|--:|--:|--:|
|NLC|1.0000|0.9000|1.0000|0.8500|0.6500|0.8800
|NLU|0.9500|1.0000|0.7000|1.0000|1.0000|0.9300


## 適合率(Precision)
適合率(Precision)の平均はNLCが0.8826、NLUが0.9443です。
カテゴリごとの適合率は表4に示しました。NLCはグルメが、NLUは海外が他に比べて低い値です。

表4.カテゴリごとの適合率(Precision)

|サービス|スポーツ|海外|経済|グルメ|宇宙|平均
|--|--:|--:|--:|--:|--:|--:|
|NLC|0.9091|1.0000|0.9524|0.7391|0.8125|0.8826
|NLU|1.0000|0.7692|1.0000|0.9524|1.0000|0.9443

## 再現率(Recall)
再現率(Recall)の平均はNLCが0.8800、NLUが0.9300です。こちらは正解率と同じになりますね。

表5.カテゴリごとの再現率(Recall)

|サービス|スポーツ|海外|経済|グルメ|宇宙|平均
|--|--:|--:|--:|--:|--:|--:|
|NLC|1.0000|0.9000|1.0000|0.8500|0.6500|0.8800
|NLU|0.9500|1.0000|0.7000|1.0000|1.0000|0.9300

## F1値(F1-measure)
適合率(Precision)と再現率(Recall)のバランスを表すF1値です。
F1値(F1-measure)の平均はNLCが0.8776、NLUが0.9286になりました。

表6.カテゴリごとのF1値(F1-measure)

|サービス|スポーツ|海外|経済|グルメ|宇宙|平均|
|--|--:|--:|--:|--:|--:|--:|
|NLC|0.9524|0.9474|0.9756|0.7907|0.7222|0.8776|
|NLU|0.9756|0.9744|1.0000|0.8696|0.8235|0.9286|

# 確信度「confidence」の違い
今回はconfidenceの値に関わらず、confidenceが最大のclass_nameを正解としました。
一方でconfidenceが一定値に達していない場合はふるまいを変える、といった実装をしているシステムもありますよね。

**confidenceによって異なるアウトプットを出す例）**

* 0.6未満：ちょっとわからないな～。ごめんなさい。
* 0.6以上0.9未満：もしかして、スポーツがお好きなんですか？
* 0.9以上：スポーツ好きな人へのおススメはこちら！

表7がカテゴリごとのconfidenceの平均値です。全体的にNLCの方が高いですね。
特に海外、経済では0.3以上の開きがあります。

表7.カテゴリごとのconfidence平均値

|サービス|スポーツ|海外|経済|グルメ|宇宙|平均|
|--|--:|--:|--:|--:|--:|--:|
|NLC|0.9557|0.9303|0.9024|0.9585|0.9871|0.9468|
|NLU|0.8001|0.6119|0.5628|0.8049|0.8679|0.7295|


NLCのconfidenceを使っているシステムの場合は、NLU移行時に値の見直しが必要になるかもしれませんね。

# まとめ
ニュースタイトルの分類では、正解率(Accuracy),適合率(Precision),再現率(Recall),F1値(F1-measure)
のいずれの値も、NLUの方が良い結果に。
NLCからNLUへの移行に向けて、ほんのり安心材料ができました。
現場では扱うデータも重視する指標も異なりますよね。
また次回は、今回と違った傾向のデータを使って精度比較してみたいと思います。

# 参考サイト
[fasttextとWatson Natural Language Classifierの文書分類比較](https://www.cresco.co.jp/blog/entry/11577/)
[IBM Watson の NLC を NLU に移行する _ まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1079457773.html)
[機械学習で使う指標総まとめ(教師あり学習編) - プロクラシスト](https://www.procrasist.com/entry/ml-metrics)


# 変更履歴
2021.09.18　正解の判定方法と、confidenceのカテゴリ別比較を追加