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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6395questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

多次元データの機械学習用の特徴量データ設定について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 209

yohehe

score 19

 3次元データからのscikitlearn,kerasにおけるサンプル数、特徴量の設定について

プログラミング初心者で不慣れで申し訳ありませんが、失礼します。
センサーで測定したx,y,z軸ごとのデータをarrayデータとしてリストとしたデータを作成しています。そのデータを元にscikitlearnによるMLPclassifierやsvmによる分類、もしくはkerasによるディープラーニングを行いたいと考えています。
現在の手法としまして、取得したデータをnpyデータで読み込み、numpyのアレイデータとしてデータを作成しています。取得データを3軸ごとに200個だとすると、n個のデータを取得したとすると、shapeは(n,3,200)となっています。
こちらのデータをn_samplesとn_featuresにうまく分類する方法はございますでしょうか。
ここに質問の内容を詳しく書いてください。
■■な機能を実装中に以下のエラーメッセージが発生しました。

 発生している問題・エラーメッセージ

現在試している方法だと、dimensionのエラーがでてしまい進むことができないでいます。
エラーメッセージ
Found array with dim 3. Estimator expected <= 2.

 該当のソースコード

file=[]
data1=np.load("filename.npy")
data2=np.load("filename2.npy")
data3=np.load("filename3.npy")
file.append(data1)
file.append(data2)
file.append(data3)
といった方法でデータを整理しております。
(n_samples,n_features[0],n_features[1])=file.shape
scikitlearnだとすると
clf=svm.SVC(C=1.0,kernel="linear",decision_function_shape="ovr")
clf.fit(file,y)
python3

