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

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

ただいまの
回答率

90.98%

  • Python

    5588questions

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

  • NumPy

    320questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

ValueError: bad input shape (11, 12)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 592
退会済みユーザー

退会済みユーザー

ValueError: bad input shape (11, 12)とエラーが出ました。
現在、犬の鳴き声と猫の鳴き声を分類するシステムを作っています。
index.pyには

# coding:utf-8
from sklearn import svm, cross_validation
from sklearn.metrics import classification_report, accuracy_score
import sys
from mfcc import *
import glob
import csv
import random
import numpy as np
import os
from sklearn.model_selection import train_test_split

if __name__ == "__main__":
        train_label = np.array([])
        test_label = np.array([])

        nfft = 2048  # FFTのサンプル数
        nceps = 12  # MFCCの次元数
        train_data = np.empty((0, 12), float)
        test_data = np.empty((0, 12), float)

        basedir = '/sound_animal/sounds'
        files = glob.glob(os.path.join(basedir, '*.wav'))
        for file_name in files:
                feature = get_feature(file_name, nfft, nceps)
                if len(train_data) == 0:
                    train_data = feature
                else:
                    train_data = np.vstack((train_data, feature))
                train_label = np.append(train_label,file_name)

                feature = get_feature(file_name, nfft, nceps)
                if len(test_data) == 0:
                    test_data = feature
                else:
                    test_data = np.vstack((test_data, feature))

                test_label = np.append(test_label,file_name)

        feature_train_data = np.hstack((train_label.reshape(len(train_label), 1), train_data))
        feature_test_data = np.hstack((test_label.reshape(len(test_label), 1), test_data))

        with open("feature_data/train_data.txt", "w") as f:
           writer = csv.writer(f)
           writer.writerows(feature_train_data)
        with open("feature_data/test_data.txt", "w") as f:
           writer = csv.writer(f)
           writer.writerows(feature_train_data)

        X_train, X_test, y_train, y_test = train_test_split(train_data, test_data, test_size=0.30, random_state=1)
        clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
        score = clf.score(X_test, y_test)

        print(score)


と書きました。

Tracebackには

Traceback (most recent call last):
  File "sound.py", line 57, in <module>
    clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 151, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 526, in check_X_y
    y = column_or_1d(y, warn=True)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 562, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (11, 12)


と出ました。

        print(len(X_train))
        print(len(X_test))
        print(len(y_train))
        print(len(y_test))


と長さを見たら

11
5
11
5


と出て12が何の次元数なのかわかりません。
しかし、

clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)


のfitの2つの引数が同じ次元数でなければいけないという決まりはないと思うのですが。。。
どのようにこのエラーを直せば良いのでしょうか?
http://webdatareport.hatenablog.com/entry/2016/11/06/161304 のサイトを参考にしてコードを書きました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rkhs

    2017/11/05 23:39 編集

    print(train_data.shape) とprint(train_label.shape)の結果をそのままはカット・アンド・ペーストしてください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/05 23:42

    すみません、違うものをprintoutしていました

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/05 23:42

    print(train_data.shape) は(16, 12) で、print(train_label.shape)は(16,) です

    キャンセル

回答 1

checkベストアンサー

0

clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
score = clf.score(X_test, y_test)

clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label)
score = clf.score(test_data, test_label)

に変更して実行してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/06 18:54

    ありがとうございます。そのように書くと、ValueError: Input contains NaN, infinity or a value too large for dtype('float64')とエラーが出ました。

    キャンセル

  • 2017/11/06 18:55

    Tracebackには
    Traceback (most recent call last):
    File "sound.py", line 57, in <module>
    clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 151, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 521, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 407, in check_array
    _assert_all_finite(array)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 58, in _assert_all_finite
    " or a value too large for %r." % X.dtype)
    と出ました。

    キャンセル

  • 2017/11/06 18:55

    何が問題なのでしょうか?

    キャンセル

  • 2017/11/06 19:04

    train_dataとtrain_labelの中身をそれぞれ表示してもらえますか?

    キャンセル

  • 2017/11/06 19:45

    train_dataは、
    [[ -1.34511761e+00 -2.38376940e+00 8.55887456e-01 -3.34233716e-01
    4.09830385e-01 -1.26968368e-01 2.80116233e-01 -4.01854702e-02
    2.07127434e-01 -2.77927944e-02 1.44921185e-01 -2.03852889e-02]
    [ -8.37164603e-01 -2.32675833e+00 4.91961391e-01 -8.64199314e-01
    4.30148248e-01 2.98685793e-02 2.56327762e-01 -2.38070835e-01
    1.42146579e-01 -7.77328333e-02 1.13084595e-01 -3.54721644e-02]
    [ -inf nan nan nan
    nan nan nan nan
    nan nan nan nan]
    [ -1.58508047e+00 -1.74423917e+00 8.76718724e-01 -4.80333810e-01
    3.66117136e-01 5.59373605e-02 3.04557016e-01 -6.33487997e-02
    2.13038023e-01 -3.94093561e-02 1.97685360e-01 -7.74664032e-02]
    [ -1.12700938e+00 -1.58050459e+00 7.93471237e-02 -1.06811149e+00  ・・・

    キャンセル

  • 2017/11/06 19:47

    train_label は、
    [ '/Users/xxx/Desktop/sounds/dog1.wav'
    '/Users/xxx/Desktop/sounds/dog2.wav'
    '/Users/xxx/Desktop/sounds/cat1.wav' ・・・ のように出ました。train_dataは周波数のデータでtrain_labelは音声のファイ名であると考えられます

    キャンセル

  • 2017/11/06 20:23

    原因
    (1)train_dataにnanやinfが入っている.
    (2)train_labelがbinaryデータ(犬なら0,猫なら1のように)なっていない。
    対策
    (1)get_featureにきちんと音声データを渡しているか確認する。
    (2) train_labelを音声データのファイル名ではなく、0や1で置き換える。

    最後に質問です。
    train_data,test_dataを作ったにもかかわらず、なぜ
    X_train, X_test, y_train, y_test = train_test_split(train_data, test_data, test_size=0.30, random_state=1)
    を実行する必要があるのですか?

    キャンセル

  • 2017/11/06 21:20

    ありがとうございます。X_train, X_test, y_train, y_test = train_test_split(train_data, test_data, test_size=0.30, random_state=1)とtrain_data,test_dataを作ったコードは意味的に重複していますか?

    キャンセル

  • 2017/11/06 21:29

    train_test_splitは、データを学習用データとテスト用データに分けるためのものです。
    今回は、学習用データ(train_data,train_label),テスト用データ( test_data,test_label)をそれぞれ個別に作成しているので、train_data,train_labelを学習用とテスト用にわける必要はありません。

    もし仮に、train用のデータ(train_data,train_label)をtrain_test_splitで"敢えて"分けることを望まれるなら
    train_test_splitの2番めの引数は、train_labelとするべきです。

    キャンセル

  • 2017/11/06 21:31

    なるほどです!ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    5588questions

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

  • NumPy

    320questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。