質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

993閲覧

手書きデータセットのarrayデータのピクセル変更

Poyoyo

総合スコア6

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/09 13:23

実現したいこと

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はどこからきたのか。

ご教示頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

変換は以下で可能です。

python

1>>> x_50_50 = np.stack([cv2.resize(image, (50,50)) for image in digits.images]) 2>>> print(x_50_50.shape) 3(1797, 50, 50)
  • そうすれば、未知のデータも50x50で読ませることができるはずだからである。その考えを確かめるために下記を試した。

プログラムやアルゴリズムを学ぶためには、不可能に挑戦することも良い経験になります。がんばって、やってみてください。

投稿2021/09/10 08:14

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Poyoyo

2021/09/11 09:06

ありがとうございます。 実現したかったピクセル変更ができました。 今後も頑張ります。
guest

0

投稿2021/09/09 21:51

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Poyoyo

2021/09/11 09:07

ありがとうございます、参考にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問