（Python3）とあるDBにおける文章分類を学習したモデルの作成を行い、別のDBの文書分類に使おう、という機械学習のプロジェクト（２）

# （前書き）
[前回](https://qiita.com/tomofu74/items/c148b833ccfb44ad0626)、修行（訓練）に入ったところ。今回はその続き。さて、学習を続行してきた標記の文章分類学習モデル・・・。一週間経っても、計算が終わらない、どころか学習の進捗状況を表示しない・・・
![スクリーンショット_20221024_202521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/b60667c1-f931-7676-ddb7-d58172659742.png)

１％も進んだように見えねぇなんて、精神と時の部屋もあったもんじゃねーべや。（ヤジロベー風）しかもよ、WindowsUpdateが入ってもうて、なんか再起動しろとかWindowsのメッセージが右下のほうからハチャメチャに押し寄せてくる・・・カリン塔で仙豆でもくうか・・・

いや、何かがおかしい。環境を再構築することにした。

# （この部分は個人の備忘録）
前回はWSL2で jupyter notebook を実行して、WindowsのChromeからアクセスして使っていた。WSL2上でCudaが動かせてないのかもしれない。まず、WSL2を辞めてみる。　→　素のWindowsで cuda環境構築。ダウンロードに時間がかかる。
Anacondaインストールしてみた。conda install が気に入らない。Pip使いたい・・・　→　conda アンインストール。素の Python インストール
Python3.10 が気に入らない　→　Python3.9 を使う。
Torchをインストールするが、Simpletransformerがtorchがない、という。というか、エラーメッセージを読むと、python310/libs/site-pacckages に対してpipがインストールしてる。 → Python310をアンインストール、環境変数PATHからもpython310を削除。
torchをインストールするが、python39/libs/site-packages に対して書き込み権限がないとのこと　→　Windowsのフォルダ設定を見直す。
pyenvとかより、とにかく、このWindowsではpython3.9だけ動かしたかったのだ。ようやっと python3.9 を Windowsで動かせる環境になった。
WindowsのPythonバイナリ実行についての注意点（複数バージョンのインストールの注意、Pathの通し方）について勉強できた気がする。愚者は失敗から学び、賢者は歴史から学ぶ。こういう時は、Qiitaなどで先達の情報を参考に・・・

# Windows環境で学習実行
pythonのコード部分は[前回](https://qiita.com/tomofu74/items/c148b833ccfb44ad0626)を参照してもらって、Windows環境のVS Codeで ipynb を開いて実行。データファイルのパスを修正する程度で動いた。今度は学習が進捗した。
![スクリーンショット_20221025_205456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/fbf9399d-25de-6fa7-a80b-71d11e15aceb.png)
4時間程度で終了。

さて、学習に使わなかった残りのデータでもって評価してみるか。

```python:関連部分抜粋
# 学習前に実行しておいたデータの振り分け
# 学習データの件数を指定する
train_size = 1000
test_size = len(X) - train_size

 # データセットを学習データとテストデータに分割する
train_x = x[:train_size]
train_y = y[:train_size]
test_x = x[train_size:]
test_y = y[train_size:]

# 学習モデルの用意
from simpletransformers.classification import ClassificationModel, ClassificationArgs

# モデルのオプション設定
model_args = ClassificationArgs(num_train_epochs=100)

# 学習モデルの構築
model = ClassificationModel(
    'bert',
    'bert-base-cased',
    use_cuda=True,
    num_labels=max(train_y)+1,
    args=model_args
)

# 学習
model.train_model(train_df, args={'overwrite_output_dir' : True})

# 評価
result, model_outputs, wrong_predictions = model.eval_model(test_df, output_dir='outputs')
```
![スクリーンショット_20221025_221149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/ba6ff2a8-a942-64b9-e59b-030aaa145335.png)

ふんが？mcc 0.71 ・・・だと？なにそれ？

https://guchio3.hatenablog.com/entry/2020/03/13/222815

・・・二値分類ではなく、今回は13カテゴリの分類だったんだが・・・とりあえず、精度を示していると解釈すると、この数字が大きい（１に近い）ほうがいいんだな。0.5で2値分類を五分五分で当てるってぐらいの数字だとすると、0.71って大したことはない、つまり使えないレベルってことだな。

eval_loss が 2.179... ってこたぁ・・・なんだ？

https://ai-trend.jp/basic-study/neural-network/nn_loss_function/

・・・分類ラベルが整数で区別されてて、損失が２以上あるってこたぁ・・・当たんねぇってことじゃね？せめて１を切ってもらわんと・・・

ずだぼろじゃないすか。このファインチューニングは失敗か。

# 間違いやすいところを見直そう

・・・とりあえず、失敗から学ぼうじゃないか。
なんだか、ひと昔前の学習塾みたいなことを言っているようだが、何がうまく分類できなかったか知ることで対策が見つかる（かもしれない）。 Simpletransformer の 評価関数の出力には、 wrong_prediction があるのでその結果を見てみよう・・・。

```python
print(wrong_predictions)
```

・・・おろろ？データにほぼ共通して現れるフレーズがあるぞ。どこに分類される文章にも表れているようだ。・・・そうか。このフレーズ、おおもとの文章データの特徴語となる固有名詞ではあるが、今回の分類作業のために集めたデータの中では特徴語が特徴にならない語になっているのだな。私の常識は世間の非常識、特徴ある画風の漫画家だが読んでみたらタッチもH2も区別がつかん。そんなところか？

# 次の修行の計画
作業対象データ全体に共通して現れる、この固有名詞のフレーズを除いてデータセットを作り直してみることにした。

```python
import re

s_list = [];
# df['keywords_en']が説明変数となる特徴語のSeries
for df_s in df['keywords_en']:
    xw_list = ''
    # 特徴語Seriesは、特徴語のリストになっている
    for xw in df_s:
        # 特徴語のリストの中で＜共通フレーズ＞ を含んでいない場合
        if None == re.search('＜共通フレーズ＞',xw):
            # 特徴語として採用されるフレーズを'. 'で連結する
            xw_list += xw +'. '
    # 特徴語として採用されたフレーズ（連結済みString）をリストにする
    s_list.append(xw_list)

# 特徴語の連結されたStringリストを pandas Series にする
K = pd.Series(s_list)
```

あとは、同じデータフレームで説明変数の対応をこわさないように目的変数（ラベル）のSeriesをとりだし、組み合わせたデータフレームを用意して、また、Simpletransformer だ。

# おっし、修行すっぞ（訓練の実施）
データセット側を整備して、また訓練だっす。
![スクリーンショット_20221025_234733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/ce84fc31-c609-e3ba-6876-34d2e2dfa8ae.png)

今度は、5時間半ぐらいかかるらしい。（画像は、2時間ほどたったところ）

# （また、続く）
（今回のまとめ）学習環境を整え、学習を実行した。結果はmcc=0.71, eval_loss=2.179であった。wrong_predictionsデータを観察して、データセットの再整備を行ったうえでの学習を行うこととした。

今回の修行の結果は、次回の報告で。乞うご期待。