Scikit Learn - Convenções

Os objetos do Scikit-learn compartilham uma API básica uniforme que consiste nas três interfaces complementares a seguir -

  • Estimator interface - É para construir e ajustar os modelos.

  • Predictor interface - É para fazer previsões.

  • Transformer interface - É para converter dados.

As APIs adotam convenções simples e as escolhas de design foram guiadas de maneira a evitar a proliferação de código de estrutura.

Objetivo das Convenções

O objetivo das convenções é garantir que a API siga os seguintes princípios gerais -

Consistency - Todos os objetos, sejam eles básicos ou compostos, devem compartilhar uma interface consistente que é composta por um conjunto limitado de métodos.

Inspection - Os parâmetros do construtor e os valores dos parâmetros determinados pelo algoritmo de aprendizagem devem ser armazenados e expostos como atributos públicos.

Non-proliferation of classes - Os conjuntos de dados devem ser representados como matrizes NumPy ou matriz esparsa Scipy, enquanto os nomes e valores de hiperparâmetros devem ser representados como strings Python padrão para evitar a proliferação de código de estrutura.

Composition - Os algoritmos, quer sejam expressos como sequências ou combinações de transformações dos dados ou naturalmente vistos como meta-algoritmos parametrizados em outros algoritmos, devem ser implementados e compostos a partir de blocos de construção existentes.

Sensible defaults- No scikit-learn, sempre que uma operação requer um parâmetro definido pelo usuário, um valor padrão apropriado é definido. Este valor padrão deve fazer com que a operação seja executada de forma sensata, por exemplo, fornecendo uma solução de linha de base para a tarefa em questão.

Várias Convenções

As convenções disponíveis no Sklearn são explicadas abaixo -

Fundição de tipo

Ele afirma que a entrada deve ser convertida para float64. No exemplo a seguir, em quesklearn.random_projection módulo usado para reduzir a dimensionalidade dos dados, irá explicá-lo -

Example

import numpy as np
from sklearn import random_projection
rannge = np.random.RandomState(0)
X = range.rand(10,2000)
X = np.array(X, dtype = 'float32')
X.dtype
Transformer_data = random_projection.GaussianRandomProjection()
X_new = transformer.fit_transform(X)
X_new.dtype

Output

dtype('float32')
dtype('float64')

No exemplo acima, podemos ver que X é float32 que é lançado para float64 de fit_transform(X).

Parâmetros de reajuste e atualização

Os hiperparâmetros de um estimador podem ser atualizados e reajustados após ter sido construído por meio do set_params()método. Vamos ver o seguinte exemplo para entender isso -

Example

import numpy as np
from sklearn.datasets import load_iris
from sklearn.svm import SVC
X, y = load_iris(return_X_y = True)
clf = SVC()
clf.set_params(kernel = 'linear').fit(X, y)
clf.predict(X[:5])

Output

array([0, 0, 0, 0, 0])

Uma vez que o estimador foi construído, o código acima mudará o kernel padrão rbf para linear via SVC.set_params().

Agora, o código a seguir mudará de volta o kernel para rbf para reajustar o estimador e fazer uma segunda previsão.

Example

clf.set_params(kernel = 'rbf', gamma = 'scale').fit(X, y)
clf.predict(X[:5])

Output

array([0, 0, 0, 0, 0])

Código completo

A seguir está o programa executável completo -

import numpy as np
from sklearn.datasets import load_iris
from sklearn.svm import SVC
X, y = load_iris(return_X_y = True)
clf = SVC()
clf.set_params(kernel = 'linear').fit(X, y)
clf.predict(X[:5])
clf.set_params(kernel = 'rbf', gamma = 'scale').fit(X, y)
clf.predict(X[:5])

Adaptação multiclasse e etiqueta múltipla

No caso de ajuste de várias classes, tanto as tarefas de aprendizado quanto as de previsão dependem do formato dos dados do alvo ajustados. O módulo usado ésklearn.multiclass. Verifique o exemplo abaixo, onde o classificador multiclasse se ajusta a uma matriz 1d.

Example

from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import LabelBinarizer
X = [[1, 2], [3, 4], [4, 5], [5, 2], [1, 1]]
y = [0, 0, 1, 1, 2]
classif = OneVsRestClassifier(estimator = SVC(gamma = 'scale',random_state = 0))
classif.fit(X, y).predict(X)

Output

array([0, 0, 1, 1, 2])

No exemplo acima, o classificador é ajustado em uma matriz dimensional de rótulos multiclasse e o predict()método, portanto, fornece previsão multiclasse correspondente. Mas, por outro lado, também é possível ajustar em uma matriz bidimensional de indicadores de rótulo binários da seguinte maneira -

Example

from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import LabelBinarizer
X = [[1, 2], [3, 4], [4, 5], [5, 2], [1, 1]]
y = LabelBinarizer().fit_transform(y)
classif.fit(X, y).predict(X)

Output

array(
   [
      [0, 0, 0],
      [0, 0, 0],
      [0, 1, 0],
      [0, 1, 0],
      [0, 0, 0]
   ]
)

Da mesma forma, no caso de ajuste de múltiplas etiquetas, uma instância pode receber várias etiquetas da seguinte forma -

Example

from sklearn.preprocessing import MultiLabelBinarizer
y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]]
y = MultiLabelBinarizer().fit_transform(y)
classif.fit(X, y).predict(X)

Output

array(
   [
      [1, 0, 1, 0, 0],
      [1, 0, 1, 0, 0],
      [1, 0, 1, 1, 0],
      [1, 0, 1, 1, 0],
      [1, 0, 1, 0, 0]
   ]
)

No exemplo acima, sklearn.MultiLabelBinarizeré usado para binarizar a matriz bidimensional de rótulos múltiplos para ajustar. É por isso que a função predict () fornece uma matriz 2d como saída com vários rótulos para cada instância.