ペンギンデータセットでデータサイエンス入門 〜 教師あり学習・分類編【Python/scikit-learn/機械学習/ガウシアンナイーブベイズ】

2021-09-25
Main Image

目次

こんにちは。

さて、昨今データサイエンス入門者に爆発的な人気を誇っているpalmerpenguinsなるペンギンデータセット。前回の記事で基本的な機械学習の流れをおさらいしました。

今回はペンギンデータセットを使って教師あり学習の「分類」手法について学習・実践してみましょう。

という初心者向けの記事です。

よろしく。

この記事を読めば、簡単なラベル分類問題を解く機械学習モデルを作成できるようになります。

ちなみに本記事ではプログラムにPython3と、機械学習ライブラリにscikit-learnを使います。

過去の関連記事はこちらです。

【目的と概要】教師あり学習の分類問題とは?

今回やりたいことは、「ペンギンデータセットの一部を訓練して作ったモデルは、残りのペンギンのデータのラベルをどれだけ正しく予測できるか?」という問題に取り組むことです。

教師あり学習は、大きく2つに分類されます。1つは、前回見たような「ペンギンの羽の長さがこれくらいなら、体重はどれくらいか?」といった未知のデータをy = ax + bのような数式のモデルを作って数値を予測する回帰問題です。もう1つが、今回取り組みたい「この特徴をもつペンギンはアデリーペンギンか、ヒゲペンギンか」といったペンギンの種類のようなラベルを予測する分類問題です。

今回は以下の流れで分類問題に取り組みます。

1. データセットの準備
ペンギンデータセットを2つに分割します。

  • 学習データ(特徴と答えのラベルがわかっているデータ)
  • テストデータ(評価用の未知のデータ)

2. モデルの訓練
学習データを使って、ペンギンの特徴からその種類を判別できるモデルを訓練させます。

3. 予測
2で訓練したモデルにテストデータのラベル(ペンギンの種類)を予測させます。

4. 評価
3で正しく予測できたか答え合わせして、モデルの良さを評価します。

という感じです。

【準備1】データセットの準備

まずは今回使うデータセットをインポートします。データエンジニアリング編で作ったデータセットを読み込んで、必要な列だけ取り出します。列名は使いやすいように短く変換します。

import pandas as pd
df = pd.read_csv('penguins.csv')

use_col = [
  'species',
  'bill_length_mm',
  'bill_depth_mm',
  'flipper_length_mm',
  'body_mass_g',
  ]

df = df[use_col].rename(columns={
  'bill_length_mm':'bill_length',
  'bill_depth_mm':'bill_depth',
  'flipper_length_mm':'flipper_length',
  'body_mass_g':'body_mass'
})

こんな感じのデータになります。

penguinsの特徴行列

前回同様、NaN値は除外してクレンジングします。

df = df[~df.isnull().any(axis=1)] # NaNがひとつでもある行を削除

342 rows × 5 columnsになりました。

【準備2】訓練用の学習データと評価用のテストデータに分ける

今回は目的変数yをペンギンの種類speciesにして、特徴行列Xは残り4つの列をすべて特徴として使おうと思います。

y = df.species
X = df.drop('species', axis=1) # 残りの列 = species列を削除したもの

これで、yが342行1列、Xが342行4列の行列になりました。

ここで、scikit-learnではデータセットを学習用とテスト用に分けるのに便利なツールtrain_test_splitが提供されています。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)

このシンプルな1行で、学習データとテストデータに分割できます。X_trainy_trainが学習データ、X_testy_testがテスト用データです。取り出すときは変数の名前と順番に注意しましょう。

特に指定をしない限り、全体の0.25、つまり四分の一のデータがテストデータになります。randam_stateは整数を渡すことでランダムシードを使いデータセットをシャッフルします。ポピュラーな数字は042です。(42は機械学習のランダムシードで頻出の数字ですが、かの有名な「人生、宇宙、すべての答え」ですね。)

参考ドキュメント : scikit learn | sklearn.model_selection.train_test_split

オマケ : Google検索 「人生、宇宙、すべての答え」

【前回のおさらい】scikit-learnを使った機械学習の手順

それでは、データの準備ができたところでここから分類問題に取り組んでいくわけですが、まず前回まとめたscikit-learnでの機械学習の流れをおさらいしましょう。

  1. モデル選択
  2. モデルのインスタンス化とハイパーパラメータの選択
  3. 特徴行列と目的配列の設定
  4. フィッティング
  5. 未知のデータを予測

基本の流れはこれと同じです。

【モデルの訓練】ペンギンの特徴と種類を学習させる

上記の流れに沿って見ていきます。

1. モデル選択

