質問内容
mainのソースコードでの
# パラメータ ntrain = kdd_train.shape[0] #125973 ntest = kdd_test.shape[0] #22544 SEED = 0 NFOLDS = 1024 # 1024分割 kf = KFold(ntrain, n_splits=NFOLDS, random_state=SEED)
で以下のエラーメッセージが表示されます.
データ量の多さが原因なのかなと考えているのですが
詳しい方,解決策を教えていただきたいです.
kaggleのstackingのチュートリアルを参考にしています.
発生している問題・エラーメッセージ
Traceback (most recent call last): File "ensemble_learning.py", line 84, in <module> kf = KFold(ntrain, n_splits=NFOLDS, random_state=SEED) TypeError: __init__() got multiple values for argument 'n_splits'
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 py.init_notebook_mode(connected=True) import plotly.graph_objs as go import plotly.tools as tls import warnings warnings.filterwarnings('ignore') # 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(ntrain, 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 enumerate(kf): # 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配列で準備する. ''' x_kdd_train = kdd_train.values # 学習データ #testデータを連結 kdd_test = kdd_test.append(kdd_labeled_test) x_kdd_test = kdd_test.values #テストデータ ###Output of the First level Predictions ''' 学習データとテストデータを5つのベースモデルに送り, 交差検証(get_oof関数)を行い,予測を行う. ''' # 5つのベースモデルで予測 et_oof_train, et_oof_test = get_oof(et, x_kdd_train, kdd_labeled_train, x_kdd_test) # Extra Trees Classifier rf_oof_train, rf_oof_test = get_oof(rf,x_kdd_train, kdd_labeled_train, x_kdd_test) # Random Forest Classifier ada_oof_train, ada_oof_test = get_oof(ada, x_kdd_train, kdd_labeled_train, x_kdd_test) # AdaBoost Classifier gb_oof_train, gb_oof_test = get_oof(gb,x_kdd_train, kdd_labeled_train, x_kdd_test) # Gradient Boost Classifier svc_oof_train, svc_oof_test = get_oof(svc,x_kdd_train, kdd_labeled_train, x_kdd_test) # Support Vector Classifier print("Training is complete") ###Feature importances generated from the different classifiers ''' 予測に関わる特徴の重要度を見る. ''' rf_feature = rf.feature_importances(x_kdd_train,kdd_labeled_train) et_feature = et.feature_importances(x_kdd_train,kdd_labeled_train) ada_feature = ada.feature_importances(x_kdd_train,kdd_labeled_train) gb_feature = gb.feature_importances(x_kdd_train,kdd_labeled_train)
試したこと
n_splitsの数値を変えた
補足情報(FW/ツールのバージョンなど)
Python 3.6.9 :: Anaconda, Inc.
回答1件
あなたの回答
tips
プレビュー