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

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

ただいまの
回答率

87.34%

KFoldでのTypeError: __init__() got multiple values for argument 'n_splits'の解決策

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,533
退会済みユーザー

退会済みユーザー

質問内容

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2019/09/16 20:52

    エラーメッセージは全文掲載された方が良いです。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/09/16 21:00

    承知しました!

    キャンセル

回答 1

checkベストアンサー

+2

ドキュメント(scikit-learn v0.21.3)によると

class sklearn.model_selection.KFold(n_splits=’warn’, shuffle=False, random_state=None)

となっています。

n_splitsの前に引数があるのがNGなのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/17 12:34

    ありがとうございます!
    前バージョンのKFoldだと勘違いしていました!
    解決しました!

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る