(前書き)
前回、修行(訓練)に入ったところ。今回はその続き。さて、学習を続行してきた標記の文章分類学習モデル・・・。一週間経っても、計算が終わらない、どころか学習の進捗状況を表示しない・・・
1%も進んだように見えねぇなんて、精神と時の部屋もあったもんじゃねーべや。(ヤジロベー風)しかもよ、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のコード部分は前回を参照してもらって、Windows環境のVS Codeで ipynb を開いて実行。データファイルのパスを修正する程度で動いた。今度は学習が進捗した。
4時間程度で終了。
さて、学習に使わなかった残りのデータでもって評価してみるか。
# 学習前に実行しておいたデータの振り分け
# 学習データの件数を指定する
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')
ふんが?mcc 0.71 ・・・だと?なにそれ?
・・・二値分類ではなく、今回は13カテゴリの分類だったんだが・・・とりあえず、精度を示していると解釈すると、この数字が大きい(1に近い)ほうがいいんだな。0.5で2値分類を五分五分で当てるってぐらいの数字だとすると、0.71って大したことはない、つまり使えないレベルってことだな。
eval_loss が 2.179... ってこたぁ・・・なんだ?
・・・分類ラベルが整数で区別されてて、損失が2以上あるってこたぁ・・・当たんねぇってことじゃね?せめて1を切ってもらわんと・・・
ずだぼろじゃないすか。このファインチューニングは失敗か。
間違いやすいところを見直そう
・・・とりあえず、失敗から学ぼうじゃないか。
なんだか、ひと昔前の学習塾みたいなことを言っているようだが、何がうまく分類できなかったか知ることで対策が見つかる(かもしれない)。 Simpletransformer の 評価関数の出力には、 wrong_prediction があるのでその結果を見てみよう・・・。
print(wrong_predictions)
・・・おろろ?データにほぼ共通して現れるフレーズがあるぞ。どこに分類される文章にも表れているようだ。・・・そうか。このフレーズ、おおもとの文章データの特徴語となる固有名詞ではあるが、今回の分類作業のために集めたデータの中では特徴語が特徴にならない語になっているのだな。私の常識は世間の非常識、特徴ある画風の漫画家だが読んでみたらタッチもH2も区別がつかん。そんなところか?
次の修行の計画
作業対象データ全体に共通して現れる、この固有名詞のフレーズを除いてデータセットを作り直してみることにした。
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 だ。
おっし、修行すっぞ(訓練の実施)
今度は、5時間半ぐらいかかるらしい。(画像は、2時間ほどたったところ)
(また、続く)
(今回のまとめ)学習環境を整え、学習を実行した。結果はmcc=0.71, eval_loss=2.179であった。wrong_predictionsデータを観察して、データセットの再整備を行ったうえでの学習を行うこととした。
今回の修行の結果は、次回の報告で。乞うご期待。