#実現したいこと
MNISTの0から9までの数字を分類したのち、各数字がどのように線形分離されているか決定境界線を引いて見える化したい。
具体的には、2と8の二つの数字のみに対し、3次元で境界面、もしくは2次元で境界線を引きたい。
#背景
2と8の分類結果として誤認分類が多かったため、決定境界を可視化することで、2が8の領域、8が2の領域に存在していることを見える化する。
#試したこと
下記コードにて、3次元空間で0から9まで数値を可視化した。
この後、mixtendなどでいじってみたが、境界線を作るところが解決できなかった。
#環境
python3.8.5
python
1import tensorflow as tf 2import tensorflow.keras 3import matplotlib.pyplot as plt 4%matplotlib inline 5from tensorflow.keras.datasets import mnist 6import numpy as np 7 8 9(x_train, y_train), (x_test, y_test) = mnist.load_data() 10x_train = x_train.reshape(60000, 784) 11x_test = x_test.reshape(10000, 784) 12x_train = (x_train / 255.0 * 0.99) + 0.01 13x_test = (x_test / 255.0 * 0.99) + 0.01 14 15from sklearn.model_selection import train_test_split 16from sklearn import datasets, svm, metrics 17from sklearn.metrics import accuracy_score 18 19clf = svm.LinearSVC() 20clf.fit(x_train, y_train) 21 22y_pred = clf.predict(x_test) 23print(accuracy_score(y_test, y_pred)) 24 25#ここから3次元空間でプロットへ 26#下記4行追加修正しました 27all_features = x_test 28teacher_labels = y_test 29from sklearn import decomposition 30from mpl_toolkits.mplot3d import Axes3D 31 32def getcolor(color): 33 if color == 0: 34 return "red" 35 elif color == 1: 36 return "blue" 37 elif color == 2: 38 return "yellow" 39 elif color == 3: 40 return "greenyellow" 41 elif color == 4: 42 return "green" 43 elif color == 5: 44 return "cyan" 45 elif color == 6: 46 return "blue" 47 elif color == 7: 48 return "navy" 49 elif color == 8: 50 return "purple" 51 else: 52 return "black" 53 54#次元削減 55pca = decomposition.PCA(n_components=3) 56three_features = pca.fit_transform(all_features) 57 58#描画 59fig = plt.figure(figsize=(12,9)) 60subfig = fig.add_subplot(111, projection = "3d") 61colors = list(map(getcolor, teacher_labels)) 62subfig.scatter(three_features[:, 0], three_features[:, 1], three_features[:,2], s=50, c=colors, alpha=0.3) 63plt.show() 64
回答1件
あなたの回答
tips
プレビュー