🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

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

Python 3.x

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

機械学習

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

Python

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

Q&A

解決済

2回答

8033閲覧

np.hstackでのValueError: all the input arrays must have same number of dimensionsの解決策

退会済みユーザー

退会済みユーザー

総合スコア0

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

NumPy

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

Python 3.x

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2019/09/17 03:30

編集2019/09/17 13:58

質問内容

mainのプログラムを動かしたときに
以下のエラーメッセージの解決策を教えていただきたいです.
何卒よろしくおねがいします.

エラーメッセージ

Traceback (most recent call last): File "ensemble_learning.py", line 199, in <module> kdd_test = np.hstack((kdd_test, kdd_labeled_test)) File "/home/shiomoto-lab/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/numpy/core/shape_base.py", line 340, in hstack return _nx.concatenate(arrs, 1) ValueError: all the input arrays must have same number of dimensions

mainのソースコード

import os import sys #モジュール検索パスを追加 sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../script') #モジュール検索パス対象モジュール群 from kdd_load_2classes import * from dataset_class import * import pandas as pd import numpy as np import re import sklearn import xgboost as xgb # 勾配ブースティング import seaborn as sns # クリエイティブなグラフ import matplotlib.pyplot as plt import plotly.offline as py import plotly.graph_objs as go import plotly.tools as tls # Going to use these 5 base models for the stacking from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier) from sklearn.svm import SVC from sklearn.model_selection import KFold # ################################## # #Load data and create Data loaders # ################################## def load_data(): #"kdd_load_2classes.py"からTrain,Testデータを取得 print('### Loading Data.....###') kdd_label, kdd_data, kdd_label_test, kdd_data_test =kdd_load() #"dataset_class.py"を使用してデータを格納 #各クラスの一定割合をラベル付きデータとする dataset = Dataset(train=(kdd_data, kdd_label), test=(kdd_data_test, kdd_label_test), num_classes = 2,percent = 1.0) print("#labeled----------------: {}".format(dataset.get_num_labeled_data())) print("#unlabeled--------------: {}".format(dataset.get_num_unlabeled_data())) images_labeled, labels = dataset.get_labeled_data() #images_unlabeled, unlabels = dataset.get_unlabeled_data() #unlabels = np.full(len(unlabels), -1) #ラベル無しデータに関してはラベルを-1とする images_test , labels_test = dataset.get_test_data() total = 0 print("#labeledDataCount--------------") #ラベル0,1,それぞれの枚数を表示 for i in range(2): print("{}:{}".format(i,np.sum(labels == i))) total += np.sum(labels == i) print('### Finish Loading ###') return images_labeled, labels, images_test, labels_test #train,testデータの取得 kdd_train, kdd_labeled_train, kdd_test, kdd_labeled_test = load_data() # ##################################### # #Ensembling & Stacking models # ##################################### #スタッキングアンサンブルモデルを作成する ###Helper via Python Classes ''' Pythonで先に学習・予測するためのクラスを定義しておく. ''' # パラメータ ntrain = kdd_train.shape[0] #125973 ntest = kdd_test.shape[0] #22544 SEED = 0 NFOLDS = 1024 # 1024分割 kf = KFold(n_splits=NFOLDS, random_state=SEED) # Sklearn分類機を拡張 class SklearnHelper(object): def __init__(self, clf, seed=0, params=None): params['random_state'] = seed self.clf = clf(**params) def train(self, x_train, y_train): self.clf.fit(x_train, y_train) def predict(self, x): return self.clf.predict(x) def fit(self,x,y): return self.clf.fit(x,y) def feature_importances(self,x,y): print(self.clf.fit(x,y).feature_importances_) ###Out-of-Fold Predictions ''' スタッキングでは,第二モデルの学習データに,第一のベースモデルの予測が使用される. しかし,全ての学習・テストデータを一度に使ってしまうと, ベースモデルが既にテストデータを見た状態にあるため, 第二モデルでオーバーフィットするリスクがある. そのため,交差検証を施す. ''' def get_oof(clf, x_train, y_train, x_test): oof_train = np.zeros((ntrain,)) oof_test = np.zeros((ntest,)) oof_test_skf = np.empty((NFOLDS, ntest)) for i, (train_index, test_index) in kf.split(ntrain): # NFOLDS回まわる x_tr = x_train[train_index] y_tr = y_train[train_index] x_te = x_train[test_index] clf.train(x_tr, y_tr) oof_train[test_index] = clf.predict(x_te) oof_test_skf[i, :] = clf.predict(x_test) oof_test[:] = oof_test_skf.mean(axis=0) return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1) # ##################################### # #Generating our Base First-Level Models # ##################################### ###Parameters ''' パラメータの一部をリストアップする. n_jobs:コア数.-1にすると全てのコア. n_estimators:学習モデルの分類木の数.デフォルトは10. max_depth:木の最大深度.あまりに大きすぎるとオーバーフィットする. verbose:学習プロセス中にテキストを出力するか.0なら出力しない.3なら繰り返し出力する. ''' # 各モデルのパラメータ # Random Forest rf_params = { 'n_jobs': -1, 'n_estimators': 500, 'warm_start': True, #'max_features': 0.2, 'max_depth': 6, 'min_samples_leaf': 2, 'max_features' : 'sqrt', 'verbose': 0 } # Extra Trees et_params = { 'n_jobs': -1, 'n_estimators':500, #'max_features': 0.5, 'max_depth': 8, 'min_samples_leaf': 2, 'verbose': 0 } # AdaBoost ada_params = { 'n_estimators': 500, 'learning_rate' : 0.75 } # Gradient Boosting gb_params = { 'n_estimators': 500, #'max_features': 0.2, 'max_depth': 5, 'min_samples_leaf': 2, 'verbose': 0 } # Support Vector Classifier svc_params = { 'kernel' : 'linear', 'C' : 0.025 } ''' さらに,Helpers via Python Classesで作成したクラスを用いて, 5つの学習モデルのオブジェクトを作成する. ''' # 5つの学習モデルのオブジェクトを作成 rf = SklearnHelper(clf=RandomForestClassifier, seed=SEED, params=rf_params) et = SklearnHelper(clf=ExtraTreesClassifier, seed=SEED, params=et_params) ada = SklearnHelper(clf=AdaBoostClassifier, seed=SEED, params=ada_params) gb = SklearnHelper(clf=GradientBoostingClassifier, seed=SEED, params=gb_params) svc = SklearnHelper(clf=SVC, seed=SEED, params=svc_params) ###Creating NumPy arrays out of our train and test sets ''' ベースモデルへの入力用データをNumPy配列で準備する. ''' kdd_labeled_test = np.reshape(22544,1) #testデータを連結 kdd_test = np.hstack((kdd_test, kdd_labeled_test)) ###Output of the First level Predictions ''' 学習データとテストデータを5つのベースモデルに送り, 交差検証(get_oof関数)を行い,予測を行う. ''' # 5つのベースモデルで予測 et_oof_train, et_oof_test = get_oof(et, kdd_train, kdd_labeled_train, kdd_test) # Extra Trees Classifier rf_oof_train, rf_oof_test = get_oof(rf,kdd_train, kdd_labeled_train, kdd_test) # Random Forest Classifier ada_oof_train, ada_oof_test = get_oof(ada, kdd_train, kdd_labeled_train, kdd_test) # AdaBoost Classifier gb_oof_train, gb_oof_test = get_oof(gb,kdd_train, kdd_labeled_train, kdd_test) # Gradient Boost Classifier svc_oof_train, svc_oof_test = get_oof(svc,kdd_train, kdd_labeled_train, kdd_test) # Support Vector Classifier print("Training is complete") ###Feature importances generated from the different classifiers ''' 予測に関わる特徴の重要度を見る. ''' rf_feature = rf.feature_importances(kdd_train,kdd_labeled_train) et_feature = et.feature_importances(kdd_train,kdd_labeled_train) ada_feature = ada.feature_importances(kdd_train,kdd_labeled_train) gb_feature = gb.feature_importances(kdd_train,kdd_labeled_train)

