その1 機械学習による異常検出と分類手法について
前回は、機械学習(回帰)+LLMで、なんちゃってAgentを開発しました。今回は、機械学習(分類)+LLMで同じようなアプリを開発したお話です。機械学習では回帰と分類が「Pythonで儲かるAIをつくる:赤石雅典著(日経BP)」によると王道であると書かれていました。分類手法には、回帰手法に類似したものがあります。今回もRandomForestを使用し分類を行います。使用用途は、回帰ではデータを説明変数(X)と目的関数(Y)としてYは連続値として扱いましたが、分類ではYが離散値(カテゴリ)になります。推論用データからの出力としてカテゴリだけを予測するのでは情報量が少ないのです。なのでカテゴリ別確率(分類確率)も出力しLLMにコメントしてもらうアプリとしました。
その前に分類についてこの機会に少し復習しておきたいと思います。IoT関係の開発をしていたころに中華マイコン(ESP32,ESP8266)を使って複数のセンサ情報を集め異常検知や状態分類を行っていました。マイコンの有効活用 | TWINKLE TEC を参考にしてください。その後も多変量だけではなく、マイクを使った異音分類、電流センサの時系列データでシングルセンサから複数の特徴値を取り出し異常検出/状態分類を行ってきました。以下に、マイクなどのシングルセンサ用Inteligent Sensor1と多変量センシングInteligent Sensor2のハードウェアとハンドリングソフトを示します。

これらのマイコンを使って、センサデータ測定・学習データ収集・モデル化・異常検出・分類を行う場合のデータフローを示します。ハードに重きを置いたプラットフォーム化を目指しましたが、今回はアプリ側に汎用性を持たせる試みでもあります。

データ処理の流れに沿って分類と異常検出について説明していきます。邪魔くさいと思われる方は読み飛ばしてください。まず機械学習用データ収集のプログラムは、シングルセンサとマルチセンサでデータ構造を共通にしています。また、異常検出と分類での場合も共通になるようにしています。(異常検出の場合は分類値は参照しない)

まず、マイクロフォンなどのシングルセンサの周波数特徴値を学習するアプリ「ML1.exe」のGUI画面です。この例は、異常音の分類などの学習データを作るために作りました。マイクで10回音を測定して、5KHzまでの帯域を10分割した音圧値(dB)を特徴値としてcsvに保存します。

次にマルチセンサ値などを学習するアプリ「ML2.exe」のGUI画面です。この例は、加工装置の環境データを収集するため、温度、湿度、と4個のADCの平均値と標準偏差値を特徴値としてcsvに書き込むアプリです、

「ML1.erxe」や「ML2.exe」で学習データを収集し、異常検出は部分空間法(LOF)、分類はRandomForest分類をエンジンとして使用しました。各データのモデルができたところで、同じセンサを使ったデータを読み込みリアルタイムに異常検出(異常測度表示)をする異常検出アプリのGUIをそれぞれ示します。まず、シングルセンサ(マイク+InteligentSensor1)を使ったリアルタイム異常検出(異常スコア変化)の様子です。

マルチセンサ(温湿度,4ADC+Inteligent Sensor2)のデータの読み込みとリアルタイムに異常検出(異常測度表示)をする異常検出アプリのGUIを示します。マルチセンサは測定に時間がかかるため、10秒間間隔となっています。

リアルタイム異常検出のアプリを説明しましたが、いよいよ分類アプリの説明です。
同じ測定系で得られたデータの分類確率を出力し棒グラフで表示するアプリです。
学習データの分類項目列に分類値を入力しておきます。今回は異常測度から3分類(0,1,2)を割り振ったものを使いました。(本来は状態分類値を入力すべき)

「ML1.erxe」でマイクロフォンから周波数特徴値を使った学習データを収集し、分類はRandomForest分類をエンジンとして使用しています。無音状態が状態「0」です。
リアルタイム分類テスト時の環境が静かだったため「0」の確立が高くなっています。

