事例179

最近傍法を題材にした機械学習の初歩(とプログラミング演習)

早稲田大学高等学院 八百幸 大先生

Rを使って機械学習の基礎「最近傍法」を体験する

今回ご紹介する実践事例は、実は、「情報」の授業ではなく、「総合的な探究の時間」で扱いました。文系の生徒もいるため、高校1年生までに習った数学の知識で理解できる話題であることと、時間が許せば、プログラミングも扱いたかったということで、このテーマを考えました。

 

今回の授業では、統計処理システムの「R」を使用しました。本校では、「情報」の時間で、プログラミングやデータ分析を扱うときに使用しています。

 


こちらが授業の流れです。1回目に機械学習の実用例や仕組み、種類について学び、2回目に機械学習の一例である最近傍法を扱いました。

 


ラーメンの画像分析で機械学習の仕組みを学んでみよう

まず1回目の授業について説明します。

 

冒頭で、生徒たちがその時点で持っている機械学習のイメージを書いてもらいました。その後、ここに挙げたような機械学習の実用例を、簡単に紹介しました。

 


ただ、硬い話ばかりだとつまらないので、「ラーメン二郎」さんのラーメンの画像から、どの店舗で提供されたかを推測するAI(※1)について話をしました。軽い話題のように見えますが、この技術が、ネットオークションにおいて、出品物の真がんを見分けるのに役立っています(※2)。

 


 

また、ここで機械学習の仕組みや、機械学習の種類についても簡単に話をしました。これから扱う最近傍法は、予測モデルに分類されます。第1回は知識の話が多くなってしまったのが、今後の改善点の一つです。

 

 

第2回の授業では、まず機械学習のアルゴリズムの一つである、最近傍法と、その発展形であるk近傍法について説明しました。

 

最近傍法では、分類されたデータを座標平面上の点として考えます。そして、新たに入力されたデータの点と、もとになるデータたちの点との距離をそれぞれ求め、新たなデータを、最も近い距離の点が属するクラスに分類するという流れです。

 

 

「近さ」を求めることで属するグループを見つける

 

文章だけでは、よく分からないので、イメージを示します。

 

ここでは、ある食品の「甘み」と「旨味」の数値データをとって、その組を座標とした散布図を考えています。いろいろな食品が挙げられていますが、大まかに、「肉」「野菜」「果物」で分類してみると、このようなグループになります。

 

 

さて、このときパプリカの甘みと旨味の数値から、どこに分類されるか推測してみることにしましょう。

 

最近傍法は、言うなれば自分と一番近い点を探すことです。その結果、「パプリカは春菊と一番近い」ので、「野菜」に分類されることになります。

 

なお、ここでは最も近い1点しか見ていませんが、この点が外れ値のようなものであると、データが正しく分類されない可能性があります。そこで、ここにある点の距離たちから、小さい順にk個取り、分類するクラスを多数決で決めるのが「k近傍法」とです。

 

 

最近傍法のアルゴリズムの概要がこちらです。まず、元になるデータを設定します。このとき、データは数値の部分と分類するラベルで構成されます。

 

次に、分類するためのデータ(値)を入力します。そして、入力したデータが表す点と、元になるデータたちが表す点の距離を計算して、距離が最初の点のデータを求めます。ここで求めたデータのラベルに、入力されたデータが分類されるラベルを出力します。

 

ポイントは、距離の取り方です。「距離」にはいろいろな定義がありますが、ここでは「ユークリッド距離」、すなわち、定規で測れるような2点間の距離で定義することにしました。

 

 

今回使ったデータセットは、Rに標準搭載されている、irisと呼ばれるものです。

 

このデータセットは、Rを使う人にとってはおなじみのもので、3種類のアヤメの花のガク、花びらの長さ、幅の組を、それぞれの種類で、50個ずつ用意したものとなっています。

 

今、スライドに表示しているイメージは、irisをRのコンソールで表示したものとなっています。それぞれの花のガク、花びらの長さ、幅を点の座標として扱うことにします。

 

数学の時間では、3次元の空間までしか扱いませんから、座標の要素は3つが一番多いのですが、4次元でも、すなわち要素が4つあっても、3次元の場合と大体同じだとして話を進めました。

 

 

実際にプログラムをいじってみることで、シミュレーションがどのように行われるかを知る

 

シミュレーションを行うにあたって、可能であれば先ほどのアルゴリズムを基にして、一からプログラミングをしたかったのですが、さすがに時間的にも技量的にも、無理がありました。

 

そこで、あらかじめスクリプトを用意して、作業をしていく中で手を加えるという方法を採りました。特に今回は、定数の値を変更することと、何回も同じこと(近傍法による分類の作業)を繰り返すことからFor構文について話をしました。

 

※クリックすると拡大します。

 

シミュレーションの結果は、Rのライブラリにある、クロス表を作成するプログラムを使って表しました。表中のそれぞれの行は、入力したデータのアヤメの種類、それぞれの列は、シミュレーションによって推測された結果となっています。

 

 

ここで、対角線から外れたものは、誤判定されたものとなります。スライドでは、1ラウンドしかしていませんが、これを何ラウンドも繰り返していきます。

 

※クリックすると拡大します。

 

さらに、条件を変えることによって変化を観察しました。その結果から、もっと判定の精度を上げるためには、どうすればよいかを考察することが、最後の作業で、宿題にして提出してもらいました。

 

 

今回の授業の振り返りアンケートで感想を聞きました。「機械学習を勉強してみたい」「シミュレーションがおもしろかった」という生徒もいましたが、「時間が足りない」という意見も出ました。

 

また、昼休みの前の授業だったせいか、ラーメンの話題が多かったです(笑)。全体的には、好意的な意見が多かったと思います。今回の実践は、修正点が多数ありますので、ご意見、アドバイスをいただければ幸いです。

 

神奈川県高等学校教科研究会情報部会 情報科実践事例報告会2020オンライン 実践事例報告