【Python】scikit-learn ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2018/03/28/224532

の続き。

今回は、scikit-learn(サイキット・ラーン)を
少しづつでも学んでいく

今回の学べること

A)scikit-learn 使い方/環境設定
B)以下の機械学習の手法
 1)ホールドアウト法
 2)k-分割交差検証(クロスバリデーション)
 3)SVM(Support Vector Machine / サポートベクターマシン)

目次

【1】scikit-learn
【2】環境設定
【3】用語整理
 1)ホールドアウト法
 2)k-分割交差検証(クロスバリデーション)
 3)SVM(Support Vector Machine / サポートベクターマシン)
【4】サンプル
 例1:ホールドアウト法
 例2:k-分割交差検証
 例3:SVM

【1】scikit-learn(サイキット・ラーン)

* 多くの機械学習アルゴリズムが実装されている
* サンプルのデータセット(トイデータセット)が付属

ライセンス

BSD license
 => 個人/商用問わず、無料で利用可能

【2】環境設定

pip install scikit-learn

【3】用語整理

1)ホールドアウト法

与えられたデータセットを
トレーニングデータとテストデータに分けて使用する手法

2)k-分割交差検証(クロスバリデーション)

用意したトレーニングデータセットをk分割し、
そのうちの1つをテストデータ、残りのk-1個を学習データとして使用
学習と評価を繰り返して得られるk個のモデルと性能評価から
平均性能を算出 するという手法

3)SVMSupport Vector Machine / サポートベクターマシン

* 「教師あり学習」を用いるパターン認識モデル
* 情報データ(画像/音声など)から、意味を持つ対象を選別して取り出す
* データを2つのグループに分類する問題に向いている

【4】サンプル

例1:ホールドアウト法

from sklearn import datasets
from sklearn.model_selection import train_test_split
# データ確認用
#import matplotlib.pyplot as plt

# load_digitsの引数でクラス数を指定
# 2なら0と1, 3なら0と1と2が書かれたデータのみに絞られる
# 最大は10で0から9となる
digits = datasets.load_digits(10)

# データ確認
#for i in range(10):
#  plt.matshow(digits.images[i], cmap="Greys")
#  plt.show()

X = digits.data
y = digits.target

# X_train...トレーニングデータのデータセット(正解ラベル以外)
# y_train...トレーニングデータの正解ラベル
# X_test...テストデータのデータセット(正解ラベル以外)
# y_test...テストデータの正解ラベル
X_train, X_test, y_train, y_test = train_test_split(
  # X...正解ラベル以外の配列
  X,
  # y...Xに対する正解ラベルの配列
  y,
  # test_size...テストデータの割合
  # (テストデータの割合を0から1までの数値で指定)
  test_size=0.3,
  random_state=0)

# トレーニングデータとテストデータのサイズを確認します。
print("X_train :", X_train.shape)
print("y_train :", y_train.shape)
print("X_test :", X_test.shape)
print("y_test :", y_test.shape)

出力結果

X_train : (1257, 64)
y_train : (1257,)
X_test : (540, 64)
y_test : (540,)

例2:k-分割交差検証

# 50~100データ程度のデータセットを扱う場合に適している
from sklearn import svm, datasets, model_selection

digits = datasets.load_digits(10)
X = digits.data
y = digits.target

# 機械学習アルゴリズムとして SVMを使用
svc = svm.SVC(C=1, kernel="rbf", gamma=0.001)

# 交差検証法を用いてスコアを求める
scores = model_selection.cross_val_score(
  svc,
  # Xは正解ラベル以外のデータセットの配列
  X,
  # yは正解ラベルの配列
  y,
  # 分割数
  cv=6)

# トレーニングデータとテストデータのサイズ
print (scores)
print ("平均スコア :", scores.mean())

出力結果

[0.97039474 0.97682119 0.98333333 0.98993289 0.996633   0.94932432]
平均スコア : 0.9777399115152967

例3:SVM

import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn import svm

