機械学習の入門であるアイリスのクラス分類【Pythonではじめる機械学習】

機械学習の入門であるアイリスのクラス分類【Pythonではじめる機械学習】 機械学習

機械学習を基礎から学ぶ人に向けた記事です。
同時に「Pythonではじめる機械学習」の解説記事でもあります。

そのため、「Pythonではじめる機械学習」を手元に用意してください。
それがこの記事を理解するためには必須です。
解説というより、書籍の内容を補完するモノと言った方が正確ですね。

この記事では、有名過ぎるアイリスのクラス分類を扱います。
実際に、JupyterLabでアイリスのクラス分類を行います。
ページは、P13~P25です。

本記事の内容

  • 「Pythonではじめる機械学習」について
  • JupyterLabについて
  • アイリスのクラス分類
  • データの読み込み
  • 訓練データとテストデータに分ける
  • データを可視化して観察する
  • モデル構築・学習(k-最近傍法)
  • モデルの評価(k-最近傍法)
  • アイリスのクラス分類のまとめ

まずは、「Pythonではじめる機械学習」やJupyterLabについての説明からです。

「Pythonではじめる機械学習」について

Pythonではじめる機械学習

Amazonのカスタマーレビューの評価は高いです。

私がこの本を選んだ理由は、以下です。

機械学習や人工知能に関する本は多い。しかし、その大半は計算機科学の修士課程、博士課程の学生を対象としており、難しい数学で一杯だ。しかし実際には、研究やビジネスにおいて、機械学習は日常的なツールとして使われている。今日、機械学習を使うだけなら博士号は必要ないのだ。しかし、難しい数学の授業を受けていない人にもわかるように、機械学習アルゴリズムを実装する際に重要なさまざまな側面を解説した本はほとんどない。本書が、微分積分や線形代数や確率論を何年も学ぶことなく機械学習を使いたい、と思う人たちの助けとなることを願っている。

これが、「Pythonではじめる機械学習」のまえがきに書いてあります。
「数学で入門者を苦しめない」と宣言してくれています。
私には、そのように解釈できました。

私は、過去に2度も機械学習を挫折しています。
だから、数学という壁を取っ払おうとしてくれる本書には期待大です。

それらについては、次の記事で説明しています。
興味がある方は、どうぞご覧下さい。

なお、「はじめに」をもとに必要なモノはすべてインストールしておいてください。

  • scikit-learn
  • JupyterLab(書籍にはJupyter Notebookと記載)
  • NumPy
  • SciPy
  • matplotlib
  • pandas
  • mglearn

JupyterLabについて

データ分析では、Jupyter Notebookを使う人が多いです。
でも、どうせ学ぶなら、最新のツールで学びましょう。

私は、JupyterLabを使っています。
次の記事では、Jupyter NotebookではなくJupyterLabを使う理由を解説しています。

そして、JupyterLabの使い方に関しては以下の記事をご覧下さい。

Jupyter NotebookとJupyterLabは、同じところが開発しています。
その開発元が、「Jupyter Notebookの開発はストップしたから、今後はJupyterLabを使え」と言っています。

そのため、この記事を読んでいる方はJupyterLabを使いましょう。
では、準備が整ったら、アイリスのクラス分類を見ていきましょう。

アイリスのクラス分類

アイリスの分類を機械学習で行います。
機械学習はデータが命ということで、まずはデータから確認です。

収集されたデータは以下(センチメートル単位)。

  • ガクの長さ
  • ガクの幅
  • 花弁の長さ
  • 花弁の幅

次に、ゴールですね。
ゴールは、データから分類わけすることです。

分類候補は以下。

  • setosa(ヒオウギアヤメ)
  • versicolor(ブルーフラッグ)
  • virginica(該当する和名は見つかりませんでした)

すでに分類わけされた測定結果もあります。
だから、データと結果(ゴール)の関連付けデータがあるということです。
教師あり学習問題になりますね。

また、分類にわけることから、クラス分類問題になります。
とりあえず、今はこれぐらいの理解でいいと思います。

