서론
검색창에 AutoML을 검색하면, 잘 만들어진 프레임워크들이 많습니다.
많은 프레임워크들을 보고 코드의 의도와 구현 방식을 배우는 것이 목표입니다.
AutoSklearnClassifier Source
원본은 아래 공식 홈페이지에서 확인할 수 있습니다.
APIs — AutoSklearn 0.14.7 documentation
Classification metrics Note: The default autosklearn.metrics.f1, autosklearn.metrics.precision and autosklearn.metrics.recall built-in metrics are applicable only for binary classification. In order to apply them on multilabel and multiclass classification
automl.github.io
[AutoML] 구현을 향해, AutoSklearnClassifeir.fit(2) - 5편
AutoSklearnClassifier.fit 메서드
class AutoSklearnClassifier(AutoSklearnEstimator, ClassifierMixin):
def fit(self, X, y,
X_test=None,
y_test=None,
feat_type=None,
dataset_name=None):
y = convert_if_sparse(y)
target_type = type_of_target(y)
supported_types = ['binary', 'multiclass', 'multilabel-indicator']
if target_type not in supported_types:
raise ValueError("Classification with data of type {} is "
"not supported. Supported types are {}. "
"You can find more information about scikit-learn "
"data types in: "
"https://scikit-learn.org/stable/modules/multiclass.html"
"".format(
target_type,
supported_types
)
)
self.target_type = target_type
super().fit(
X=X,
y=y,
X_test=X_test,
y_test=y_test,
feat_type=feat_type,
dataset_name=dataset_name,
)
self.classes_ = self.automl_.InputValidator.target_validator.classes_
- AutoSklearnClassifier은 AutoSklearnEstimator을 상속받아 fit메서드를 사용 중이기 때문에 AutoSklearnEstimator의 fit메서드를 확인해 보겠음
AutoSklearnEstimator.fit 메서드
class AutoSklearnEstimator(BaseEstimator):
def fit(self, **kwargs):
# Automatically set the cutoff time per task
if self.per_run_time_limit is None:
self.per_run_time_limit = self._n_jobs * self.time_left_for_this_task // 10
if self.automl_ is None:
self.automl_ = self.build_automl()
self.automl_.fit(load_models=self.load_models, **kwargs)
return self
1. per_run_time_limit
- 학습에 필요한 시간제한을 설정
2. build_automl()
- 해당 메서드는 AutoSklearnEstimator 클래스 내부 메서드 이며, 알고리즘을 빌드하는 것으로 추정되며, 확인을 위해 코드를 살펴보겠음
- _get_automl_class()메서드에서 리턴 값으로 automl을 생성하고 있음
class AutoSklearnEstimator(BaseEstimator):
def build_automl(self):
automl = self._get_automl_class()(
temporary_directory=self.tmp_folder,
delete_tmp_folder_after_terminate=self.delete_tmp_folder_after_terminate,
time_left_for_this_task=self.time_left_for_this_task,
per_run_time_limit=self.per_run_time_limit,
initial_configurations_via_metalearning=self.initial_configurations_via_metalearning,
ensemble_size=self.ensemble_size,
ensemble_nbest=self.ensemble_nbest,
max_models_on_disc=self.max_models_on_disc,
seed=self.seed,
memory_limit=self.memory_limit,
include=self.include,
exclude=self.exclude,
resampling_strategy=self.resampling_strategy,
resampling_strategy_arguments=self.resampling_strategy_arguments,
n_jobs=self._n_jobs,
dask_client=self.dask_client,
get_smac_object_callback=self.get_smac_object_callback,
disable_evaluator_output=self.disable_evaluator_output,
smac_scenario_args=self.smac_scenario_args,
logging_config=self.logging_config,
metadata_directory=self.metadata_directory,
metric=self.metric,
scoring_functions=self.scoring_functions,
get_trials_callback=self.get_trials_callback
)
return automl
_get_automl_class()
NotImplementedError 에러
- 이름 그대로 아직 구현되지 않았다는 에러표시임, 이것을 사용하는 개발자에게도 알려주는 역할
- TODO의 역할을 하기도함
- 여기서는 자식 클래스인 AutoSklearnClassfier의 메서들를 사용해 AutoMLClassifier를 리턴 받음
class AutoSklearnEstimator(BaseEstimator):
def _get_automl_class(self):
raise NotImplementedError()
class AutoSklearnClassifier(AutoSklearnEstimator, ClassifierMixin):
def _get_automl_class(self):
return AutoMLClassifier
AutoMLClassifier
- 그렇다면 AutoMLClassifier 인스턴스에 build_automl()에서 초기화하고 사용
- AutoMLClassifier는 AutoML을 상속받아사용 하며 build_automl() 단계에서 받은 파라미터를 사용해 초기화함
- AutoMLClassifier.fit메서드에서 확인할 수 있는 것처럼 return값은 super.fit이기 때문에 AutoML을 확인할 필요가 있음
class AutoMLClassifier(AutoML):
_task_mapping = {
'multilabel-indicator': MULTILABEL_CLASSIFICATION,
'multiclass': MULTICLASS_CLASSIFICATION,
'binary': BINARY_CLASSIFICATION,
}
@classmethod
def _task_type_id(cls, task_type: str) -> int:
return cls._task_mapping[task_type]
@classmethod
def _supports_task_type(cls, task_type: str) -> bool:
return task_type in cls._task_mapping.keys()
def fit(
self,
X: SUPPORTED_FEAT_TYPES,
y: Union[SUPPORTED_TARGET_TYPES, spmatrix],
X_test: Optional[SUPPORTED_FEAT_TYPES] = None,
y_test: Optional[Union[SUPPORTED_TARGET_TYPES, spmatrix]] = None,
feat_type: Optional[List[bool]] = None,
dataset_name: Optional[str] = None,
only_return_configuration_space: bool = False,
load_models: bool = True,
):
return super().fit(
X, y,
X_test=X_test,
y_test=y_test,
feat_type=feat_type,
dataset_name=dataset_name,
only_return_configuration_space=only_return_configuration_space,
load_models=load_models,
is_classification=True,
)
class AutoML(BaseEstimator):
def __init__(self,
time_left_for_this_task,
per_run_time_limit,
temporary_directory: Optional[str] = None,
delete_tmp_folder_after_terminate: bool = True,
initial_configurations_via_metalearning=25,
ensemble_size=1,
ensemble_nbest=1,
max_models_on_disc=1,
seed=1,
memory_limit=3072,
metadata_directory=None,
debug_mode=False,
include: Optional[Dict[str, List[str]]] = None,
exclude: Optional[Dict[str, List[str]]] = None,
resampling_strategy='holdout-iterative-fit',
resampling_strategy_arguments=None,
n_jobs=None,
dask_client: Optional[dask.distributed.Client] = None,
precision=32,
disable_evaluator_output=False,
get_smac_object_callback=None,
smac_scenario_args=None,
logging_config=None,
metric=None,
scoring_functions=None,
get_trials_callback=None
):
AutoML.fit
- 여기가 진짜 학습하는 부분인 것으로 추정되며 다음 포스팅에 자세히 분석할 예정
'코드읽기 > auto-sklearn' 카테고리의 다른 글
[AutoML] 구현을 향해, AutoSklearnClassifier-fit - 4편 (0) | 2022.05.08 |
---|---|
[AutoML] 구현을 향해, AutoSklearn-parameters - 3편 (0) | 2022.05.05 |
[AutoML] 구현을 향해, sklearn-BaseEstimator? 2편 (0) | 2022.04.30 |
[AutoML]구현을 향해, AutoML? 그거 별거 없는거 아닌가? 1편 (0) | 2022.04.16 |