前回より、機械学習に入門しています。
今回は、データを用意し、そのデータをもとに目標設定していきます。
データを取得
機械学習とデータは不可分です。まずは今回利用するデータを用意します。
Machine Learning Repositoryというところで公開されているiris(アヤメ)のデータを取得します。
import pandas as pd # iris dataをダウンロード df = pd.read_csv( 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None ) # 全件表示する pd.set_option('display.max_rows', None) print(df)
データの中身は下記です。
- 1列目: がくの長さ(cm)
- 2列目: がくの幅(cm)
- 3列目: 花弁の長さ(cm)
- 4列目: 花弁の幅(cm)
- 5列目: 名前
名前の列を見てみると、下記の3種類のアヤメのデータが混ざっていることがわかります。
- 1〜50行目: Iris-setosa
- 51〜100行目: Iris-versicolor
- 101〜150行目: Iris-virginica
目標設定
今回は、Iris-setosaとIris-versicolorの行、がくの長さ・花弁の長さの列のみを利用します。 そして、がくの長さ・花弁の長さを元に、それぞれの行がIris-setosaとIris-versicolorの内どちらであるのかを判定します。
データ整形
データセットを作ります。
import numpy as np # y: 目的変数 Iris-setosa=-1, Iris-versicolor=1 # [1, 1, 1, ..., -1, -1, -1...] y = df.iloc[0:100, 4].values y = np.where(y == 'Iris-setosa', -1, 1) # X: トレーニング変数 [がくの長さ, 花弁の長さ]の一覧 # [[5.1, 1.4], [4.9, 1.4], [4.7, 1.3], ...] X = df.iloc[0:100, [0, 2]].values print('y\n', y) print('X\n', X)
ここで、y=目的変数とは、Iris-setosaとIris-versicolorの内どちらであるのかを示しています。今回は、-1がIris-setosa、1がIris-versicolorです。
一方、X=トレーニング変数は、がくの長さ・花弁の長さを示しています。例えば一行目のデータの[5.1 1.4]で言うと、5.1ががくの長さ、1.4が花弁の長さです。
グラフ表示
目的変数・トレーニング変数をプロットしてみます。
""" グラフ表示(散布図) """ import matplotlib.pyplot as plt data_count = 50 plt.scatter(X[:data_count, 0], X[:data_count, 1], color='red', marker='o', label='setosa') plt.scatter(X[50:50 + data_count, 0], X[50:50 + data_count, 1], color='blue', marker='x', label='versicolor') plt.xlabel('sepal length [cm]') plt.ylabel('petal length [cm]') plt.legend(loc='upper left') plt.show()
図の意味は下記の通りです。
- x軸: がくの長さ
- y軸: 花弁の長さ
- 赤点: Iris-setosa
- 青バツ: Iris-versicolor
赤点(Iris-setosa)と青バツ(Iris-versicolor)は座標上ではっきり位置が別れています。
つまり、 がくの長さと花弁の長さを見れば、それがIris-setosa・Iris-versicolorの内どちらであるかが分類できるということ、すなわち設定した目標が達成できそうということが、推測できます。
あとがき
今回の記事では、機械学習によってどんなことができるか(What)が表現できているんじゃないかと思います。
次回以降では、どうやって実現するか(How)を記載していこうと思います。