単語出現頻度のデータを用いて、学習モデルを作成

 

f:id:hanamichi_sukusuku:20210129145532p:plain

実行結果

f:id:hanamichi_sukusuku:20210129145555p:plain

 

hanamichi-sukusuku.hatenablog.com

このプログラムでは上記で作成した単語を数値で表現したデータベースを用いて機械学習にかけ、学習モデルを作成していく。

実行結果ではaverage=の部分で平均の正解率を出力している。

 

全体で使う変数、ファイルの読む込み

data_file = "./ok-spam.pickle"
save_file = "./ok-spam-model.pickle"
data = pickle.load(open(data_file, "rb"))
y = data[0] # ラベル
x = data[1] # 単語の出現頻度

pickleはオブジェクトを保存してくれるモジュール。

プログラムは性質上メモリ上で動き、役割を終えるとメモリから削除される。pickleではプログラムを実行し終えた後も、オブジェクトとして保存してくれるもの。

 

open()関数について

今回はオプションで'rb'をしているがこれはopen()関数では自動的にデータをバイト列からpythonの文字列にデコードするためデコードして欲しくない場合は'rb'を指定し、生のバイト列のデータを扱える。要するにバイナリファイルとして読み込んでいる。バイナリデータというのはコンピューターでは0と1の二つの値で表現しているデータのことで基本的に普段よく使っているようなファイルはこのバイナリファイルである。バイナリファイルでも文字列のエンコーディングで保存しているファイルはテキストファイルといい、読み込みたい場合は'rb'ではなく'rt'を指定し、エンコーディングの指定をする(utf-8など)。

つまり、ファイルがどんな形で保存されているかによって読み込み方を変える必要がある。

 

100回、学習とテストを繰り返す

count = 100
rate = 0
for i in range(count):
# データを学習用とテスト用に分割 --- (*3)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=0.2)
# 学習する --- (*4)
model = GaussianNB()
model.fit(x_train, y_train)
# 評価する ---(*5)
y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred)
# 評価結果が良ければモデルを保存 --- (*6)
if acc > 0.94: pickle.dump(model, open(save_file, "wb"))
print(acc)
rate += acc

train_test_splitではデフォルトでシャッフルされ分割されるので一回一回結果が異なる。

model = GaussianNB()でオブジェクトを生成し、model.fit()で学習。

model.predict()で予測結果を取得。

accuracy_score()で正解率を取得。

if文で評価が高ければ、そのモデルを保存する。

 

平均値の表示

print("----")
print("average=", rate / count)