python3.doc_36
R e i - D r e a m
for Laravel
TOP > Python3 > ライブラリ(scikit learn)
Guest
login

最終投稿日:2022年6月18日

ライブラリ(scikit learn)
機械学習
※Anaconda3 をインストールしてればあります
● 機械学習の分類
教師あり学習                      データと共に正解が与えられる。未知のデータに対して予測を行う
教師なし学習                      正解データは与えられない。未知のデータから規則性を発見する
強化学習                               行動により部分的に正解が与えられる。データから最適な解をみつける
● 機械学習でできる事
○ クラス分類(Classification)
与えられたデータに対してラベルを付けて分類する事ができる。(手書き文字の識別等)
○ グループ分け クラスタリング(Clustering)
値の類似性を元にしてデータを複数のグループに分ける事ができる。(ユーザーの分類等)
○ 推薦(Recommendation)
与えられたデータから異なる情報を推薦するもの。(ネットショップのレコメンド等)
○ 回帰(Rertession)
過去のデータから、未来の数値を予測するのに利用する。(株価の予想等)
○ 次元削減(Dimensionality Reduction)
データの特徴を維持しつつ、データ量を減らす事ができる。
● データセットの読込み
ライブラリ scikit learn には、あらかじめ登録されているデータセットがあります。
データセットは datasets メソッドから呼び出す事ができます。
例)
from sklearn import datasets
digits = datasets.load_digits()     ※手書き文字データセット
print(dir(digits))                                ※データセットの内容のインデックスが参照できる
結果)
    ['DESCR', 'data', 'images', 'target', 'target_names']
上記のインデックスは以下の様な内容となります。
DESCR データセットの説明文
data テストデータ
images イメージデータ
target イメージデータに対応する数字(教師データ)
target_names target データの名前
例)     print(digits.DESCR)                      ※説明をダンプできます。
読込んだデータの構造を調べる
print(digits.data.shape)                      ※(1797, 64)
print(digits.target.shape)                   ※(1797,)
data は、ダンプした説明にもあるように 8x8 のピクセルデータです
target は、教師データなので data の行数分の1次元配列になっています
data の1行目をダンプしてみる
    print(digits.data[0])
結果)
[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3.
    15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0.
    0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12.
    0. 0. 0. 0. 6. 13. 10. 0. 0. 0.]
target を10個をダンプしてみる
例)
    print(digits.target[0:10])
結果)
[0 1 2 3 4 5 6 7 8 9]
上記の様に、data の1行目が target(教師)の 0 に対応している事がわかります。
実際に画像で確認してみる
データセットには、images データもあるので、ライブラリ matplotlib を使い表示してみる
例)
from sklearn import datasets
import matplotlib.pyplot as plt
digits = datasets.load_digits()
plt.matshow(digits.images[0], cmap='Greys')
plt.show()
上記を実行すると、1行目のデータの画像を確認する事ができます。
学習させ、テストする
● 学習させ、テストする
from sklearn import svm, datasets, metrics
digits = datasets.load_digits()
n = len(digits.data) * 2 // 3
#学習用データ(2/3を取得)
train_data = digits.data[:n]
#教師データ
train_ans = digits.target[:n]
#テスト用データ(残りの1/3)
test_data = digits.data[n:]
#テスト用答えデータ
test_ans = digits.target[n:]
#学習器生成
clf = svm.SVC(gamma=0.001)
#学習させる
clf.fit(train_data, train_ans)
#テスト実施
pre = clf.predict(test_data)
#間違いの総数を確認
print((test_ans != pre).sum())
#metrics メソッドで結果の詳細を確認できる
print(metrics.classification_report(test_ans, pre))
【メモ】
datasets メソッドや predict メソッドから取得できる配列は全て numpy 形式となっています。
なので、(test_ans != pre).sum() の様な計算もできます。
また、SVC メソッドの指定できる引数はここで確認できます。
【便利メソッド】
from sklearn import model_selection
data_train, data_test, label_train, label_test = model_selection.train_test_split(data, label, test_size=0.2)
上記の設定で、「学習データ」「学習の回答」「テストデータ」「テストの解答」の4つの変数にデータを振り分けてくれます。
第1引数                      学習総データ(2次元配列)
第2引数                      答えデータ(1次元配列)
第3引数                      テストの割合。上記の例だ他20%をテスト用データに振り分けます。
    ※昔は、cross_validation メソッドらしかったが、model_selection に変更になったらしい。。
● 学習器(SVM)の種類について
ライブラリ scikit learn では、三種類の SVM に対応しています。
SVC                      多分これが汎用的に使えるやつっぽい。。
NuSVC                基本的に SVC と同じ。エラー処理の仕方等が若干違うらしい
LinearSVC         線形カーネルに特化した SVM らしい。処理は速いが若干正解率が落ちるっぽい。。
● 自分でデータと答えを作る
XOR 演算を学習させる
XOR 演算とは比較する値が共に True または、False の場合は False となり、その他の場合は True となるものです。
総組み合わせ)
比較1 比較2 結果
True True False
True False True
False True True
False False False
○ 最初なので通常の配列でやってみる
from sklearn import svm, metrics
#学習させる内容(0列、1列がデータ、2列が答え)
xor_input = [
     [0, 0, 0]
    ,[0, 1, 1]
    ,[1, 0, 1]
    ,[1, 1, 0]
]
data = []
label = []
for row in xor_input:
    p = row[0]
    q = row[1]
    r = row[2]
    #data にデータを格納
    data.append([p, q])
    #label に答えを格納
    label.append(r)
#学習器を初期化
clf = svm.SVC()
#fit メソッドで学習させる。第1:データ、第2:答え
clf.fit(data, label)
#predict メソッドで学習した学習器に対して、新たな問題を与え答えを予測させる(データの数だけ答えを返却する)
pre = clf.predict(data)
print('予測結果', pre)
for idx, ans in enumerate(label):
    #答え合わせ
    if pre[idx] == ans:
        #答えが正解ならこっちを処理する
        print(' 詳細:', pre[idx], ans, '○')
    else:
        print(' 詳細:', pre[idx], ans, '×')
○ numpy ライブラリを使ってソースを簡略化する
import numpy as np
from sklearn import svm, metrics
d = [
     [0, 0, 0]
    ,[0, 1, 1]
    ,[1, 0, 1]
    ,[1, 1, 0]
]
#numpy 配列へ変換
xor_input = np.array(d)
#data にデータを格納
data = xor_input[0:4,0:2]
#label に答えを格納(1次元配列にするため ravel メソッド使用)
label = xor_input[0:4,2:3].ravel()
clf = svm.SVC()
clf.fit(data, label)
pre = clf.predict(data)
print('予測結果', pre)
for idx, ans in enumerate(label):
    if pre[idx] == ans:
        print(' 詳細:', pre[idx], ans, '○')
    else:
        print(' 詳細:', pre[idx], ans, '×')
レンズモード 【新規購入限定用】
ログインしてコメントを残そう!!


きっぷる