Regressão de componentes principais em python (passo a passo)


Dado um conjunto de p variáveis preditoras e uma variável de resposta, a regressão linear múltipla usa um método conhecido como mínimos quadrados para minimizar a soma residual dos quadrados (RSS):

RSS = Σ(y i – ŷ i ) 2

Ouro:

  • Σ : Um símbolo grego que significa soma
  • y i : o valor real da resposta para a i-ésima observação
  • ŷ i : O valor da resposta prevista com base no modelo de regressão linear múltipla

No entanto, quando as variáveis preditoras são altamente correlacionadas, a multicolinearidade pode se tornar um problema. Isso pode tornar as estimativas dos coeficientes do modelo pouco confiáveis e exibir alta variância.

Uma maneira de evitar esse problema é usar a regressão de componentes principais , que encontra M combinações lineares (chamadas de “componentes principais”) dos p preditores originais e, em seguida, usa mínimos quadrados para ajustar um modelo de regressão linear usando os componentes principais como preditores.

Este tutorial fornece um exemplo passo a passo de como realizar a regressão de componentes principais em Python.

Passo 1: Importe os pacotes necessários

Primeiro, importaremos os pacotes necessários para realizar a regressão de componentes principais (PCR) em Python:

 import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. preprocessing import scale 
from sklearn import model_selection
from sklearn. model_selection import RepeatedKFold
from sklearn.model_selection import train_test_split
from sklearn. PCA import decomposition
from sklearn. linear_model import LinearRegression
from sklearn. metrics import mean_squared_error

Etapa 2: carregar dados

Neste exemplo, usaremos um conjunto de dados chamado mtcars , que contém informações sobre 33 carros diferentes. Usaremos hp como variável de resposta e as seguintes variáveis como preditores:

  • mpg
  • mostrar
  • merda
  • peso
  • qsec

O código a seguir mostra como carregar e exibir esse conjunto de dados:

 #define URL where data is located
url = "https://raw.githubusercontent.com/Statorials/Python-Guides/main/mtcars.csv"

#read in data
data_full = pd. read_csv (url)

#select subset of data
data = data_full[["mpg", "disp", "drat", "wt", "qsec", "hp"]]

#view first six rows of data
data[0:6]


        mpg disp drat wt qsec hp
0 21.0 160.0 3.90 2.620 16.46 110
1 21.0 160.0 3.90 2.875 17.02 110
2 22.8 108.0 3.85 2.320 18.61 93
3 21.4 258.0 3.08 3.215 19.44 110
4 18.7 360.0 3.15 3.440 17.02 175
5 18.1 225.0 2.76 3.460 20.22 105

Passo 3: Ajustar o modelo PCR

O código a seguir mostra como ajustar o modelo PCR a esses dados. Observe o seguinte:

  • pca.fit_transform(scale(X)) : Isso diz ao Python que cada uma das variáveis preditoras deve ser dimensionada para ter uma média de 0 e um desvio padrão de 1. Isso garante que nenhuma variável preditora tenha muita influência no modelo se isto ocorre. ser medido em unidades diferentes.
  • cv = RepeatedKFold() : diz ao Python para usar a validação cruzada k-fold para avaliar o desempenho do modelo. Para este exemplo escolhemos k = 10 dobras, repetidas 3 vezes.
 #define predictor and response variables
X = data[["mpg", "disp", "drat", "wt", "qsec"]]
y = data[["hp"]]

#scale predictor variables
pca = pca()
X_reduced = pca. fit_transform ( scale (X))

#define cross validation method
cv = RepeatedKFold(n_splits= 10 , n_repeats= 3 , random_state= 1 )

regr = LinearRegression()
mse = []

# Calculate MSE with only the intercept
score = -1*model_selection. cross_val_score (regr,
           n.p. ones ((len(X_reduced),1)), y, cv=cv,
           scoring=' neg_mean_squared_error '). mean ()    
mse. append (score)

# Calculate MSE using cross-validation, adding one component at a time
for i in np. arange (1, 6):
    score = -1*model_selection. cross_val_score (regr,
               X_reduced[:,:i], y, cv=cv, scoring=' neg_mean_squared_error '). mean ()
    mse. append (score)
    
# Plot cross-validation results    
plt. plot (mse)
plt. xlabel ('Number of Principal Components')
plt. ylabel ('MSE')
plt. title ('hp') 

Regressão de componentes principais em Python

O gráfico exibe o número de componentes principais ao longo do eixo x e o teste MSE (erro quadrático médio) ao longo do eixo y.

No gráfico, podemos ver que o MSE do teste diminui ao adicionar dois componentes principais, mas começa a aumentar à medida que adicionamos mais de dois componentes principais.

Assim, o modelo ótimo inclui apenas os dois primeiros componentes principais.

Também podemos usar o código a seguir para calcular a porcentagem de variância na variável de resposta explicada pela adição de cada componente principal ao modelo:

 n.p. cumsum (np. round (pca. explained_variance_ratio_ , decimals= 4 )* 100 )

array([69.83, 89.35, 95.88, 98.95, 99.99])

Podemos ver o seguinte:

  • Utilizando apenas a primeira componente principal, podemos explicar 69,83% da variação da variável resposta.
  • Adicionando o segundo componente principal, podemos explicar 89,35% da variação da variável resposta.

Observe que ainda seremos capazes de explicar mais variância usando mais componentes principais, mas podemos ver que adicionar mais de dois componentes principais não aumenta muito a porcentagem de variância explicada.

Etapa 4: use o modelo final para fazer previsões

Podemos usar o modelo final de PCR de dois componentes principais para fazer previsões sobre novas observações.

O código a seguir mostra como dividir o conjunto de dados original em um conjunto de treinamento e teste e usar o modelo PCR com dois componentes principais para fazer previsões no conjunto de teste.

 #split the dataset into training (70%) and testing (30%) sets
X_train,X_test,y_train,y_test = train_test_split (X,y,test_size= 0.3 , random_state= 0 ) 

#scale the training and testing data
X_reduced_train = pca. fit_transform ( scale (X_train))
X_reduced_test = pca. transform ( scale (X_test))[:,:1]

#train PCR model on training data 
regr = LinearRegression()
reg. fit (X_reduced_train[:,:1], y_train)

#calculate RMSE
pred = regr. predict (X_reduced_test)
n.p. sqrt ( mean_squared_error (y_test, pred))

40.2096

Vemos que o teste RMSE acabou sendo 40,2096 . Este é o desvio médio entre o valor de HP previsto e o valor de HP observado para as observações do conjunto de teste.

O código Python completo usado neste exemplo pode ser encontrado aqui .

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *