公開！週末研究ノート０４　ー　テキストクラス分類結果の可視化

# はじめに　ー　週末研究ノートとは？

個人的に研究的な活動をやるにあたり、オープンにしてみたら面白いかもと思い、自分が興味を持っている ざっくりテーマについて、これから、ゆるい週末研究を公開していこうと思います。（有識者の方のアドバイスも、ちょっとというかかなり期待してます！笑）

どこかの権威的な学会やジャーナルなどで発表する予定はないため、万が一、私の記事を利用する際には自己責任でお願いします。そんな人はいないと思いますが、念のため。



# 今回のサマリ （TL; DR）

- PR　曲線で可視化
- LIME を使った可視化
    - デフォルトでは、日本語には対応していないのでちょっと工夫する
    - 単語集合をハイライトする方法とオリジナル文書をハイライトする方法で可視化する


# 環境


- Docker Desktop: 4.0.1(68347)
    - コンテナのメモリ： 12G
    - 自分の環境では、コンテナのメモリを 12GiB まで拡張した
- Docker: version 20.10.8
- docker-compose: version 1.29.2
- Python: 3.8.10
- [GitHub リポジトリ](https://github.com/tkosht/experiment/tree/text-classification)



# 今回の週末研究ノート

今回は、前回正答率を評価したパイプラインを使って、可視化を試みます。
PR 曲線 を表示し、LIME　による可視化を行い、簡易な解釈をつけました。


---

## ldcc


### PR Curves

- Recall - Precision グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/24d4a0e3-aa1a-bf32-3a32-26e03c64896e.png)

AP（Average Precision） は、かなりよく、特にコメントはない感じ。

- Threshold - Precision/Recall グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/1504e5d2-93b5-9754-b431-c5f9aba4ff83.png)


`livedoor-homme`、`peachy`、`dokujo-tsushin` あたりは、必要に応じて境界値を調整しても良さそう。一方で、`smax` は、Precision と Recall　が重なり過ぎている印象を受ける（実際、後の例で見るが、判定をチートしているとわかる。）

---

## LIME による可視化

---

### 単語集合のハイライト

#### 正判定のテキスト

##### movie-enter

まずは、`movie-enter` について。

![スクリーンショット 2021-11-14 21.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/81c35385-d993-42e7-e325-d8c05c741de1.png)

![スクリーンショット 2021-11-14 21.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/27f7185a-8718-46ae-5b54-63f4a7ec06ab.png)

`movie-enter` と判定した単語は、「映画」、「本作」、「劇場」などの単語であるが、どの単語もかなり影響度が小さいことがわかる。塵も積もれば山となるではないが、影響度がわずかなものが積み重なって予測結果に至ったと考えられる。


##### smax

次は、`smax` について。

![スクリーンショット 2021-11-14 21.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/722c0b20-cf2a-e0bb-6ed5-cae7bf0176aa.png)

![スクリーンショット 2021-11-14 21.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/61d0f6e6-c6c9-c576-5827-f4f12a05945b.png)

`smax` は、「エスマックス」、「関連リンク」、「MAX」などのフッター情報をもとに判定していそうだとわかる、これは一般的には欲しい結果ではない（中身の内容で判定したいことが多いはずな）ので、フッターを除く前処理を入れて、再度学習し直す方が良いとわかります。



#### 誤判定のテキスト

#####　正解: livedoor-homme　／ 予測: kaden-channel

![スクリーンショット 2021-11-14 21.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/a8fbc8b4-3971-c44b-0ddc-d86a3c27a57b.png)

![スクリーンショット 2021-11-14 21.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/7b29be5e-17f2-0528-24d0-f999e2e46bd7.png)


