ペンギンデータセットでデータサイエンス入門 〜 教師あり学習・分類編【Python/scikit-learn/機械学習/ガウシアンナイーブベイズ】
目次
こんにちは。
さて、昨今データサイエンス入門者に爆発的な人気を誇っている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'
})
こんな感じのデータになります。

前回同様、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_train
とy_train
が学習データ、X_test
とy_test
がテスト用データです。取り出すときは変数の名前と順番に注意しましょう。
特に指定をしない限り、全体の0.25、つまり四分の一のデータがテストデータになります。randam_state
は整数を渡すことでランダムシードを使いデータセットをシャッフルします。ポピュラーな数字は0
と42
です。(42は機械学習のランダムシードで頻出の数字ですが、かの有名な「人生、宇宙、すべての答え」ですね。)
参考ドキュメント : scikit learn | sklearn.model_selection.train_test_split
オマケ : Google検索 「人生、宇宙、すべての答え」
【前回のおさらい】scikit-learnを使った機械学習の手順
それでは、データの準備ができたところでここから分類問題に取り組んでいくわけですが、まず前回まとめたscikit-learn
での機械学習の流れをおさらいしましょう。
- モデル選択
- モデルのインスタンス化とハイパーパラメータの選択
- 特徴行列と目的配列の設定
- フィッティング
- 未知のデータを予測
基本の流れはこれと同じです。
【モデルの訓練】ペンギンの特徴と種類を学習させる
上記の流れに沿って見ていきます。
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) # 評価