試したこと

元々(22544,)だったkdd_labeled_testを(22544,1)にreshapeした
kdd_testとkdd_labeled_testをprintした

-----kdd_test----- [[0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [3.4653036e-05 2.0665127e-04 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] ... [0.0000000e+00 8.6811680e-04 6.1771553e-03 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [0.0000000e+00 6.6851680e-07 3.1205258e-05 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00]] -----kdd_labeled_test----- [22544]

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

kdd_testは(22544,122)
Python 3.6.9 :: Anaconda, Inc.

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

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

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

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

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

guest

回答2

0

エラーの原因は連結させるarray(kdd_testとkdd_labeled_test)の形が異なることと思われます。コードなどからkdd_testとkdd_labeled_testはベクトルと推察されますが、各々の要素数が不一致なのではないでしょうか。

解決策としてnumpy.concatenateを使うといいかと思います。ただし、hstackとconcatenateは挙動が異なるので、公式ドキュメントを見て工夫をする必要があると思います

投稿2019/09/17 11:58

編集2019/09/17 12:05
R.Shigemori

総合スコア3376

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

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

0

ベストアンサー

reshapeの引数としてkdd_labeled_testを追加していませんでした。。。
初歩的なミスで申し分けありませんでした。

投稿2019/09/19 03:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問