予測では、誤答ラベル（`kaden-channel`）の0.77 に対し、正答ラベル（`livedoor-homme`）が 0.22 と、多少は正答ラベルの可能性も示唆している。「話題」という単語が `kaden-channel` である強い理由になっていそうであり、逆に `livedoor-homme` の強い否定の原因になっていそうとわかる。一つの仮説として考えられるのは、学習データの `kaden-channel` には、「話題」という単語が多く、判定の強い原因になっている、と考えられる点である。この仮説を確認するには、「話題」という単語を除くことであるが、根本的な解決とは言い難いため、「話題」という単語で判断しないように学習を誘導する手法を考えた方がより汎用的で運用上も辞書管理をしなくてよくなりそうである。


#####　正解:livedoor-homme　／ 予測:movie-enter

![スクリーンショット 2021-11-14 22.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/e71834d7-94b0-e395-0b85-738c374b11c6.png)

![スクリーンショット 2021-11-14 22.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/7aeef9de-23a4-5807-e45a-abdf8e361a64.png)


---

### オリジナル文書へのハイライト

前半は概ね似た結果なので、ハイライトのみ確認します。


#### 正判定のテキスト

##### movie-enter

![スクリーンショット 2021-11-14 22.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/4877ff7c-0f0b-ec23-c483-085fc99a4e98.png)


##### smax

![スクリーンショット 2021-11-14 22.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/3be00cea-0957-0b94-4f39-8b6297dcc7e7.png)


#### 誤判定のテキスト


#####　正解: livedoor-homme　／ 予測: kaden-channel

![スクリーンショット 2021-11-14 22.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/1628c6be-7818-49fe-8f01-3d7d9907fb1a.png)


#####　正解:livedoor-homme　／ 予測:movie-enter

![スクリーンショット 2021-11-14 22.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/3c0f531e-18da-e6f3-2ed4-47e90fd44be7.png)


ライブドアニュースコーパス（ldcc）に関する結果HTMLは[こちら](https://tkosht.github.io/experiment/visualization-ldcc.html)



---

## aozora

青空文庫の分類に対しても同じように見ていきます。


---

### PR Curves

- Recall - Precision グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/50b09dee-a09e-f2ab-c536-9e958e7c080e.png)


- Threshold - Precision/Recall グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/1a510a71-9f37-ae2b-55ed-b48dc459efbe.png)


AP(Average Precision)が低めなのが、`NDC 915`、`NDC 914`、`NDC 913`  です。

ちなみに、NDC　の分類は、以下のようになっています。

```
911 詩歌 　(1,689件)
915 日記．書簡．紀行 　(656件)
913 小説．物語 　(6,329件)
K913: 子ども・小学生向けの本
914 評論．エッセイ．随筆 　(4,366件)
```

`NDC 915`　の 日記、`NDC 914` の評論、エッセイ、`NDC 913` の小説、物語の区別が難しいということのようです。確かに、物によっては区別難しそうだなという感じもするので、違和感がない結果です。

---

## LIME による可視化

---

### 単語集合のハイライト

#### 正判定のテキスト

##### NDC K913

![スクリーンショット 2021-11-15 0.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/6b184df1-bf94-7f54-0f7d-ba27075b7ba5.png)

![スクリーンショット 2021-11-15 0.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/3b6c7063-9984-1fa4-5eee-70c3b05d42ca.png)

`NDC K913` 子供向けの本であるが、「い」、「お」、「の」、「しまい」などの「ひらがな」が判定原因になっているように見える。今回の前処理では、名詞、動詞などに絞っているので、これらの「ひらがな」が妥当かは原文から判断する必要がある。


##### NDC 915

![スクリーンショット 2021-11-15 0.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/76278dd0-3a64-a178-86c3-d35ccbeb90ad.png)

![スクリーンショット 2021-11-15 0.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/bce09179-da1c-9145-72f6-095bf25e207d.png)

`NDC 915` は、日記、書簡、紀行などで、「し」、「雨」、「下り」、「午後」などが主な判定原因になっているように見える。


#### 誤判定のテキスト

#####　正解:　NDC K913 ／ 予測: NDC 911

