コンテンツにスキップ

第2章 教師有り学習

1 データの読み込み

早速、機械学習を体験してみましょう。まずは教師あり学習を行います。

シンプルな例として、体高、体重と種類(犬と猫)が記載されているデータを使用します。これより犬と猫を判定してみます。

まず、目的のファイルをDataFrameに読み込んで表示してみます。 ファイル dogcat.ipynb に以下を記述します。

import pandas as pd
df =  pd.read_csv("dogcat.csv")
df

散布図行列を表示してみます。

import seaborn as sns
sns.set(font=["Meiryo"])
sns.pairplot(data=df, hue="種類")

体高、体重と種類に関係がありそうです。体高と体重を入力したら、種類を判定できるようにしてみます。入力するデータが特徴量、判定結果が正解ラベルになります。

  • 特徴量:体高と体重
  • 正解ラベル:種類

まずは、特徴量と正解ラベルにデータを分けます。特徴量を x 、正解ラベルを y に入れます。

x = df[["体高","体重"]]
y = df["種類"]

2 モデルの構築

次にモデルを作ります。まずはアルゴリズムを選択します。 本来はさまざまな観点からアルゴリズムを選択しますが、今回は「決定木(Decision Tree)」というアルゴリズムを使用します。

決定木のイメージとしては以下を参考にしてください。 寒い時こそ食べたい、濃厚チョコアイス

「決定木」は条件をいくつも見つけて、その条件を満たすか、満たさないかを何回も行って答えを導き出すものです。

scikit-learn のライブラリにはさまざまなアルゴリズムが入っており、importしてすぐ使うことが出来ます。 今回はmodelという変数に決定木クラスのオブジェクトを作成します。

from sklearn import tree

model = tree.DecisionTreeClassifier()

3 学習と予測

では、作成したモデルに学習をさせましょう。これは fit というメソッドでできます。scikit-learnの場合、アルゴリズムが異なっても機械学習に使用するメソッドは常にfitを用います。

model.fit(x, y)

最初の引数に特徴量、2番目の引数にその答えをセットします。xからyを導き出す方法を探すのです。fitを行うことで学習が完了します。データが大量の場合にはここで時間がかかります。

あとは未知のデータを入れて予測をしてみましょう。これは model.predict(データ) で出来ます。予想するデータのリストで指定します。ただし、複数のデータを一度に予測できるようになっているので特徴量のリストをさらにリストに入れて指定します。

model.predict( [[0.5, 20]] )

ここで流れをまとめておきます。

  1. データの読み込み
  2. 各列を特徴量 x と正解ラベル y に分ける
  3. モデルの構築
  4. 学習( fit )
  5. 予測( predict )

4 決定木の表示

ここで決定木のアルゴリズムでどのように判定を下しているかを確認してみましょう。

treeのplot_treeで決定木の構造を見ることが出来ます。 引数にはmodelと結果であるclass_namesを、feature_namesには特徴量の名前を指定します。 色を塗って分かりやすくするために、filled=Trueも指定します。

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font=["Meiryo", "Yu Gothic"])

tree.plot_tree(model, class_names=["犬","猫"], 
    feature_names=x.columns, filled=True)
plt.show()

何を元に猫か犬かを判断していることが分かります。

※giniは不純度でこれが0になるように処理していきます。