機械学習ライブラリ scikit-learn: Machine Learning in Python, Built on NumPy, SciPy, and matplotlib
アヤメのガク片の長さと幅,花びらの長さと幅の4つを入力データ x として与え,アヤメの種類 y(0: Iris-Setosa, 1: Iris-Versicolour, 2: Iris-Virginica)を判定する。
y = f(p, x) 入力 x: 4次元ベクトル,出力 y: 0(setosa), 1(versicolor), 2(virginica)
, p: parameters
教師付き訓練データを利用して,関数fが正しく答えるように,parametersを調整する。
from IPython.display import Image
Image("./Iris_setosa.jpg", width=200) # ヒオウギ・アヤメ
Image("./Iris_versicolor.jpg", width=200) # アイリス・バージカラー
Image("./Iris_virginica.jpg", width=200)
#sklearnのデータセットをimport
from sklearn import datasets
#datasetsからirisのデータセットをloadし,irisでラベリング
iris = datasets.load_iris()
#iris datasetのkeyを表示
print(iris.keys())
#iris datasetの説明DESCRを表示
print(iris.DESCR)
#iris target_names:分類の名前
print('target_names:', iris.target_names)
#iris feature_names:特徴量の名前
print('feature_names:', iris.feature_names)
# ガク片(sepal)の長さ,幅,花びら(petal)の長さ,幅(cm):1つのアヤメが4次元ベクトル空間の点であらわされる。
print( 'iris.dataのサイズ=', len(iris.data) )
iris.data[:10] # 最初の10個
print( 'iris.targetのサイズ=', len(iris.target) ) # targetデータ数(教師データ)
print( 'iris.target\n', iris.target ) # 教師データ:アヤメの種類
gL = [ x[0] for x in iris.data] # ガクの長さ
gW = [ x[1] for x in iris.data] # ガクの幅
hL = [ x[2] for x in iris.data] # 花びらの長さ
hW = [ x[3] for x in iris.data] # 花びらの幅
print('gL:', gL[:10] ) # ガクの長さを最初から10個表示
print('gW:', gW[:10] ) # ガガクの幅を最初から10個表示
print('hL:', hL[:10] ) # 花びらの長さを最初から10個表示
print('hW:', hW[:10] ) # 花びらの幅を最初から10個表示
%matplotlib inline
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16, 8)) # 1600px*800px
fig.add_subplot(231)
plt.title('gL-gW')
plt.scatter(gL, gW, c=iris.target)
plt.colorbar()
fig.add_subplot(232)
plt.title('hL-hW')
plt.scatter(hL, hW, c=iris.target)
plt.colorbar()
fig.add_subplot(233)
plt.title('gL-hL')
plt.scatter(gL, hL, c=iris.target)
plt.colorbar()
fig.add_subplot(234)
plt.title('gW-hW')
plt.scatter(gW, hW, c=iris.target)
plt.colorbar()
fig.add_subplot(235)
plt.title('gL-hW')
plt.scatter(gL, hW, c=iris.target)
plt.colorbar()
fig.add_subplot(236)
plt.title('gW-hL')
plt.scatter(gW,hL, c=iris.target)
plt.colorbar()
plt.show()
# 3次元散布図
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlabel("gW")
ax.set_ylabel("hL")
ax.set_zlabel("hW")
ax.scatter(gW, hL, hW, c = iris.target)
plt.show()
iris.data.tolist()[:10] # arrayをlistに変換
iris.target[:10]
import random, numpy as np
# iris.data.tolist(): arrayをlistに変換し,アヤメのデータiris.dataと種類iris.targetをzipする
d = list(zip(iris.data.tolist(), iris.target))
d[:10]
random.shuffle(d) # 元データはアヤメの種類毎にまとまっているので,データをシャッフルして混ぜる
d[:10]
train_data = d[0:120] # 4/5 をトレーニングデータとする
test_data = d[120:150] # 1/5 をテストデータとする
data_train, target_train = zip(*train_data) # train_data: train_data はサイズ120のリスト
# zip(*train_data)でzipしたリストを展開し基に戻す。
# 変数の数が要素の数よりも少ない場合、変数名にアスタリスク*をつけると、
# 要素がリストとしてまとめて代入される。
data_train[:10]
target_train[:10]
data_test, target_test = zip(*test_data) #*をつけると、イテラブル内の要素が個々の引数としてzipに渡される
# 上記一連の処理の代わりに,sklearnのtrain_test_split関数を使うと同様の処理が簡便に記述できる
from sklearn.model_selection import train_test_split as split
x_train, x_test, y_train, y_test = split(iris.data, iris.target, train_size=0.8, test_size = 0.2)
list(zip(x_train, y_train))[:10]
from sklearn import svm
# SVCアルゴリズムオブジェクト生成し, clf(classification)とラベル付け
clf = svm.SVC(gamma = 'auto') # gamma = 'auto'を指定しないと警告がでる
# trainingデータを使って,clfを学習させる
clf.fit(x_train, y_train)
# 学習済みの識別機clfを利用して,testデータを識別させる
y_pred = clf.predict(x_test)
print('y_pred =', y_pred)
print('y_test =', y_test)
# 正当率
result = list(y_pred == y_test).count(True)/len(y_test)
print('正当率=', result)
# 分類が間違ったデータを表示
for i in range(30):
if y_pred[i] != y_test[i]:
print(i+1,' 誤判定:', x_test[i], '判定:', y_pred[i],', 正解', y_test[i] )
# irisのデータを1つ入力すると,判定し種類を出力
xdata = x_test[8] # irisデータを一つ取ってくる
print('xdata:', xdata)
clf.predict([xdata]) # clf.predict 識別機clfで予想させる
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(y_test)
print(y_pred)
print(cm)
import seaborn as sbn
sbn.heatmap(cm)
# シャフルしない訓練データとテストデータを用意
n = 40
nx_train = np.concatenate([iris.data[0:n], iris.data[50:50+n], iris.data[100: 100+n] ])
nx_test = np.concatenate([iris.data[n:50], iris.data[50+n:100], iris.data[100+n: 150] ])
ny_train = np.concatenate([iris.target[0:n], iris.target[50:50+n], iris.target[100: 100+n] ])
ny_test = np.concatenate([iris.target[n:50], iris.target[50+n:100], iris.target[100+n: 150] ])
ny_test
# SVCアルゴリズムオブジェクト生成し, clf2(classification)とラベル付け
clf2 = svm.SVC(gamma = 'auto') # gamma = 'auto'を指定しないと警告がでる
clf2.fit(nx_train, ny_train)
ny_pred = clf2.predict(nx_test)
print('ny_pred =', ny_pred)
print('iris.target =', ny_test)
# 正当率
result2 = list(ny_pred == ny_test).count(True)/len(ny_test)
print('正当率=', result2)
# 分類が間違ったデータを表示
for i in range(30):
if ny_pred[i] != ny_test[i]:
print(i+1,' 誤判定:', ny_test[i], '判定:', ny_pred[i],', 正解', ny_test[i] )
ny_train # シャフルしていないことを確認