「ML2.erxe」で環境センサの特徴値を使った学習データを収集し、分類は同じくRandom Forest分類をエンジンとして使用しています。温度湿度は変化なく、ADCの入力はオープンにした状態なのでのこぎりのような波形を示しますが、これに応じて分類確率は変化するのですが各ADC特徴値として平均値と標準偏差を採用しているためほぼ「0」の状態を示しています。

ここまでの内容は、センサデータを使用した異常検知や状態分類のIoTシステム開発を想定した例でした。IoTシステムでは動的な対応が必要ですが、分類は動的な目的だけにとどまりません。事務処理などのオフライン処理でも十分に役立ちます。なので、学習データありきで、分類モデルを生成~推論(分類確率出力)+LLMコメントをパッケージとしたアプリを開発することにしました。
その2 機械学習(分類)+LLMによるデータ解析アプリの開発
LLMを使って分類結果のコメントを加えるために、分類カテゴリだけではなく各分類項目の分類確率と併せて機械学習のブラックボックス性を回避するため、SHAP値も抽出しました。SHAP(SHapley Additive exPlanations)値は、機械学習モデルの予測に対して、各特徴量がどれだけ影響を与えたかを定量的に示す指標です。回帰分析の場合の感度解析に類似したものです。必要なpythonのライブラリは>pip install shap⏎です。# モデル学習は「clf = RandomForestClassifier();clf.fit(X, y)」とした後で
# SHAP値の計算「explainer = shap.Explainer(clf, X);shap_values = explainer(X)」とします。LLM(gemma3)へ渡すプロンプトは以下のようになります。

今回開発した機械学習(分類)+LLMアプリ(classAI2.exe)の操作画面を示します。

アプリの説明用データは、過去に機械学習で使用したデータのほんの一部を学習データとして使ったテストケースです。音分類(正常含め6分類)をモチーフに周波数特徴値を使った機械学習モデル生成~推論までの例です。音響特徴値は、マイクロフォンで10秒間収集した音(44KHz)をフーリエ変換処理し5KHz帯域の音圧を10領域に分割したものを特徴値として抽出たものです。もともとは7分類102組のデータを使用していました。ここから抜粋した6分類の学習データと推論用データを使いました。

再編成した学習データと検証データを示します。分類は英文で「OK」を含めた6分類です。各分類1データだけを使っています。

検証データ1は、吸い込み不良が発生している状態の音響データです。分類確率からは、
kiho_tosyutu(気泡吐出音)に類似しているという結果となっています。

分類確率値は、 dry: 8.00%, jikubure: 10.00%, jpin_mamou: 20.00%, kiho_tosyutu : 31.00%, ok: 15.00%, shuudou_teikou: 16.00%でした。LLMのコメントは3種類選択(簡潔/詳しく/技術的)できます。以下に技術的コメントを示します。まとめると、「吸い込み不良データは、気泡吐出音に類似していると判断しています」でした。

その3 機械学習(分類)+LLMアプリの応用例(味覚分析)
トランジスタ技術2023年12月号p116-p126に果物のインピーダンスをNanoVNA(ベクトルネットワークアナライザ)を使って測定する記事が掲載されていて非常に興味を持ちました。その後PCと接続しながらアボカドやメロンの熟度変化を測定し記事の追試を行いました。果物のインピーダンス測定 | TWINKLE TEC その後私にとっての最大の課題であった破壊検査を非破壊のできないかを検討しました。nanoVNAの応用 | TWINKLE TEC 非接触プローブでも熟度変化をとらえることができたのですが、どんな味になっているのか(本当に甘く熟しているのか)というような絶対基準が必要ではないかと考え、五味+無味の6種類の水溶液を使って味覚分析にチャレンジしました。これは、機械学習の分類が使えます。インピーダンス測定による味覚分析 | TWINKLE TEC ここでWindows-PCに味覚分析GUIアプリを搭載しいろいろ試しましたが、ワインの分類はさすがに困難でした。測定システムを示します。

また、五味+無味の学習データの測定サンプルを示します。このような実験は小学生に戻ったようでワクワクします。(学研の付録のようなワクワクですね)

インピーダンス測定レンジは、1~1000MHzの10MHz間隔で101個の絶対値データを抽出します。101個の周波数でのインピーダンス値が機械学習の特徴値(パラメータ)となります。まず、苦味成分のコーヒー溶液2,5,10%と天然水(無味)のインピーダンスグラフを示します。濃度が低くなると無味波形に近づきました。

五味+無味のインピーダンスプロファイルを学習データとして、ラベル0~5を付けて機械学習を行いました。各溶液は2%,5%,10%の3データと天然水は2データを使用しました。(101×17)機械学習に使用するデータのグラフを示します。500MHz以下の領域での変化が大きく、500MHz以下の領域に限定すべきか悩みましたが、モデルを作ってみてびっくり500MHz以降の周波数データの方が分類に有効であることが後に判りました。

分類ラベルを追加した、機械学習用データ(ML6Y.csv)を示します。

推論の実施例を示します。サンプルは、低糖分の乳酸菌飲料の分析を行いました。味は十分濃いようです。甘味は低糖のため抑えられています。辛味は少なく、酸味、旨味、苦味の成分が強いようです。

今回のアプリは、この一連の処理にLLMがコメントするというものです。
今回開発したアプリは、従来の分類アプリと読み込ませるcsvファイルの形式を変更する必要がありました。回帰アプリと統一するためデータは列配置から行配置にしています。学習ファイル(tran.csv)を示します。ヘッダーのC(大文字は固定)列に分類項目を入力(英文字)します。

検証用ファイル(test.csv)は「やかんの麦茶」のインピーダンスデータです。示します。ヘッダーのC(大文字は固定)列は空白にします。

「やかんの麦茶」をサンプルとして測定したデータを味覚分類しました。

LLMのコメントを示します。麦茶は意外と甘いのか? 苦みもうまみもあり複雑ですね。現在は推論データはオフライン処理ですがオンライン処理も考えたいです。

その4 機械学習(分類)+LLMアプリの応用例(適正分析)
次の例は、入社時に行った適性試験(SPI/SCT)の結果を学習し、将来の適正を予測(分類予測)する応用です。解析に使う元データを示します。説明変数は21個、目的関数はY1,Y2,Y3ノ3個ですが、説明変数は欠損がない17項目、目的関数は、職制を分類したY3(0,1,2,3)を使用しました。

説明変数を欠損がない17項目、目的関数は、職制を4分類したY3を使用しました。以下は学習に使用した(train.csv)です。Cの列には、c0,c1,c2,c3の4分類のラベルが入力されています。分類イメージとしては、c0は一般職、c1は管理職、c2は専門職、cv3は技術管理職といったよう分類だと思ってください。データ数265個です。

検証データを示します。学習データに含めていないc3分類(レアな人)のデータ(test.csv)を使用しました。

c3のテストデータを使って分類予測した結果を示します。分類確率はc3が一番大きく
次はc0でした。一般管理職には向かない人だったのでしょう。

AIのコメントを示します。SHAP分析でc3に対してc0の係数は負です。C0が小さければc3の各位率がさらに高くなるようです。一般職(c0)には全く向かない人のようです。

機械学習(分類)とLLMを組み合わせて、なんちゃってAIアプリを開発しました。数値処理の本体はpythonコードで実行し得られた結果をLLMがコメントするというものでした。LLMに渡すものが単なる分類結果、分類値、SHAP値であり、この制約がありながらもLLMは何とか気の利いたことをコメントしようとしているようでした。けなげな奴ですね。LLMにはもう少し遡った情報、例えばインピーダンスを使用して甘味などを学習させた背景などを加えて説明変数の意味を伝えると、もっと素晴らしいコメントができるようになるのかもしれません。この辺はこれからの課題と捉え改善していこうと思います。

