Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como implementar o modelo de regressão conhecido como Partial Least Squares (PLSR) em python?

+1 voto
117 visitas
perguntada Jun 9, 2016 em Aprendizagem de Máquinas por CaioP (21 pontos)  

Como exemplo de dados a utilizar, considere a base "4.6 Detergent data" do link 1

Compartilhe

1 Resposta

0 votos
respondida Jun 9, 2016 por CaioP (21 pontos)  
editado Jun 9, 2016 por CaioP

A regressão PLSR pode ser entendida como uma variação da técnica conhecida como Principal Component Regression (PCR), que consiste em encontrar uma combinação linear das variáveis explicativas de modo que a sua matriz de variância-covariância seja diagonal - sendo assim uma aplicação do Teorema da Decomposição Espectral. A grande diferença é o uso de informações sobre a variável explicada na obtenção da combinação linear a ser utilizada na regressão. Mais detalhes sobre a derivação do algoritmo e a interpretação da sua derivação podem ser encontradas em Ng(2013).

O código abaixo é uma transcrição do algoritmo descrito em Friedman, Hastie e Tibshirani (2001) para a implementação da regressão PLSR na base sugerida. Nos argumentos da função construída tem-se a variável dependente (uma de cinco possíveis), dada pela sua ordem (ny = 0-4) e o número de componentes considerados (p). Além disso, cabe mencionar que o código considera os dados como obtidos via uma planilha de Excel cujo endereço no computador é dado por "path".

import numpy as np

import pandas as pd

import statistics

def PLSR_detergente(ny,p):
    df = pd.read_excel("path")
    data = df.as_matrix()
    Y = data[:,0:5]
    X = data[:,5:]
    y = np.zeros((12,p+1))
    y[:,0] = statistics.mean(Y[:,ny])*np.ones((12))
    x = np.zeros((12,p+1))
    z = np.zeros((12,p+1))
    theta = np.zeros(p+1)
    for i in range(1,p+1):
        x[:,i]=X[:,i-1]
    for m in range(1,p+1):
        for j in range(1,p+1):
            z[:,m]=z[:,m]+np.inner(x[:,j],Y[:,ny])*x[:,j]
        theta[m]=np.inner(z[:,m],Y[:,ny])/np.inner(z[:,m],z[:,m])
        y[:,m]=y[:,m-1]+theta[m]*z[:,m]
        for n in range(1,p+1):
            x[:,n]=x[:,n]-(np.inner(z[:,m],x[:,n])/np.inner(z[:,m],z[:,m]))*z[:,m]
    return y[:,p]

Friedman, Jerome, Trevor Hastie, and Robert Tibshirani. The elements of statistical learning. Vol. 1. Springer, Berlin: Springer series in statistics, 2001.

Ng, Kee Siong. "A Simple Explanation of Partial Least Squares." (2013).

...