ラベル SVM の投稿を表示しています。 すべての投稿を表示
ラベル SVM の投稿を表示しています。 すべての投稿を表示

2021年6月11日金曜日

ちょっと惹かれるPython1行コード(その1)

【what is this】誰でも、短くて美しいコードに憧れます。参考文献[1]には、Pythonによる1行コード(Python One-Liners)の考え方と実例がたくさん載っています。それを参考に1行コードを2つほど書いてみました。

例題:キノコの毒性に関するデータの学習と学習結果による予測
 機械学習の分類問題として、キノコを有毒か無毒かに分類することをやってみます。図1には、キノコの色(赤、青、黄)、笠の形(丸、角)、柄の長さ(長、短)、場所(地面、樹木)の特性によって、それが有毒か無毒かのデータ(参考文献[2]から引用)があります。これを機械学習によって学習させ、さらに、その学習データが正しく分類(予測)されたかどうかを確認します。

(注)上記データは現実のキノコにそのまま当てはまるものではなく、あくまで機械学習を学ぶために用意された仮想データです。従って、実際のキノコの毒性判定には利用しないでください。

SVMとRandomForestの一行コード(学習と予測)
 2つの手法(SVM-サポートベクタマシンとRandomForest)によるPython1行コードとその予測結果を示します。図2は、SVMの場合です。Python numpy配列のスライシング(特性データと正解レベルを分離するため)を行い、学習(.fit)結果を予測(.predict)へ接続しています。確かに、素早く簡潔なコーディングとなりました。学習に用いたデータに対する予測結果は、正解率89%でした。9件のうち1件のみが誤まった判定となりましたが、こんな少ないデータでも良く予測できることが確認できました。


 次は、RandamForestによる場合です。こちらの結果は正解率100%でした。素晴らしい!やり方は、SVMの場合と同様です。


 なお、図1での特性データは数値で与えたが、日本語で与えたい場合は以下のようにして、別途用意した辞書型変数Dを使い、map(lambda式を使う)処理を施せばよい。以下の実行結果は、図3での実行結果と同じになります。


 上図の変数Yの計算は、以下のどちらでも良いでしょうが、2番目の方がちょっとだけ分かりやすいかもしれません。
 Y = np.array(list(map(lambda i : list(map(lambda j : D[j], i)), X)))
 Y = np.array(list(map(lambda i : [D[j] for j in i], X)))

何のために1行コードを書くのか
 さて、参考文献[1]の最後に、以下のような叙述がありました。納得ですね。
Don't cram everything into a single line of code just to show off your one-liner superpower. Instead, why not use it to make existing codebases more readable by unraveling their most complex one-liners?
(単に何でもかんでも1行に詰め込むのではなく、複雑なコードを読みやすくするために!)

[参考文献]
[1] Christian Mayer, "Python One-Liners", No Starch  Press, 2020.
[2] 黒橋禎夫, "改訂版 自然言語処理", 放送大学教育振興会, 2020.

2018年12月24日月曜日

App Inventor for Android で SVM(サポートベクトルマシン)分類

以下は同じような心境とお考えください。

「なぜ山に登るのか」
「なぜスマホでSVM分類するのか」

下記の書籍は、数多くある機械学習関連のうちの非常に優れた一冊です。これに刺激を受けて、その中にあった、SVMによる分類の例題を、Android向けにデモアプリとして動かしました。下図のとおりです。

歴史上の人物の特徴量を与えて、その人を「政治家」か「非政治家」かに分類する例題です。



SVMのJavaライブラリは、LIBSVM(国立台湾大学による)を利用させていただきました。上記のAndroidアプリは、MIT App Inventorを使って作成しました。既存のApp Inventorのブロックだけでは、このようなアプリはほとんど作成できません。そこで、LIBSVMを使ったJavaアプリを作成し(下記書籍を参考に)、App InventorのActivity Starter機能(ブロック)を使って、これを呼び出す形にしています。上の実行例画面でその概要を示します。↑拡大してご覧下さい。

このアプリでは、20名のデータのうち、ランダムに1名を選んで、それを「テスト用データ」とし、残り19名のデータを「学習用データ」として学習、テストを繰り返し実行できます。

また、このアプリの学習データを入れ替えれば、類似の問題、例えば有名な「タイタニック号の乗客の生死」の分類等にも(データ加工に幾らかの工夫は必要でしょうが)適用できそうです。

●参考書籍
杉本徹+岩下志乃共著「Javaで学ぶ自然言語処理と機械学習」、オーム社