はじめに
現在組み込み系ソフトウェア開発に従事しておりますが、私が担当している機能では慢性化している問題があり、ある日上司より、「この問題の解決に取り組んでくれ」と振られたので、問題解決に取り組んでいく過程で機械学習アルゴリズムを使ってみたけどうまくいかなかった、というお話です。
どんな問題に対して機械学習使おうとしたの?
詳しくは書けませんが、簡単に説明すると異常か正常かを分類して、異常と判断した時は適切な処理をする、といった具合です。
ただし様々な事情があり、今回改修をする上で「正常時を異常時と判定することは不可」という条件付きになります。
どんな機械学習アルゴリズムを使ったの?
ロジスティック回帰分析を使いました。そもそもロジスティック回帰は統計モデルか機械学習アルゴリズムか意見が分かれそうですが、一応ここでは機械学習ということで説明を続けます。(はっきりと決められているなら教えていただけると幸いです・・)
どうやってモデルの訓練をしたの?
日頃から様々なデータを取得していたので、トレーニングデータにはそれらのデータを使いました。
職場にPythonや機械学習ライブラリ等はないので、モデルのトレーニングは仕方なくExcelのソルバー機能で行いました・・
データを集めて自分の手でラベル(異常か正常か)をつけ、Excelに突っ込んで一晩計算させてモデルをトレーニングさせました。
どうやってソフトウェアに組み込んだの?
Excelでの計算が終わると、重回帰分析の係数に当たる値が表示されるので、その数字をソフトウェアのソースコード内に組み込みました。
ロジスティック回帰分析は重回帰分析で結果を出力した後、さらに計算式を用いて最終的な確率を算出させます。
# define KEISU1 100 /*Excelから取り出した値*/
# define KEISU2 200 /*Excelから取り出した値*/
# define TEISU 50 /*Excelから取り出した値*/
y = KEISU * x1 + KEISU2 * x2 + TEISU
prob = 1 - (1/exp(-y))
xiはパラメータになります。
probが異常が発生している確率になります。
実際には100個近い特徴を使ってモデルを作成しました。
で、どうだったの?
先ほどのソースコードを組み込んでテスト動作をしました。果たして問題となっていた異常
の検出はできるのか。。。。
結果は、精度としては少し改善がみられました。が、エラー分析をしてみると正常時のある特定の場面において、高確率で異常を算出しまうようになりました。
冒頭でも述べましたが、「正常時に異常と判定してはいけない」という前提条件があり、これは当然許容できない問題となりました。
対策として正常なのに異常と判定してしまっているデータを増やし、再度モデルのトレーニングをしましたが、改善しませんでした。
恐らくその問題の状況というのは、本当の異常時とほぼ変わらないデータを算出しているのだと思われます。
たとえ全体的な精度が上昇したとしても、「正常時に異常と判定してはいけない」というルールがあるために、今回作成した機械学習モデルは製品版に組み込めませんでした・・
まとめ
○○をした上で正常か異常かを判定する、といったようなルール付きだと、機械学習を使うことはなかなか難しいと感じました。
ましてや人間がデータを見て閾値を決めて判定をさせてる訳でなく、アルゴリズムが決めているので、まだまだ機械学習が浸透していない私の職場では人に説明するときに根拠などがなかなか伝わりにくい等の問題もありました。
機械学習難しい・・