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の初期化中に呼び出されたときに(存在しない「行方不明」キー)で定義されていません。ここではマザークラス問題の関数です。 問題が何であるか、それを追跡する方法を知っていますか?私は母のクラスのすべてのパラメータを初期化するとき
おかげ
"missing"のようなdict 'params'にエントリがない場合は、アクセスしようとすると' KeyError'が出ます。 params.get( 'missing'、np.nan)がnp.nan: 'eval_metric'の場合と同じです。 – alfasin
この場合、次の条件を修正してください:' 'missing ''はnp.nanです。問題は 'params = super(XGBModel、self).get_params(deep = deep)'で、あなたが望むものを持っていない 'dict'を返しています。 –
私は理解しましたが、なぜですか?その辞書は、マザークラス内で作成され、管理されていますが、私はそれに触れていませんでした。なぜ、それが継承されたクラスで使用される場合、マザークラスによってうまく定義されないのか分かりません。 – Salamandre