A interface de um estimador é simples e direta, só precisamos ter métodos que permitem:
Realizar o treinamento recebendo como argumento X e y (dois array-like);
Realizar predição recebendo X (array-like);
Recuperar informações do algoritmo/modelo (e.g., hiperparâmetros e parâmetros);
A serialização de estimadores (e.g., salvamento e carregamento) pode ser implementada por um módulo separado (dentro do pacote de estimadores), de forma que os códigos presentes dentro de um estimador possuam como único objetivo representar o algoritmo.
Vide o exposto, em pseudocódigo temos algo assim:
from __future__ import annotations
from pathlib import Path
from abc import ABC, abstractmethod
import numpy as np
class Estimator(ABC):
"""Essa é a interface básica para um
estimador.
"""
@abstractmethod
def predict(self, X) -> np.ndarray:
"""Realiza a predição utilizando os parâmetros
atuais do modelo.
Args:
X: array-like com formato (n_samples, n_features).
Returns:
NumPy array com as predições para cada amostra.
"""
@abstractmethod
def fit(self, X, y) -> None:
"""Realiza o treinamento do estimador
utilizando as features X com os targets
y.
Args:
X: array-like com formato (n_samples, n_features).
y: array-like com formato (n_samples,).
"""
@property
@abstractmethod
def hyperparameters(self) -> dict:
"""Retorna um dicionário descrevendo
os hiper-parâmetros do estimador.
Returns:
Hiper-parâmetros do estimador.
"""
@property
@abstractmethod
def params(self) -> dict:
"""Retorna um dicionário com os parâmetros
para esse estimador. Os parâmetros retornados
descrevem totalmente o estado do modelo (e,g.
pesos de uma rede, superfícies de decisão, estrutura
da árvore de decisão, etc).
Returns:
Parâmetros do estimador.
"""
A interface de um estimador é simples e direta, só precisamos ter métodos que permitem:
X
ey
(dois array-like);X
(array-like);A serialização de estimadores (e.g., salvamento e carregamento) pode ser implementada por um módulo separado (dentro do pacote de estimadores), de forma que os códigos presentes dentro de um estimador possuam como único objetivo representar o algoritmo.
Vide o exposto, em pseudocódigo temos algo assim: