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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

1013閲覧

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

yohehe

総合スコア48

Python 3.x

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

0グッド

0クリップ

投稿2018/06/08 15:41

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 ここにより詳細な情報を記載してください。

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

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

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

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

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

hayataka2049

2018/06/09 01:56

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

2018/06/09 02:58

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

2018/06/09 03:31

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

2018/06/09 04:10 編集

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

回答2

0

ベストアンサー

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

投稿2018/06/09 04:26

hayataka2049

総合スコア30933

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

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

yohehe

2018/06/09 04:41

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

2018/06/09 04:47

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

2018/06/09 05:01

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

2018/06/09 05:09

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

2018/06/09 05:18

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

2018/06/09 07:38

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

2018/06/09 07:56 編集

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

2018/06/09 07:58

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

2018/06/13 14:35

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

0

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

投稿2018/06/08 17:09

R.Shigemori

総合スコア3376

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

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

yohehe

2018/06/09 04:02 編集

ご返信ありがとうございます。データ取得の際に600の特徴量を有するデータとしてセンサーから取得したデータをreshapeして取得して試しています。不慣れで申し訳ないのですが、svmによる線形分離やMLPなどで処理する際に時系列データを時系列を排除した600の特徴量として処理することは解析上は問題はないのでしょうか? 教えていただいた方法で試していたのですが、現在のデータ形式でnp.hstackで試してみると data1=data1.reshape(1,600) data2=data2.reshape(1,600) np.hstack((data1,data2))としますとshape(1,1200)となってしまうのですが、やり方が間違ってますでしょうか.ご教授いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問