2017-06-06 8 views
0

XGBClassifier(Pythonライブラリxgboost.sklearn)から継承したXGBというクラスを作成しています。 (pythonの継承:新しいクラスが正しく初期化されない

xgb4 = XGB(learning_rate = 0.1, max_depth = 3, colsample_bytree = 1, n_estimators = 1000) 

xgb4.fit(trainData,trainLabel) 

初期化がうまく行くように見えるが、私はフィットを使用しようとする:ここで

from xgboost.sklearn import XGBClassifier 
from balanceSmote import BalanceSmote 
from balance import Balance 


class XGB(XGBClassifier): 

def __init__(self,learning_rate=0.5, max_depth=3,colsample_bytree=0.5,n_estimators=300, 
      frac=None,k_neighbors=None,m_neighbors=None,out_step=None): 

    # These are the additional arguments that are not in XGBClassifier 
    if k_neighbors: 
     self.balancingStrategy = 'smote' 
     self.k_neighbors = k_neighbors 
     self.m_neighbors = m_neighbors 
     self.out_step = out_step 
    elif frac : 
     self.balancingStrategy = 'normal' 
     self.frac = frac 
    else: 
     self.balancingStrategy = 'false' 

    # Utilize the motherClass 
    super(XGB,self).__init__(seed=500, 
         learning_rate = learning_rate, 
         max_depth = max_depth, 
         colsample_bytree = colsample_bytree, 
         n_estimators = n_estimators) 

私のテストコードです:私はのinit機能と、ここで示さフィット1は、書きました)(XGBClassifierから継承されたメソッドです)、私は、パラメータが欠落している私に言って、エラー・メッセージがあります。

File "<ipython-input-3-47344b7fbc76>", line 1, in <module> 
runfile('/Users/celsloaner/Project/SPUDS/code/testSpark.py', wdir='/Users/celsloaner/Project/SPUDS/code') 

File "/anaconda/envs/SPUDS/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 

File "/anaconda/envs/SPUDS/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 

File "/Users/celsloaner/Project/SPUDS/code/testSpark.py", line 50, in <module> 
xgb4.fit(predictor.trainData,predictor.trainLabel) 

File "/anaconda/envs/SPUDS/lib/python3.5/site-packages/xgboost/sklearn.py", line 396, in fit 
xgb_options = self.get_xgb_params() 

File "/anaconda/envs/SPUDS/lib/python3.5/site-packages/xgboost/sklearn.py", line 177, in get_xgb_params 
xgb_params = self.get_params() 

File "/anaconda/envs/SPUDS/lib/python3.5/site-packages/xgboost/sklearn.py", line 169, in get_params 
if params['missing'] is np.nan: 

KeyError: 'missing' 

を問題はマザークラスの内部から来ているが、これらは適切に初期化されていなければなりません。

def get_params(self, deep=False): 
    """Get parameter.s""" 
    params = super(XGBModel, self).get_params(deep=deep) 
    if params['missing'] is np.nan: 
     params['missing'] = None # sklearn doesn't handle nan. see #4725 
    if not params.get('eval_metric', True): 
     del params['eval_metric'] # don't give as None param to Booster 
    return params 

辞書のparamsは明らかに適切XGBClassifierの初期化がXGBの初期化中に呼び出されたときに(存在しない「行方不明」キー)で定義されていません。ここではマザークラス問題の関数です。 問題が何であるか、それを追跡する方法を知っていますか?私は母のクラスのすべてのパラメータを初期化するとき

おかげ

+0

"missing"のようなdict 'params'にエントリがない場合は、アクセスしようとすると' KeyError'が出ます。 params.get( 'missing'、np.nan)がnp.nan: 'eval_metric'の場合と同じです。 – alfasin

+0

この場合、次の条件を修正してください:' 'missing ''はnp.nanです。問題は 'params = super(XGBModel、self).get_params(deep = deep)'で、あなたが望むものを持っていない 'dict'を返しています。 –

+0

私は理解しましたが、なぜですか?その辞書は、マザークラス内で作成され、管理されていますが、私はそれに触れていませんでした。なぜ、それが継承されたクラスで使用される場合、マザークラスによってうまく定義されないのか分かりません。 – Salamandre

答えて

0

まあ、それは母親クラスのコンストラクタは、それらのデフォルト値を持つようになっている場合でも、働いていた:

class XGB(XGBClassifier): 

    def __init__(self,max_depth=3, learning_rate=0.1, 
       n_estimators=100, silent=True, 
       objective="binary:logistic", 
       nthread=-1, gamma=0, min_child_weight=1, 
       max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, 
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, 
       base_score=0.5, seed=0, missing=None, 
       frac=None,k_neighbors=None,m_neighbors=None,out_step=None): 

     if k_neighbors: 
      self.balancingStrategy = 'smote' 
      self.k_neighbors = k_neighbors 
      self.m_neighbors = m_neighbors 
      self.out_step = out_step 
     elif frac : 
      self.balancingStrategy = 'normal' 
      self.frac = frac 
     else: 
      self.balancingStrategy = 'false' 


     super(XGB,self).__init__(max_depth, learning_rate, 
           n_estimators, silent, objective, 
           nthread, gamma, min_child_weight, 
           max_delta_step, subsample, 
           colsample_bytree, colsample_bylevel, 
           reg_alpha, reg_lambda, 
           scale_pos_weight, base_score, seed, missing) 

ない私は理解してくださいここには論理がありますが、常に知っておいてください:)

関連する問題