![スクリーンショット 2021-11-15 0.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/2ec46732-6986-7339-8f88-ebcb32302c55.png)

![スクリーンショット 2021-11-15 0.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/20bcec25-fa29-7d00-1383-47f59730f570.png)

正解ラベルは、`NDC 913` 小説、物語であるが、予測は `NDC 911` 詩歌 で、若干 `NDC 914` 評論、エッセイ、随筆 と判定している。
`NDC 911` と誤判定した原因は、「海」、「改」、「ページ」、「船」などの単語であり、それぞれ個別に見ると、確かに詩歌にも出そうであると考えられ、誤判定につながってそうな感じがする。



#####　正解:　NDC 915　／ 予測: NDC 914

![スクリーンショット 2021-11-15 0.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/c8c33f35-fd29-a8de-a6e1-34658a989762.png)

![スクリーンショット 2021-11-15 0.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/46fd43b8-085c-d378-91e7-00705a80f6d0.png)

誤答ラベル `NDC 914` 評論、エッセイ、随筆 が 0.59 に対して、正解ラベル `NDC 915` 日記、書簡、紀行の 0.41 と、惜しい結果になっている。
単語を見ると、「私」が 0.24 と他の単語よりも大きいことから、「私」という単語に引っ張られて、`NDC 914` 評論、エッセイ、随筆 と判定していると考えられる。


---

### オリジナル文書へのハイライト

前半は概ね似た結果なので、ハイライトのみ確認します。


#### 正判定のテキスト

##### NDC K913

![スクリーンショット 2021-11-15 0.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/ebfade80-f096-8f93-bfb2-9ecefa4f44df.png)

原文を見ると、一部ふりがなの箇所もハイライトされていることから、子供向けの本にふりがながふってあり、ひらがなの多さが特徴として利用されている可能性が見て取れます。ふりがなを除く前処理をした後、どう判定されるか見てみたいところです。


##### NDC 915

![スクリーンショット 2021-11-15 0.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/043a8549-6d3d-a6ac-db05-8fde8c19cd65.png)


#### 誤判定のテキスト

#####　正解:　NDC K913 ／ 予測: NDC 911

![スクリーンショット 2021-11-15 0.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/fde6770f-2237-f6f8-b036-6600ec4e176c.png)

なぜ、勇者や少佐などが、`NDC 911` 詩歌 と判定されているのは違和感がありますね。どの学習データ（文書）の影響を受けているかを調査したいところです。


#####　正解:　NDC 915　／ 予測: NDC 914

![スクリーンショット 2021-11-15 0.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/ba32e188-4d89-6ae9-19ce-a5fde9d41b25.png)


青空文庫（aozora）に関する結果HTMLは[こちら](https://tkosht.github.io/experiment/visualization-aozora.html)


# 今回のパイプライン

LIME を日本語に対応させるために、パイプラインを以下のように工夫した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226427/3eac5fd5-ac6a-bd70-9369-848aa8f7a6c1.png)


実際の Notebookのコードは、[こちら](https://github.com/tkosht/experiment/blob/text-classification/backend/notebooks/visualization.ipynb)


# まとめ

- 可視化により、改善点やもう少し調査したい次のアクションが明確になる
- LIME を使う時に、日本語に対応させるため、パイプラインを工夫する必要がある
- レポーティングを想定し、HTML には、入力コードが表示されないように、工夫してみた


# 参考文献

- [LIME　Tutorials](https://marcotcr.github.io/lime/tutorials/Lime%20-%20basic%20usage%2C%20two%20class%20case.html)
- [lime package documentation](https://lime-ml.readthedocs.io/en/latest/lime.html)
- [LIME & SHAP -機械学習モデルによる予測結果の説明性-](https://speakerdeck.com/hightensan/lime-and-shap-ji-jie-xue-xi-moderuniyoruyu-ce-jie-guo-falseshuo-ming-xing?slide=25)