実現したいこと
scikit-learnに付属の手書き数字データセットの8x8ピクセルを大きいサイズ(ex.50x50ピクセルなど)に変更した上で、SVM学習モデルで実装したい。
試したこと
①下記コードのように、scikit-learn付属の8x8ピクセルの手書き数字データを用いて、SVMで学習モデルを作成した。
Python
1#必要ライブラリを読み込み 2import numpy as np 3import pandas as pd 4import matplotlib.pyplot as plt 5from sklearn import datasets 6 7#データセット読み込み 8digits = datasets.load_digits() 9 10#データを確認 11digits.images.shape 12 #(1797, 8, 8)→1797行の各行に8x8ピクセルのデータがあるということ 13digits.target.shape 14 #(1797,)→1797行1列ということ。ラベルデータ。 15 16#学習に必要なライブラリを読み込み 17from sklearn.model_selection import train_test_split 18from sklearn import datasets, svm, metrics 19from sklearn.metrics import accuracy_score 20 21#説明変数x、正解ラベルy 22x = digits.images 23y = digits.target 24 25#次元削減 26x = x.reshape((-1, 64)) 27x.shape 28 #(1797, 64)→sklearnでは1次元しか受け付けないため、2次元に削減(2次元だが、なぜかsklearnで受け取ってもらえる。理由は不明) 29 30 31x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2) 32 33clf = svm.LinearSVC() 34clf.fit(x_train, y_train) 35 36y_pred = clf.predict(x_test) 37print(accuracy_score(y_test, y_pred)) 38 #0.9527777777777777→正解率95% 39
その後、このモデルを使用して、ペイントで作成した自分のデータ(未知データ)で検証したところ、正解率が40%であった。95%のはずが40%になった推定要因として、自分で用意した未知データを学習モデルに適応する際に8x8ピクセルにしなければならないが、その時にデータが潰れたためと考えた(実際に8x8にした後は、arrayにすると模様が数字の形をしていなかったため)。そのため、scikit-learn付属の8x8ピクセルの手書きデータを8x8から50x50に変更しようとした。そうすれば、未知のデータも50x50で読ませることができるはずだからである。その考えを確かめるために下記を試した。
Python
1#再度x,yを読み込み 2x = digits.images 3y = digits.target 4 5x.shape 6 #(1797, 8, 8) 7import cv2 8type(x) 9 #numpy.ndarray 10 11#50x50ピクセルにしているつもり 12x = cv2.resize(x, (50, 50)) 13x.shape 14 #(50, 50, 8) 15
50x50ピクセルにするために
x = cv2.resize(x, (50, 50))をしたが、x.shapeで(50,50,8)が返ってきた。
質問
①ndarrayの状態でピクセルを変更(今回の場合8x8ピクセルから50x50ピクセルへ変更)する方法は、上記の x = cv2.resize(x, (50, 50))とするのは問題があるか。ある場合、どうしてか。
②返ってきた(50, 50, 8)は、前述の(1797, 8, 8)と比べてイメージしづらい。
(1797, 8, 8)は1797行(データが1797個)あり、各行が8x8ピクセルである。
(50, 50, 8)はどう考えるのか。なぜ、(8, 50, 50)にならないのか。1797個のデータが8個に減ってしまったのか。そもそも50,50はこちらが指定したが、8はどこからきたのか。
ご教示頂けると幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/11 09:06