今回はガウシアンナイーブベイズというモデルを使用します。ナニソレって感じですが、ざっくりいうと、各ペンギンの種類がそれぞれの特徴についてガウス分布(正規分布)のバラツキを持つと仮定するモデルです。このモデルはとても高速に結果が得られるので、より複雑なモデルで調べていく前に基準としたい場合に適しています。

from sklearn.naive_bayes import GaussianNB

参考ドキュメント : scikit learn | sklearn.naive_bayes.GaussianNB

2. モデルのインスタンス化とハイパーパラメータの選択

このガウシアンナイーブベイズについては、ハイパーパラメータ選択なしで使えます。非常にシンプルで簡易的。

なので、ここではただインスタンス化します。

gnb = GaussianNB()

参考ドキュメント : scikit learn | Gaussian Naive Bayes

3. 特徴行列と目的配列の設定

先程作成した学習データをモデルのフィッティングに使います。X_trainを特徴行列に、y_trainを目的配列として使います。

4. フィッティング

モデルに学習データを適合させます。回帰モデル同様、fitメソッドで一発です。

gnb.fit(X_train, y_train)

あっという間、いや、そんなこと言う間もなく終わります。

これで、教師あり学習の「学習」の部分が終わりました。

【予測】未知のペンギンとの出会い

先程作成したモデルにテストデータを適用して、ペンギンの種類を予測してみます。モデルにとっては、未知のペンギンとの出会いです。

y_pred = gnb.predict(X_test)

こちらも回帰モデル同様、predictメソッドで予測ができます。

y_predの中身を見てみると、ペンギンの種類speciesの配列になっていることがわかります。

array(['Gentoo', 'Adelie', 'Adelie', 'Chinstrap', 'Adelie', 'Chinstrap', ...

学習の適合結果とテストデータから、このように種類を予測してくれたみたいです。

【モデルの評価】どれくらいのペンギンを正しく分類できたか?

それでは、一体予測が正しくできたのか?答え合わせしてみようと思います。

答えは最初にテストデータを作ったときのy_testです。予測結果はy_predです。これらの「一致する数」「一致しない数」を調べれば、答え合わせ出来そうです。

(y_test == y_pred).sum() # 出力: 82
(y_test != y_pred).sum() # 出力: 4

86羽中、82羽のペンギンは正しく種類を言い当てられました。凄い。4羽のペンギンについては間違えてしまったようです。

ちなみに、このような評価にもscikit learnは便利なツールを提供してくれています。accuracy_scoreを使うことで、正答率が一発で出せます。

from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred)
# 結果
# 0.9534883720930233

ということで、大体95%のペンギンの種類を正しく分類できたということがわかります。

まとめ

というわけで、今回はペンギンデータセットとscikit-learnを使ってペンギンの種類の分類に取り組んでみました。機械学習の中でも、「教師あり学習」の「分類」と呼ばれる問題です。基本的な流れは前回取り扱った回帰問題と同じでした。

分類モデルにはガウシアンナイーブベイズを使用し、このモデルでどれくらいペンギンが正しく分類できたか評価しました。とても短く単純なプログラムですが、正答率95%と、なかなか精度の高いモデルが一瞬で作れました

より未知のデータに対する予測精度を見積もりたい場合は、交差検証法などで学習データとテストデータを入れ替えながら、モデル選定の正しさを検証していくことになります。このあたりについてはまた別の記事でまとめようと思います。

今後もペンギンデータセットを使って他の問題やモデルについても取り扱っていこうと思います。

それでは〜

今回使った機械学習プログラム全文

最後に、今回使ったPythonプログラムのコードをまとめておきます。実行文は、たったの10行でした。

# データセットの準備
y = df.species # 目的配列
X = df.drop('species', axis=1) # 特徴行列

# 学習データとテストデータに分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)

from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB() # モデルのインスタンス作成

gnb.fit(X_train, y_train) # 学習
y_pred = gnb.predict(X_test) # 予測

from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred) # 評価
ads【オススメ】未経験からプログラマーへ転職できる【GEEK JOBキャンプ】
▼ Amazonオススメ商品
ディスプレイライト デスクライト BenQ ScreenBar モニター掛け式
スマートLEDフロアライト 間接照明 Alexa/Google Home対応

Author

Penta

都内で働くITエンジニアもどき。好きなものは音楽・健康・貯金・シンプルでミニマルな暮らし。AWSクラウドやデータサイエンスを勉強中。学んだことや体験談をのんびり書いてます。TypeScript / Next.js / React / Python / AWS / インデックス投資 / 高配当株投資 More profile

Location : Tokyo, JPN

Contact : Twitter@penguinchord

Recommended Posts

Copy Right / Penguin Chord, ペンギンコード (penguinchord.com) 2022 / Twitter@penguinchord