scikit-learnを用いた多クラス分類(1/3)

今回は、分類のいろいろなアルゴリズムを試しながらデータの扱いに慣れていきたいと思います.

なお、99%が以下の記事のトレースですが、ちょっと私の理解が追い付いていない箇所は省略したり、変更しながら動かしています.先に言っておきますが、私の記事を読むより元の記事を読まれる方が正しい選択かと思います.

qiita.com

今回使用したのは、MNISTとともに絶大な利用率を誇るあのIris(アヤメ)データ. scikit-learnから利用できます.

また、今回試した分類アルゴリズムは以下になります.

では、早速実装に移っていきたいと思います.

ライブラリのインポート

まず 必要なライブラリのインポートを行います.分類アルゴリズムに関しては、それぞれ使用するときにインポートすることにします.

  • numpy:Pythonで配列計算を扱うためのライブラリ
  • matplotlib:Pythonでグラフを描画するためのライブラリ

ライブラリってなんぞ、と思う場合は道具箱のように思えばいいんじゃないでしょうか.少なくとも私はそんな程度の理解です.

scikit-learnも機械学習用ライブラリの代表格とも言える存在で非常に便利なツール(各種アルゴリズムや、前処理用の関数など)を簡単に扱うことができます.

# 必要なライブラリのimport
import numpy as np
import matplotlib.pyplot as plt

Iris(アヤメ)データセットのインポート from sklearn

# データセットのインポート
from sklearn.datasets import load_iris
# データセットを訓練用・テスト用に分けるツールのインポート
from sklearn.model_selection import train_test_split

#irisにデータを保存
iris = load_iris()

データセットの中身を確認するには、以下のようにDESCRコマンドを使えばよいです.

print(iris.DESCR)
_iris_dataset:


Iris plants dataset

--------------------

Data Set Characteristics:

:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive attributes and the class
:Attribute Information:
    - sepal length in cm
    - sepal width in cm
    - petal length in cm
    - petal width in cm
    - class:
            - Iris-Setosa
            - Iris-Versicolour
            - Iris-Virginica

:Summary Statistics:

============== ==== ==== ======= =====  ====================
                Min  Max   Mean    SD   Class Correlation
============== ==== ==== ======= =====  ====================
sepal length:   4.3  7.9   5.84   0.83    0.7826
sepal width:    2.0  4.4   3.05   0.43   -0.4194
petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
============== ==== ==== ======= ===== ====================

:Missing Attribute Values: None
:Class Distribution: 33.3% for each of 3 classes.
:Creator: R.A. Fisher
:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
:Date: July, 1988

Descriptionの情報から - アヤメの種類(class)は3種類 - 特徴量(attribute)は、sepal の長さ・幅、petalの長さ・幅の4種類 - データの数は全部で150(それぞれ50個

というようなことが分かります.

なお、当然ですが自分で準備したデータセットに対してDESCRコマンドを使っても、勝手に情報が整理されるわけではありませんので、ご注意ください.

データの確認

  • データの形状は、shapeコマンドから確認できます.
  • 花の種類は、target_namesに格納されています.
  • データは4つの特徴量で構成され、ターゲットには、そのクラス[0~2]が格納されています.例として1番最初のデータと最後のデータを確認.
print(iris.data.shape)
print(iris.target_names)
print(iris.data[0], iris.target[0])
print(iris.data[149], iris.target[149])

(150, 4)
['setosa' 'versicolor' 'virginica']
[5.1 3.5 1.4 0.2] 0
[5.9 3. 5.1 1.8] 2

データの可視化

これは必ずしも必要な処理ではないのですが、データがどんなものかを確認するためにデータセットを描画します.
今回、描画にはseabornを使っています.seabornはmatplotlibのラッパーにあたるので、seabornでできることはmatplotlibでも大体できるのですが、より簡単にきれいなグラフを書くことができます.

ラッパー(wrapper)は、wrapから来る内包とかいう意味なんですが、 結局、教えて!gooにある以下の説明が分かりやすいかと思います.< br>

oshiete.goo.ne.jp

個人的には、下記の理解であまり困っていません.

seabornはmatplotlibのラッパー
→意訳:seabornはなんかmatplotlibを使いやすくしたやつ.しらんけど.

KerasはTensorflowのラッパー
→意訳:KerasはなんかTensorflowを使いやすくしたやつ.しらんけど.

seabonとmatplotlibの関係は以下を参照:
Jupyter-notebook の作図ライブラリ比較 - Qiita

# seabornのインポートおよびデータフレームが使えるよう,pandasをインポート
import pandas as pd
import seaborn as sns

# irisのデータセットをsnsで使えるデータフレームに格納
df = sns.load_dataset("iris")

sns.set(style = "ticks")
%matplotlib inline
sns.pairplot(df, hue = "species", markers = ["o", "^", "s"])

f:id:shirakonotempura:20181219003942p:plain
Irisデータの可視化

▲で示したversicolorと■で示したvirginicaは似ている、比較的、3種類のデータはそれぞれでまとまっているようにも見える.


長くなってしまったので、一旦ここで区切ります. ほぼトレースとはいえ、記事にするのは難しい.


その他、今回参考にさせていただいたありがたい記事

分かりやすくまとめていただきありがとうございます.

matplotlib について参考にさせてもらった記事

www.sejuku.net

scikit-learn でできる代表的なことが整理されています

qiita.com