KFoldでのTypeError: __init__() got multiple values for argument 'n_splits'の解決策
- 評価
- クリップ 0
- VIEW 2,543

退会済みユーザー
質問内容
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.
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
ドキュメント(scikit-learn v0.21.3)によると
class sklearn.model_selection.KFold(n_splits=’warn’, shuffle=False, random_state=None)
となっています。
n_splitsの前に引数があるのがNGなのではないでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
meg_
2019/09/16 20:52
エラーメッセージは全文掲載された方が良いです。
退会済みユーザー
2019/09/16 21:00
承知しました!