# Step1 : 座標を作る
N = 15
random.seed(10000)
train_x = np.array([[random.randint(0, 100), random.randint(0, 100)] for i in range(N)])

# Step2 : 描画する
#for i in range(len(train_x)):
#  plt.plot(train_x[i][0], train_x[i][1], 'x', color='blue')
#  plt.annotate(i, (train_x[i][0], train_x[i][1]), size=15)
#plt.show()

# Step3 : Step2のデータを目視で確認し、手動で分類する
train_y = np.array([0 for i in range(N)])
train_y[6] = 1
train_y[8] = 1
train_y[10] = 1
train_y[11] = 1
train_y[13] = 1

# Step4 : 分類したものを色分けする
colors = ['blue', 'red']
for i in range(len(train_x)):
  plt.plot(
    train_x[i][0], train_x[i][1], 'x', color=colors[train_y[i]])
  plt.annotate(
    i, (train_x[i][0], train_x[i][1]), size=20)
#plt.show()

# Step5 : テストデータ を設定する
test_x = np.array([[30, 60]])

# Step6 : test_xを描画する
plt.plot(test_x[0][0], test_x[0][1], 'x', color='black')
plt.annotate('test', (test_x[0][0], test_x[0][1]), size=20)

# Step7 : 学習する
clf = svm.SVC(gamma=0.0001, C=1)
# fit() ... 学習用データと結果を学習させる
clf.fit(train_x, train_y)

# Step8 : 分類する
# predict() ... テストデータによる予測
test_y = clf.predict(test_x)

# Step9 : text_yを描画する
for i in range(len(test_x)):
  plt.plot(test_x[i][0], test_x[i][1], 'x', color=colors[test_y[i]])
  plt.annotate('test', (test_x[i][0], test_x[i][1]), size=20)

# Step10 : 決定境界を描画する
x = np.linspace(0, 100, 30)
y = np.linspace(0, 100, 30)
yy, xx = np.meshgrid(y, x)
xy = np.vstack([xx.ravel(), yy.ravel()]).T
P = clf.decision_function(xy).reshape(xx.shape)
plt.contour(
  xx, yy, P, colors='k',
  levels=[0], alpha=0.5,
  linestyles=['-'])
plt.show()

参考文献

https://ai-kenkyujo.com/2020/02/28/scikit-learn/
https://dev.classmethod.jp/machine-learning/introduction-scikit-learn/
https://aidemy.net/courses/2010/exercises/S1PtnLoIgM
https://tutorials.chainer.org/ja/09_Introduction_to_Scikit-learn.html
SVC
https://www.ossnews.jp/oss_info/scikit-learn/3
https://kenyu-life.com/2019/02/11/support_vector_machine/ https://www.youtube.com/watch?v=WSTyoaK6dPU

関連記事

scikit-learn ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/03/08/113356
scikit-learn ~ 線形回帰 ~
https://dk521123.hatenablog.com/entry/2020/07/04/000000
scikit-learn ~ リッジ回帰 ~
https://dk521123.hatenablog.com/entry/2020/04/25/174503
scikit-learn ~ 重回帰 / ロッソ回帰・エラスティックネット ~
https://dk521123.hatenablog.com/entry/2020/11/29/193247
scikit-learn ~ 決定木 / ランダムフォレスト ~
https://dk521123.hatenablog.com/entry/2020/04/04/021413
TensorFlow ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/02/16/103500
TensorFlow ~ 環境構築 / Windows 編 ~
https://dk521123.hatenablog.com/entry/2018/02/17/102927
Keras ~ 深層学習用ライブラリ ~
https://dk521123.hatenablog.com/entry/2020/03/03/235302
NumPy ~ 数値計算ライブラリ ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532
LibROSA ~ 音声分析ライブラリ ~
https://dk521123.hatenablog.com/entry/2020/10/04/172832
機械学習に関する覚書
https://dk521123.hatenablog.com/entry/2018/10/23/230800