LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-25

(前書き)

前回、修行(訓練)に入ったところ。今回はその続き。さて、学習を続行してきた標記の文章分類学習モデル・・・。一週間経っても、計算が終わらない、どころか学習の進捗状況を表示しない・・・
スクリーンショット_20221024_202521.png

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 を開いて実行。データファイルのパスを修正する程度で動いた。今度は学習が進捗した。
スクリーンショット_20221025_205456.png
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')

スクリーンショット_20221025_221149.png

ふんが?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 だ。

おっし、修行すっぞ(訓練の実施)

データセット側を整備して、また訓練だっす。
スクリーンショット_20221025_234733.png

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

(また、続く)

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0