Conformal Regressor em Python

Gabriel Stankevix
7 min readApr 14, 2022

--

Conceito

Assuma que nos temos as seguintes condições:

Então, começaremos assumindo que temos um conjunto de treinamento que extraímos do espaço. Além disso, temos o que chamamos conjunto de calibração. Portanto, este é apenas um conjunto separado com rótulos que também são extraídos de Z e amostrados independentemente do conjunto de treinamento.

Simplificando, em conformal prediction temos um conjunto de dados de treinamento, calibração e uma função de não conformidade.

Essencialmente, temos dois conjuntos de treinamento desenhados separadamente onde chamamos um de conjunto de treinamento e o outro de conjunto de calibração. O procedimento de modelagem segue os seguintes passos:

Primeiro passo, treinar o modelo de regressão com o conjunto de treinamento. Então, vamos instanciar h em nossa função de não conformidade. Então, dado que sabemos o que é h, podemos aplicar a função f(zi ) em nosso conjunto de calibração. A função f(zi) é aplicada em cada elemento do conjunto de calibração para obter pontuações.

Como o tamanho do conjunto de calibração é igual q, teremos q pontuações de não conformidade.

Classificaremos essas pontuações de não conformidade em ordem decrescente e os valores limítrofes de erros são calculados como:

Fig. 1 — Exemplo ponto de dados

O resultado da predição esta contido em h(x) e ŷ é o nosso rotulo de previsão. Dadas essas as teorias de conformal prediction [1], podemos novamente aplicar o mesmo conceito. A probabilidade de que a saída correta esteja no intervalo de previsão mais ou menos dado um certo limite, é de 0.8 ou 0.6.

Procedimento de treinamento

Então, para realmente construir um modelo de regressão adequado, precisamos seguir os seguintes passos:

  1. Divida os dados de treinamento em dois conjuntos disjuntos. Um destinado para treinamento Z e outro conjunto de calibração Zc
  2. Treine o modelo de regressão h em Zt
  3. Aplique αi = f(zi) = | yi — h(xi ) | para ∀ZiZc
  4. Ordenar , α1, … , αq em ordem decrescente

Suponha que temos um conjunto de dados de treinamento disponível para analise, então como primeira etapa dividimos esses dados em conjunto de treinamento, que usamos para instanciar modelo de regressão h e o um conjunto de calibração. Segundo, treinamos o modelo de regressão h com os dados de treinamento Zt. Terceiro, aplicamos a função f(zi) a todos os elementos do conjunto de calibração. Por fim, classificamos novamente essas pontuações de calibração ( pontuações de não conformidade) em ordem decrescente.

Procedimento de previsão

Então, como primeiro passo, começaremos obtendo o resultado de predição ao aplicar o modelo h em xk+1. Escolheremos algum nível de significância ϵ entre 0 e 1. Portanto, essa é essencialmente nossa probabilidade ou probabilidade de erro desejada ou quanto de erro aceitaremos em nossa previsão.

Em seguida, determinaremos algum valor s que é apenas um valor de ϵ multiplicado por q+1 (arredondado para o número inteiro mais próximo) e isso é essencialmente a pontuação de calibração do quantil ϵ ou pontuação de não conformidade em nosso conjunto de calibração.

Este procedimento esta essencialmente relacionado a nossa figura 1, onde encontramos um valor α em um ponto específico, e este ponto se relaciona com nossa probabilidade de erro desejada definida como ԑ, o resultado é o índice de a pontuação de não conformidade do quantil ԑ.

Desta forma, para gerar uma predição, pegamos o valor da predição real, mais ou menos, o valor α localizado nesse quantil específico, por exemplo, α1 = 0.12. Consequentemente, geramos nossa região de predição Γ ϵ (k+1), que representa o valor de predição mais ou menos esse limiar αs.

O que é interessante notar sobre este processo de predição, então, é que a probabilidade de que o valor de saída correto esteja nesse intervalo de predição, seja de 1 — ԑ, então aqui 1 — ԑ é nosso Γ (gama de confiança) e a previsão.

mplementação

Neste modulo exploratório, vamos utilizar a biblioteca python nonconformist desenvolvida por @donlnz. Esta lib contem uma variedade de modelos derivados do sklearn em python tanto para problemas de regressão como classificação.

Sua instalação é muito simples, basta adicionar o seguinte comando no terminar e aguarda o termino da instalação:

pip install nonconformist

Dataset — Diabetes

