Scikit-Learn で LinearRegression のモデルを選択して機械学習をさせたとき、出力データを整数化する方法について、まとめておきます。
環境: Anaconda, Python 3.X, Windows 10
状況
Google 検索のヒット数などの数値データを集計していて、機械学習(Scikit-learn)を利用することで各数値の予測ができないか試みています。
Scikit-learn では、サポートベクターマシーンやロジスティック回帰などの高度なモデルを選択できますが、多重回帰 LinearRegression() (最も単純な最小二乗法を含む考え方)でも、正解率がかなり高くなることがわかりました。(むしろ、こちらのほうが成績がよい。正解率80%超えますね。)
しかし、サポートベクターマシーンなどで学習させた結果が整数値で出力されるのに対し、LinearRegression() でモデルを設定すると、学習後、出力されるデータが小数となってしまいます。
このため、どの計算モデルが最も成績がよいか比較をする段階で、単純な比較ができず、都合が悪いです。
そこで、機械学習後の予測結果を整数化して出力するスクリプトをまとめておきます。
スクリプトの例
import sklearn
import numpy as np1
import pandas as pd1
from sklearn.externals import joblib
(略)
# model1 = LinearRegression() # 学習段階ではこのモデルを使用
# model1 = SVC()
(学習段階のスクリプトは省略)
file1 = path1 + 'fitting_model1.sav'
model1 = joblib.load( file1 ) # 学習済みモデルの呼び出し
pred1= model1.predict( x1 ) # テスト用データを与えて予測実行
pred1 = (pred1+0.5).astype(int) # 四捨五入して整数化 ※
print( "predict" )
print( pred1 ) # 整数化した予測結果を表示
(略)
解説
ポイントは※をつけた1行だけです。ネットで検索する限り、ズバリ書かれたサイトが見つからなかったので、公開しておきます。
scikit-learn で学習済みモデルを呼び出してテストデータを与えて予測をしています。結果(pred1)を表示させたところ、小数表示となったため、予測結果が整数になるように修正したくなります。
pandas で四捨五入するのかと思ったところ、ヘッダーがついていません。そこで、class を確認すると、<class ‘numpy.ndarray’> となっていました。
scikit-learn の出力は、ヘッダーのない numpy 配列となっていますので、全配列要素に 0.5 を足して、astype で整数化(小数点以下切り捨て)すればよいとわかりました。
こういうところって、周知なのでしょうかね。(機械学習をされている皆様の常識?)
なお、計算モデル LinearRegression() を SVC() などの他の計算モデルに差し替えてスクリプトを実行する際は、値がずれることになりますので、※の行をコメントアウトしてください。(LinearRegression のときのみ、※の行を入れる。)
まとめ
Scikit-Learn の予測結果を整数化する方法についてまとめました。各計算モデルを比較するなど、似たような分析をされている方は、参考にしてみてください。
関連リンク
・ csv ファイルを読み込んで機械学習と予測をするサンプルプログラム 【scikit-learn】
・ Raspberry Pi で物体検出をやってみた
・ YOLOv5 のインストール手順 【Windows10 & Anaconda】
・ 数値を文字列に変換するときによく使うコードのまとめ 【Python】
外部リンク
・ Raspberry Pi4 ModelB 4GB