いざ、コーディング!!

データの読み込み

これだけで必要なデータを取得できます。

from sklearn.datasets import load_iris
iris_dataset = load_iris()

便利ですよね。
scikit-learnをインストールした時点で、サンプルデータも取得しているわけです。

データの内容に関しては、「Pythonではじめる機械学習」に何やかんやと書いています。
でも、iris_datasetの中で大事なモノは2つです。

iris_dataset[‘data’]収集されたデータ
iris_dataset[‘target’]分類結果

150個の組み合わせがあります。

訓練データとテストデータに分ける

元データを訓練データとテストデータに分けます。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'],random_state=0)

魔法のような関数です。
これだけで元データを次のように分割します。

訓練データ75%
テストデータ25%

データを可視化して観察する

データを可視化するとは、グラフで表現することです。
その中でも、散布図は効果的になります。

pandasの機能を使って散布図を表現します。
そのため、X_trainをNumpy配列からデータフレームに変換する必要があります。
そのコードが以下。

iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)

columnsを指定することにより、カラム名に名前をつけます。

iris_dataframe.head()

sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.93.04.21.5
15.82.64.01.2
26.83.05.52.1
34.73.21.30.2
46.93.15.12.3

散布図は以下のコードが記述されています。

grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
                                hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)

でも、これは動きません。
次のようなエラーが出ます。

AttributeError: module 'pandas' has no attribute 'scatter_matrix'

pandasのバージョンが新しいほど動かないでしょう。
動くコードは以下。

grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',
                                hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)

「分離していることがわかる」ようです。
機械学習の入門者には、この表現は厳しすぎませんか?

おそらく、ポイントは2点。

  • 各色(アイリスの分類)がまとまっているか?
  • それぞれのまとまりが分離しているか?

上記2点を満たすなら、機械学習モデルを訓練できるということです。

モデル構築・学習(k-最近傍法)

そもそも、クラス分類には様々なアルゴリズムが用意されています。
私は、アルゴリズムには興味はありません。
というより、興味を持たないようにしています。

機械学習の初心者のうちは、よく使われるアルゴリズムを使っておけばよいと思います。
「k-最近傍法でクラス分類をするんだぁ、へぇ~」ぐらいのノリで。
そうじゃないと、数学(数式)の迷宮に入り込んでしまいます。

だから、入門者のうちは、使い方を覚えることに重点をおきましょう。

構築

以下のコードでモデルを構築しています。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

学習

構築したモデルに訓練データを食わせます。
以下が学習するコードです。

knn.fit(X_train, y_train)

実行した返答は以下。
どのようなパラメータで学習させたかがわかります。

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
 metric_params=None, n_jobs=None, n_neighbors=1, p=2,
 weights='uniform')

モデルの評価(k-最近傍法)

「Pythonではじめる機械学習」では、モデル構築・学習の後すぐに予測を行っています。
普通は、先にモデルの評価を行います。

学習したモデルが、本当に使えるかどうかを判定するのが先です。
よって、この記事でも先にモデルの評価から行います。

モデルの評価には、テストデータを用います。
コードは以下。

knn.score(X_test, y_test)
0.9736842105263158

97%の確率で正確な予測ができたことを示しています。
サンプルデータとは言え、スゴイ精度です。

アイリスのクラス分類のまとめ

「Pythonではじめる機械学習」における、「1.7.5 予測を行う」は不要だと思います。
確かに、学習させたモデルで予測することは面白いです。
「予測できる!!すげー」となりますが、1度にいろいろ詰め込み過ぎでしょう。

だからかどうかわかりませんが、「1.8 まとめと今後の展望」には最小コードを載せています。
それを参考にした最小コードを載せておきます。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'],random_state=0)
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)

print(knn.score(X_test, y_test))

たった、これだけのコードで機械学習ができるのです。
そう思えば、「機械学習の勉強はイケルかも」と思いませんか?

タイトルとURLをコピーしました