Este é um conjunto de dados que contém dados de pacientes diabéticos com algumas features, como IMC, idade, pressão arterial e níveis de glicose, que são úteis para prever a progressão da doença de diabetes em pacientes. Podemos carregar este dataset diretamente da lib do sklearn com load_dataset()

O código abaixo exemplifica como carregar as principais recursos que utilizaremos na nossa prova de conceito.

# Standard modules
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")
# CP modules
from nonconformist.icp import IcpRegressor
from nonconformist.nc import RegressorNc, AbsErrorErrFunc
from sklearn.model_selection import train_test_split
# Dataset
from sklearn.datasets import load_diabetes # Nosso dataset de estudo
# Sklearn regression modules
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LassoLars
from sklearn.tree import DecisionTreeRegressor

Construção de bases

Como ja sabemos, por definição, o procedimento de modelagem para um modelo de conformal prediction, contempla a criação de três bases de dados (treinamento, calibração e teste). Podemos utilizar a função train_test_split() para fazer esse trabalho por nós.

# Criar dataset de treinamento e teste 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
# Criar dataset de calibração
X_calibration, X_test, y_calibration, y_test = train_test_split(X_test, y_test, test_size=0.4, random_state=42)

Construindo modelos de regressão

Construímos uma função chamada train_model(), que de acordo com o parâmetro my_model, determina qual modelo de regressão será utilizado para o nosso processo de predição de diabetes. Uma vez que esse modelo é definido, instanciamos um modelo de regressão não conforme com uma instancia de regressão linear sklearn com uma função de erro. Esta primeira instancia se refere ao parâmetro de entrada para criamos um modelo de indutivo da biblioteca nonconformist. Próximo passo é realizamos o fit do modelo, calibramos sua predição e analisamos os resultados.

def train_model(my_model,X_train, y_train,X_calibration, y_calibration,X_test, y_test):
if my_model == "linear":
model = LinearRegression()
model_title = "Linear Regression"
elif my_model == "decision tree":
model = DecisionTreeRegressor()
model_title = "Decision Tree Regression"
elif my_model == "ridge":
model = Ridge()
model_title = "Decision Tree Regression"

#instancia um modelo de regressão indutivo com uma função para medida de erro
icp = IcpRegressor( RegressorNc(model, AbsErrorErrFunc()))

#treinar o modelo
icp.fit(X_train, y_train)

#calibrar o modelo
icp.calibrate(X_calibration, y_calibration)

# Validar resultados
regression_plot(icp, X_test, y_test, model_title)

Validar CP

É de nosso conhecimento que não podemos saber exatamente como um algoritmo funcionará na prática (o verdadeiro “risco”) porque não sabemos a verdadeira distribuição de dados em que o algoritmo funcionará, mas podemos medir seu desempenho em um conjunto conhecido de dados de treinamento (o risco “empírico”). A taxa de erro ou perda esperada indica o desempenho do algoritmo nas amostras futuras, sendo que o objetivo ela retorne o menor erro possível, mas em geral não sabemos.

Então nos nas imagens abaixo (Fig.2, Fig.3 e Fig.4) estipulamos o menor erro esperado possível conforme cresce o grau de significância para três modelos (Regressão Linear, Arvore de Decisão e Support Vector Regression). O segundo gráfico mede o tamanho da região de predição de acordo com o grau de significância de cada modelo.

Os intervalos da região de predição podem ser visto conforme a tabela abaixo. No exemplo utilizamos um valor de alpha 0.8, o valor de predição para o modelo de regressão linear estará no intervalor de [ 203.99 ate 226.41 ], [ 53.23 ate 75.65 ], [ 219.51 ate 241.93 ] assim por diante para cada ponto de predição.

[
[203.99770568 226.41838156]
[ 53.23276296 75.65343884]
[219.51771926 241.93839513]
[167.57917441 189.99985029]
[149.81200329 172.23267916]
...
]

O erro da predição ( erro empírico) pode ser interpretado como 1 — (Media do erro absoluto da previsão), onde o erro absoluto da previsão é representado por rotulo atual — rotulo predito.

[ 20.07042253521126762,  30.2816901408450704,  40.45070422535211263,  50.5070422535211268,  60.5774647887323944,  7...]

Regressão Linear

Fig.2 — CP Regressão Linear

Arvore de Decisão Regressão

Fig. 3 — CP Arvore de Decisão Regressão

Support Vector Regression

Fig.4 — CP Support Vector Regression

Conclusões

<< Em edição>>

--

--

Gabriel Stankevix

Cientista da Computação, flautista, postcrosser e DIY. Data Science for the win.