ソースコード
```

 試したこと

pandasのDataFrameでも2次元でないため、同じようにdimensionのエラーがでます。
array[3,200]のデータを1つデータ:特徴量としてみなすことは難しいでしょうか。
ここに問題に対して試したことを記載してください。

 補足情報(FW/ツールのバージョンなど)

python3.6,scikitlearn
ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • hayataka2049

    2018/06/09 10:56

    質問があまり明確でないように感じます。何を入力、何を出力にするようなモデルを学習させたいのですか?

    キャンセル

  • yohehe

    2018/06/09 11:58

    ご返信ありがとうございます。加速度およびジャイロセンサーを用いたデータを取得し、計算したxyz方向のデータを分類をしたいと考えております。出力はsvmやMLPなどの単層・多層分類器にかけて動作を0,1,2などといった数種類のデータに分類をしていきたいと考えております。方法論が正しいかどうかもわからず試行錯誤をしております。何かアドバイスをいただけましたら幸いです。

    キャンセル

  • hayataka2049

    2018/06/09 12:31

    そうすると、3軸のデータが時系列に沿って200個あり、その200個セットで1つの動作と結びつく感じでしょうか。質問文のコードは動作のデータ3つ分を読み込んでいるという理解でよろしいですか

    キャンセル

  • yohehe

    2018/06/09 13:07 編集

    動作データ3つ分ということで間違いありません。試している方法ですと加速度を回転行列にかけ分解したx,y,z軸のデータを1度の測定で200個分取得しております。 x,y,z軸の時系列データを1次元の特徴量としてみなす方法に悩んでおります。

    キャンセル

回答 2

checkベストアンサー

+1

とりあえずはR.Shigemoriさんのおっしゃっているように600次元データとして扱ってみればよいかと。それで性能が出れば意外と簡単なタスクだった、というだけの話です。それで駄目なら、RNN系の手法がありますのでそっちを考えましょう。
ただ、データが2つとか3つでは機械学習を適用するのは厳しいです。分類したい動作の種類ごとに最低でも20~30くらい、できれば50以上はデータがないとしんどいと思いますが、そういったデータはありますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/09 13:41

    RNNという手法を初めて知りました。ありがとうございます。
    現在は10個程度をデータを準備しているのですが、そもそもの取得したデータの形式のところで難渋しておりまして。プログラミングの流れが設定できれば動作データについてはこれから測定で増やしていきたいと考えております。

    キャンセル

  • 2018/06/09 13:47

    (データ数,600)の配列になれば良いのですね。
    np.load("filename.npy").ravel()
    で(600,)
    になる気がするので、それをnp.vstack([data1, data2, ...])とするか、単にnp.array([data1, data2,...])すれば良いです

    キャンセル

  • 2018/06/09 14:01

    ありがとうございます。今から試してみます。
    質問ばかりで申し訳ないのですが、現在RNNについて簡単に調べてみたのですが、x,y,z軸の関係性を1次元とすると時系列の関係性が人間の目からすると壊れてしまう気がいたしますが、機械学習においては1次元データにして問題はないのでしょうか?

    キャンセル

  • 2018/06/09 14:09

    1次元の特徴量みたいになっちゃうので、1次元って言い方はやめた方が良いでしょう。言いたいことはわかりますけど。
    [[x1,y1,z1],[x2,y2,z2],...]が[x1,y1,z1,x2,y2,z2,...]になるということですね。どのデータも同じ変形をするので、大丈夫です。ただし、時系列の情報は捨てていますから、それを利用して分析した方が妥当なら、もっと違う手法を使おう、ということです。

    キャンセル

  • 2018/06/09 14:18

    なるほど、本当に勉強になります。ご教授ありがとうございます。ravel()を使用し、同じ変形をしたデータ配列に設定し今から試してみます。

    キャンセル

  • 2018/06/09 16:38

    ありがとうございます。教えていただきましたやり方で特徴量の設定までできました。これからデータを取りMLPなどで分類してみようと思います。RNNについても勉強してみます。

    キャンセル

  • 2018/06/09 16:56 編集

    とりあえず3動作で30件ずつくらいからやってみると良いでしょう。あと、データが増えると読み込みはforループかなにか使いたいとか考えると、プログラムもだいぶ書き換えないとダメかな・・・(安直に思いつくのは、動作ごとに***.npyを異なるディレクトリに突っ込んで、ディレクトリ以下ファイル名取得→forで回すとかそんなのです。他にもいろいろやりかたはあると思います)
    MLP, SVMあたりはそれなりにパラメタを追い込む必要があるモデルなので、まずはナイーブベイズ(これは本当に何もパラメタ設定しなくても大丈夫)、ランダムフォレスト(n_estimators(決定木の本数)を1000~5000くらいにすれば後は何も設定しなくても大丈夫)あたりから行くことをおすすめします。

    キャンセル

  • 2018/06/09 16:58

    あとは、時系列的に近いデータは相関が強いと思うので、前処理としてPCAでもかければ次元数を落として性能もあげられる気がします。そのへんをベースラインにして、もっと性能がほしいならやっぱりRNNに行く展開かなぁと思います

    キャンセル

  • 2018/06/13 23:35

    アドバイスありがとうございます。いただきましたアドバイスをもとに時間はかかっていますがfor文でのnpyの読み込みを構築し、プログラムを作れるように努力しています。

    キャンセル

+1

n×3×200がn件のデータに対して3×200(例えば、3種類の計測項目について200時間)の特徴量があることを表現しているのであれば、n×600という1件あたり600の特徴量を有するベクトルにしてsvcに投入するとうまくいくはずです。
コードを見るとappendでデータを統合していますが、横軸方向に連結するnumpyの関数を使うとうまくいくと思います。例えば、np.hstackはどうでしょう。これなら、arrayの要素が追加される形で連結するので、最終的にn×600になるはずです

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/09 13:01 編集

    ご返信ありがとうございます。データ取得の際に600の特徴量を有するデータとしてセンサーから取得したデータをreshapeして取得して試しています。不慣れで申し訳ないのですが、svmによる線形分離やMLPなどで処理する際に時系列データを時系列を排除した600の特徴量として処理することは解析上は問題はないのでしょうか?

    教えていただいた方法で試していたのですが、現在のデータ形式でnp.hstackで試してみると
    data1=data1.reshape(1,600)
    data2=data2.reshape(1,600)
    np.hstack((data1,data2))としますとshape(1,1200)となってしまうのですが、やり方が間違ってますでしょうか.ご教授いただけますと幸いです。

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    6395questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。