自作クラスのオブジェクト作成時の挙動と、自身のオブジェクトを表す self
の挙動に関して、
以下の2つの不明点があり解決出来ません。
解決方法を教えて頂きたいですm(__)m
1. 1つ目の不明点(自作クラスのオブジェクト生成時の挙動)
scikit-learn
ライブラリの推定器 estimator の基本クラス sklearn.base.BaseEstimator
,sklearn.base.ClassifierMixin
を多重継承した、
自作クラス class EnsembleLearningClassifier( BaseEstimator, ClassifierMixin ):
を生成する際に、以下のような記述をすると、コンパイルエラーが出てしまう。
エラー内容は、TypeError: 'module' object is not callable
import EnsembleLearningClassifier
ensemble_clf1 = EnsembleLearningClassifier(
classifiers = [ pipe1, pipe2, pipe3 ],
class_labels = [ "Logistic Regression", "Decision Tree", "k-NN" ]
)
以下のようにすると、コンパイルエラーにならない。
import EnsembleLearningClassifier
ensemble_clf1 = EnsembleLearningClassifier.EnsembleLearningClassifier(
classifiers = [ pipe1, pipe2, pipe3 ],
class_labels = [ "Logistic Regression", "Decision Tree", "k-NN" ]
)
2. 2つ目の不明点(自身のオブジェクトを表す self
の挙動)
自作クラス EnsembleLearningClassifier
のオブジェクト作成後、自身のオブジェクトを表す self
の 属性値が classifiers=None
になってしまう。
以下、オブジェクトの生成コード
ensemble_clf1 = EnsembleLearningClassifier.EnsembleLearningClassifier(
classifiers = [ pipe1, pipe2, pipe3 ],
class_labels = [ "Logistic Regression", "Decision Tree", "k-NN" ]
)
以下、 EnsembleLearningClassifier
自作クラスのオブジェクト ensemble_clf1
での、print 関数ensemble_clf1.print("ensemble_clf1")
の実行結果。
オブジェクト生成時に、コンストラクタの引数を classifiers = [ pipe1, pipe2, pipe3 ]
と設定したにも関わらず、自身のオブジェクトを表す self
の 属性値が classifiers=None
になってしまう。
これを classifiers=[ pipe1, pipe2, pipe3 ]
となるように修正したい。
-------------------------------------------------------------------
ensemble_clf1
[Attributes]
__classifiers :
Pipeline(steps=[('sc', StandardScaler(copy=True, with_mean=True, with_std=True)), ('clf', LogisticRegression(C=0.001, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=0, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False))])
Pipeline(steps=[('sc', StandardScaler(copy=True, with_mean=True, with_std=True)), ('clf', DecisionTreeClassifier(class_weight=None,
criterion='entropy', max_depth=3,
max_features=None, max_leaf_nodes=None,
min_impurity_split=1e-07, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=0, splitter='best'))])
Pipeline(steps=[('sc', StandardScaler(copy=True, with_mean=True, with_std=True)), ('clf', KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=3, p=2,
weights='uniform'))])
__n_classifier : 3
__class_labels : ['Logistic Regression', 'Decision Tree', 'k-NN']
__weights : None
__vote_method : majority_vote
[self]
EnsembleLearningClassifier(class_labels=None, classifiers=None, vote=None,
weights=None)
-------------------------------------------------------------------
デバッグ画面:
all_clf[3]
の値が EnsembleLearningClassifier(class_labels=None, classifiers=None, vote=None,weights=None)
となってしまう。
オブジェクト生成時に、コンストラクタの引数を classifiers = [ pipe1, pipe2, pipe3 ]
と設定したにも関わらず、自身のオブジェクトを表す self
の 属性値が classifiers=None
になってしまう。
これを classifiers=[ pipe1, pipe2, pipe3 ]
となるように修正したい。
<実装中のコード>
以下のリンク先(GitHub)の
main2.py
,EnsembleLearningClassifier.py
ファイル
https://github.com/Yagami360/MachineLearning_Samples_Python/tree/master/EnsembleLearning_scikit-learn
<参考URL>
scikit-learn ライブラリ
開発者向け情報 :
http://scikit-learn.org/stable/developers/contributing.html#rolling-your-own-estimator
sklearn.base
モジュールの API Reference
sklearn.base
:
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.base
sklearn.base.BaseEstimator
:
http://scikit-learn.org/stable/modules/generated/sklearn.base.BaseEstimator.html#sklearn.base.BaseEstimator