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

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

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

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

Python 3.x

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

Q&A

1回答

1599閲覧

エラー”ValueError: Found array with dim 3. Estimator expected <= 2.” 解決法ご教授お願いします。

ryukaji

総合スコア0

scikit-learn

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

Python 3.x

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

0グッド

0クリップ

投稿2021/04/14 07:18

前提・実現したいこと

pythonにて機械学習プログラムを作成中です。
scikit-learnライブラリのRandomForestClassifierアルゴリズムを
用いてます。
配列と配列の相関関係からデータ群分類(DataGroup1,2…9)とするようなプログラムを
学習をさせている途中で下記のようなエラーが生じました。
読み込みファイル***.csvは1列目:時間、2列目:データA、3列目:データBという構成の
10000行ほどあるデータをスライスして用いてます。

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

raise ValueError("Found array with dim %d. %s expected <= 2."

エラーメッセージ
ValueError: Found array with dim 3. Estimator expected <= 2.

該当のソースコード

import pandas as pd
from sklearn.metrics import accuracy_score
#アルゴリズム
from sklearn.ensemble import RandomForestClassifier

import warnings
warnings.filterwarnings('ignore')

df_n=pd.read_csv('TRAIN.csv').iloc[0:5000,:]
df_1=pd.read_csv('TRAIN_#1.csv').iloc[0:5000,:]
df_2=pd.read_csv('TRAIN_#2.csv').iloc[0:5000,:]
df_3=pd.read_csv('TRAIN_#3.csv').iloc[0:5000,:]
df_4=pd.read_csv('TRAIN_#4.csv').iloc[0:5000,:]
df_5=pd.read_csv('TRAIN_#5.csv').iloc[0:5000,:]
df_6=pd.read_csv('TRAIN_#6.csv').iloc[0:5000,:]
df_7=pd.read_csv('TRAIN_#7.csv').iloc[0:5000,:]
df_8=pd.read_csv('TRAIN_#8.csv').iloc[0:5000,:]

#学習データ入力
in_data=[
[df_n['A'],df_n['B']],
[df_1['A'],df_1['B']],
[df_2['A'],df_2['B']],
[df_3['A'],df_3['B']],
[df_4['A'],df_4['B']],
[df_5['A'],df_5['B']],
[df_6['A'],df_6['B']],
[df_7['A'],df_7['B']],
[df_8['A'],df_8['B']]
]

#学習データ:出力
out_data=['DataGroup1','DataGroup2','DataGroup3','DataGroup4',
'DataGroup5','DataGroup6','DataGroup7','DataGroup8','DataGroup9']

#アルゴリズムの設定
clf=RandomForestClassifier()

#学習
clf.fit(in_data,out_data)

#テストデータ 予測したいデータ

df_Tn=pd.read_csv('TEST.csv').iloc[0:5000,:]
df_T1=pd.read_csv('TEST_#1.csv').iloc[0:5000,:]
df_T2=pd.read_csv('TEST_#2.csv').iloc[0:5000,:]
df_T3=pd.read_csv('TEST_#3.csv').iloc[0:5000,:]
df_T4=pd.read_csv('TEST_#4.csv').iloc[0:5000,:]
df_T5=pd.read_csv('TEST_#5.csv').iloc[0:5000,:]
df_T6=pd.read_csv('TEST_#6.csv').iloc[0:5000,:]
df_T7=pd.read_csv('TEST_#7.csv').iloc[0:5000,:]
df_T8=pd.read_csv('TEST_#8.csv').iloc[0:5000,:]

test_data=[
[df_Tn['A'],df_Tn['B']],
[df_T1['A'],df_T1['B']],
[df_T2['A'],df_T2['B']],
[df_T3['A'],df_T3['B']],
[df_T4['A'],df_T4['B']],
[df_T5['A'],df_T5['B']],
[df_T6['A'],df_T6['B']],
[df_T7['A'],df_T7['B']],
[df_T8['A'],df_T8['B']]
]

#予測
result=clf.predict(test_data)
print("正解:",out_data)
print("予測結果",result)
print("正解率=",accuracy_score(out_data, result))

ソースコード

### 試したこと iloc[0:5000,:]の部分をiloc[4999:5000,:]に変更して試したところ KeyError: 0のエラーメッセージが出ました。 配列と配列の相関関係によるデータ群分類なので要素を一つにしては意味がありませんが エラーの理解のために検証しました。 ### 補足情報(FW/ツールのバージョンなど) 環境 python3.8 scikit-learn 0.23.1

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

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

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

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

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

jbpb0

2021/04/14 17:54

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
jbpb0

2021/04/15 03:23 編集

clf.fit(... の直前に下記を追加して、その結果を見て、考えてみてください print(np.array(in_data).shape) print(np.array(out_data).shape)
ryukaji

2021/04/15 04:09

ご回答ありがとうございます。 下記のように表示されました。 in_dataが3次元なのにout_dataが1次元の場合、計算が出来ないエラーという ことだと理解しました。ルールとしてはin_dataが2次元までの場合、計算可能なのでしょうか? (9, 2, 5000) (9,)
jbpb0

2021/04/15 13:11 編集

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.fit の「fit(X, y, sample_weight=None)」に、Xのshapeは「(n_samples, n_features)」と書かれてますので、2次元ですね A, Bをつなげて、in_dataのshapeを(9, 10000)とすれば、学習はできるようになると思いますが、それで質問者さんがやりたい事に合致するのかは、分かりません
guest

回答1

0

完全に直感で書いてますが、

df_n[["A", "B"]]df_8[["A", "B"]]を縦に結合して(45000, 2)の配列にし、
あと教師ラベルは[x for x in ['DataGroup1','DataGroup2','DataGroup3','DataGroup4', 'DataGroup5','DataGroup6','DataGroup7','DataGroup8','DataGroup9'] for _ in range(5000)] 的なものにすること

が「本当にやるべきこと」だったりしませんか。

投稿2021/04/15 12:14

hayataka2049

総合スコア30933

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

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

ryukaji

2021/04/18 14:58

ご回答ありがとうございます。 教えて頂いたコードを入力し実行しましたが、以下のエラーがでます。 ValueError: cannot copy sequence with size 試しに教師データとテストデータを全くの同一のデータ (45000,2)として検証してます。
hayataka2049

2021/04/18 15:12 編集

さすがにそれだけではわからないです。質問文の更新で情報を追記してください(修正後のコード等。すでに指摘されているmarkdownの反映もやっておいてもらえると読みやすくて助かります)。
jbpb0

2021/04/19 04:11

> 教師データとテストデータを全くの同一のデータ (45000,2) の場合、「clf.fit(in_data,out_data)」の「out_data」も縦に45000個並んでる必要があります すなわち、教師データのサンプル数が45000個で、分類結果を45000個用意する必要があります 質問者さんがやりたいことはそれなんでしょうか? > 配列と配列の相関関係からデータ群分類(DataGroup1,2…9) から、一つのcsvファイルに入ってるA, B(それぞれ5000個の数値)から、一つの分類値が決まる すなわち、教師データのサンプル数はcsvファイル数と同じ9個、だと思ったのですが 勘違いしてますでしょうか?
hayataka2049

2021/04/19 08:45

そっちかもしれません。 その場合、機械学習でやるって考えるとCSVファイルが9つでは足りないのですが。 (それぞれのグループにン百ってサンプルが必要)(nearest centroid classifierは使える可能性がありますが)
ryukaji

2021/04/19 14:12

配列と配列の相関関係からデータ群分類(DataGroup1,2…9) から、一つのcsvファイルに入ってるA, B(それぞれ5000個の数値)から、一つの分類値が決まる すなわち、教師データのサンプル数はcsvファイル数と同じ9個、だと思ったのですが 勘違いしてますでしょうか →やりたい事はお察しの通りこちらです。 5000個のA,B配列の相関から一つの分類を紐付けしたいです。
hayataka2049

2021/04/19 19:29

だとすると私の回答が勘違いだったことになります。 ただ、機械学習のタスクとして成立させるには問題があります。 ・特徴量の抽出方法、または予測モデルを工夫する ・各教師ラベルごとに十分な教師データを用意する はクリアする必要があり、とりあえず今質問者さんが持っているデータをそのままrandom forestで処理するといった楽なアプローチは取れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問