■ はじめに
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)SVM(Support 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