Retrocesso de mínimos quadrados, explicada: um guia visual…

Regressão de mínimos quadrados, explicada: um guia visual...

ALGORITMO DE REGRESSÃO

Deslizando pelos pontos para minimizar quadrados

Rumo à ciência de dados

Quando as pessoas começam a aprender sobre estudo de dados, geralmente começam com a retorno linear. Há uma boa razão para isso – é uma das maneiras mais úteis e diretas de entender porquê funciona a retorno. As abordagens mais comuns para retorno linear são chamadas de “Métodos dos Mínimos Quadrados” – eles funcionam encontrando padrões nos dados, minimizando as diferenças quadradas entre as previsões e os valores reais. O tipo mais essencial é Mínimos Quadrados Ordinários (OLS), que encontra a melhor maneira de traçar uma risco reta através dos seus pontos de dados.

Às vezes, porém, o OLS não é suficiente, mormente quando seus dados têm muitos recursos relacionados que podem tornar os resultados instáveis. É onde Retrocesso de cume entra. A retorno Ridge faz o mesmo trabalho que o OLS, mas adiciona um controle privativo que ajuda a evitar que o protótipo se torne muito sensível a qualquer recurso único.

Cá, examinaremos dois tipos principais de retorno de mínimos quadrados, explorando porquê esses algoritmos deslizam suavemente pelos pontos de dados e veremos suas diferenças na teoria.

Todos os recursos visuais: criados pelo responsável usando Canva Pro. Otimizado para celular; pode parecer superdimensionado na espaço de trabalho.

Sua visita nos ajuda a continuar oferecendo o melhor para você! ns ia py nu nv nw pz ny nz oa qa oc od oe qb og oh oi gn bk">A retorno linear é um método estatístico que prevê valores numéricos usando uma equação linear. Ele modela o relacionamento entre uma variável dependente e uma ou mais variáveis ​​independentes ajustando uma risco reta (ou projecto, em múltiplas dimensões) através dos pontos de dados. O protótipo calcula coeficientes para cada recurso, representando seu impacto no resultado. Para obter um resultado, você insere os valores dos recursos dos seus dados na equação linear para calcular o valor previsto.

Para ilustrar nossos conceitos, usaremos nosso conjunto de dados padrão que prevê o número de golfistas visitantes em um determinado dia. Oriente conjunto de dados inclui variáveis ​​porquê previsão do tempo, temperatura, umidade e condições de vento.

Colunas: ‘Perspectiva’ (codificado para ensolarado, nublado, chuva), ‘Temperatura’ (em Fahrenheit), ‘Umidade’ (em%), ‘Vento’ (Sim/Não) e ‘Número de jogadores’ (numérico , recurso de direcção)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Create dataset
dataset_dict = {
'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny', 'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny', 'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
'Temp.': [85.0, 80.0, 83.0, 70.0, 68.0, 65.0, 64.0, 72.0, 69.0, 75.0, 75.0, 72.0, 81.0, 71.0, 81.0, 74.0, 76.0, 78.0, 82.0, 67.0, 85.0, 73.0, 88.0, 77.0, 79.0, 80.0, 66.0, 84.0],
'Humid.': [85.0, 90.0, 78.0, 96.0, 80.0, 70.0, 65.0, 95.0, 70.0, 80.0, 70.0, 90.0, 75.0, 80.0, 88.0, 92.0, 85.0, 75.0, 92.0, 90.0, 85.0, 88.0, 65.0, 70.0, 60.0, 95.0, 70.0, 78.0],
'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False, True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
'Num_Players': [52, 39, 43, 37, 28, 19, 43, 47, 56, 33, 49, 23, 42, 13, 33, 29, 25, 51, 41, 14, 34, 29, 49, 36, 57, 21, 23, 41]
}

df = pd.DataFrame(dataset_dict)

# One-hot encode 'Outlook' column
df = pd.get_dummies(df, columns=['Outlook'],prefix='',prefix_sep='')

# Convert 'Wind' column to binary
df['Wind'] = df['Wind'].astype(int)

# Split data into features and target, then into training and test sets
X, y = df.drop(columns='Num_Players'), df['Num_Players']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=False)

Embora não seja obrigatório, para usar efetivamente a retorno linear – incluindo a retorno de cume – podemos padronizar primeiro os recursos numéricos.

A graduação padrão é aplicada a ‘Temperatura’ e ‘Umidade’ enquanto a codificação one-hot é aplicada a ‘Outlook’ e ‘Vento’
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer

# Create dataset
data = {
'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny',
'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny',
'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
'Temperature': [85, 80, 83, 70, 68, 65, 64, 72, 69, 75, 75, 72, 81, 71, 81, 74, 76, 78, 82,
67, 85, 73, 88, 77, 79, 80, 66, 84],
'Humidity': [85, 90, 78, 96, 80, 70, 65, 95, 70, 80, 70, 90, 75, 80, 88, 92, 85, 75, 92,
90, 85, 88, 65, 70, 60, 95, 70, 78],
'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False,
True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
'Num_Players': [52, 39, 43, 37, 28, 19, 43, 47, 56, 33, 49, 23, 42, 13, 33, 29, 25, 51, 41,
14, 34, 29, 49, 36, 57, 21, 23, 41]
}

# Process data
df = pd.get_dummies(pd.DataFrame(data), columns=['Outlook'])
df['Wind'] = df['Wind'].astype(int)

# Split data
X, y = df.drop(columns='Num_Players'), df['Num_Players']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=False)

# Scale numerical features
numerical_cols = ['Temperature', 'Humidity']
ct = ColumnTransformer([('scaler', StandardScaler(), numerical_cols)], remainder='passthrough')

# Transform data
X_train_scaled = pd.DataFrame(
ct.fit_transform(X_train),
columns=numerical_cols + [col for col in X_train.columns if col not in numerical_cols],
índice=X_train.índice
)

X_test_scaled = pd.DataFrame(
ct.transform(X_test),
columns=X_train_scaled.columns,
índice=X_test.índice
)

A retorno linear prevê números criando uma risco reta (ou hiperplano) a partir dos dados:

  1. O protótipo encontra a melhor risco fazendo com que as lacunas entre os valores reais e os valores previstos da risco sejam tão pequenas quanto provável. Isso é chamado de “mínimos quadrados”.
  2. Cada ingressão recebe um número (coeficiente/peso) que mostra o quanto ela altera a resposta final. Há também um número inicial (interceptação/viés) que é usado quando todas as entradas são zero.
  3. Para prever uma novidade resposta, o protótipo pega cada ingressão, multiplica-a pelo seu número, soma tudo isso e adiciona o número inicial. Isso lhe dá a resposta prevista.
Sua visita nos ajuda a continuar oferecendo o melhor para você! https://miro.medium.com/v2/resize:fit:786/1*ycpFoYTIl7Aan2UGSAK6fQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*ycpFoYTIl7Aan2UGSAK6fQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*ycpFoYTIl7Aan2UGSAK6fQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*ycpFoYTIl7Aan2UGSAK6fQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/>

Vamos estrear com os Mínimos Quadrados Ordinários (OLS) — a abordagem fundamental para a retorno linear. O objetivo do OLS é encontrar a reta mais adequada através de nossos pontos de dados. Fazemos isso medindo o quão “erradas” nossas previsões estão em conferência com os valores reais e, em seguida, encontrando a risco que torna esses erros tão pequenos quanto provável. Quando dizemos “erro”, queremos manifestar a intervalo vertical entre cada ponto e a nossa reta – por outras palavras, quão longe estão as nossas previsões da veras. Vamos ver primeiro o que aconteceu no caso 2D.

Em caso 2D

No caso 2D, podemos imaginar o algoritmo de retorno linear assim:

Cá está a explicação do processo supra:

1. Começamos com um conjunto de treinamento, onde cada risco possui:
· x : nosso recurso de ingressão (os números 1, 2, 3, 1, 2)
· sim : nossos valores intuito (0, 1, 1, 2, 3)

2. Podemos simbolizar esses pontos em um gráfico de dissipação e queremos encontrar uma risco sim = b₀ + bx que melhor se adapta a esses pontos

3. Para qualquer risco (qualquer b₀ e b₁), podemos medir o quão bom é:
· Calculando a intervalo vertical (d₁, d₂, d₃, d₄, d₅) de cada ponto até a risco
· Essas distâncias são |sim – (b₀ + bx)| para cada ponto

4. Nosso objetivo de otimização é encontrar b₀ e b₁ que minimizam a soma das distâncias quadradas: d₁² + d₂² + d₃² + d₄² + d₅². Na notação vetorial, isso é escrito porquê ||sim ||², onde X = [1 x] contém nossos dados de ingressão (com 1 para a interceptação) e b = [ββ₁]ᵀ contém nossos coeficientes.

5. A solução ótima tem forma fechada: b = (XX)⁻¹XSim. Calculando isso obtemos b₀ = -0,196 (interceptação), b₁ = 0,761 (inclinação).

Essa notação vetorial torna a fórmula mais compacta e mostra que estamos realmente trabalhando com matrizes e vetores em vez de pontos individuais. Veremos mais detalhes do nosso operação a seguir no caso multidimensional.

Em caso multidimensional (📊 conjunto de dados)

Novamente, o objetivo do OLS é encontrar coeficientes (b) que minimizam as diferenças quadradas entre nossas previsões e os valores reais. Matematicamente, expressamos isso porquê minimizando ||sim||², onde X é a nossa matriz de dados e sim contém nossos valores intuito.

O processo de treinamento segue estas etapas principais:

Lanço de treinamento

1. Prepare nossa matriz de dados X. Isso envolve aditar uma pilastra de uns para contabilizar o termo de polarização/interceptação (b₀).

2. Em vez de procurar iterativamente os melhores coeficientes, podemos calculá-los diretamente usando a equação normal:
b = (XX)⁻¹Xsim

onde:
· b é o vetor de coeficientes estimados,
· X é a matriz do conjunto de dados (incluindo uma pilastra para a interceptação),
· sim é o rótulo,
· Xᵀ representa a transposta da matriz X,
· ⁻¹ representa o inverso da matriz.

Vamos decompô-lo:

um. Nós multiplicamos Xᵀ (X transpor) por Xnos dando uma matriz quadrada

b. Calculamos o inverso desta matriz

c. Nós calculamos Xsim

d. Nós multiplicamos (XX)⁻¹ e Xsim para obter nossos coeficientes

Lanço de teste

Logo que tivermos nossos coeficientes, fazer previsões é simples: simplesmente multiplicamos nosso novo ponto de dados por esses coeficientes para obter nossa previsão.

Na notação matricial, para um novo ponto de dados x*, a previsão sim* é calculado porquê
sim* = x*b = [1, x₁, x₂, …, xₚ] × [β₀, β₁, β₂, …, βₚ]ᵀ,
onde b₀ é a interceptação e b₁ através bₚ são os coeficientes para cada recurso.

Lanço de avaliação

Podemos fazer o mesmo processo para todos os pontos de dados. Para nosso conjunto de dados, cá está também o resultado final com o RMSE.

Agora, vamos considerar a retorno de Ridge, que se baseia no OLS, abordando algumas de suas limitações. O principal insight da retorno de Ridge é que às vezes a solução ideal de OLS envolve coeficientes muito grandeso que pode levar ao sobreajuste.

Ridge Regression adiciona um termo de penalidade (eu||b||²) para a função objetivo. Oriente termo desencoraja coeficientes grandes, adicionando seus valores quadrados ao que estamos minimizando. O objetivo completo passa a ser:

min ||simXβ||² + λ||b||²

O eu O parâmetro (lambda) controla o quanto penalizamos coeficientes grandes. Quando eu = 0, obtemos MQO; porquê eu aumenta, os coeficientes diminuem para zero (mas nunca o alcançam).

Lanço de treinamento

  1. Assim porquê OLS, prepare nossa matriz de dados X. Isso envolve aditar uma pilastra de uns para contabilizar o termo de interceptação (b₀).
  2. O processo de treinamento para Ridge segue um padrão semelhante ao OLS, mas com uma modificação. A solução de forma fechada torna-se:
    b = (XX+λI)⁻¹Xsim

onde:
· EU é a matriz identidade (com o primeiro elemento, correspondendo a b₀, às vezes definido porquê 0 para excluir a interceptação da regularização em algumas implementações),
· λ é o valor de regularização.
· S é o vetor de valores de variáveis ​​​​dependentes observadas.
· Outros símbolos permanecem conforme definidos na seção OLS.

Sua visita nos ajuda a continuar oferecendo o melhor para você! od oe of og oh oi gn bk">Vamos decompô-lo:

um. Nós adicionamos eueu para XX. O valor de eu pode ser qualquer número positivo (digamos 0,1).

b. Calculamos o inverso desta matriz. Os benefícios de aditar λI a XX antes da inversão são:
· Torna a matriz invertível, mesmo que XX não é (resolvendo um problema numérico chave com OLS)
· Reduz os coeficientes proporcionalmente para eu

c. Nós multiplicamos (XX+ eu)⁻¹ e Xsim para obter nossos coeficientes

Lanço de teste

O processo de previsão permanece o mesmo do OLS – multiplique os novos pontos de dados pelos coeficientes. A diferença reside nos próprios coeficientes, que são tipicamente menores e mais estáveis ​​do que os seus homólogos MQO.

Lanço de avaliação

Podemos fazer o mesmo processo para todos os pontos de dados. Para nosso conjunto de dados, cá está também o resultado final com o RMSE.

Observações Finais: Escolhendo entre OLS e Ridge

A escolha entre OLS e Ridge geralmente depende dos seus dados:

  • Use OLS quando tiver dados muito comportados com pouca multicolinearidade e amostras suficientes (em relação aos recursos)
  • Use Ridge quando você tiver:
    – Muitos recursos (em relação às amostras)
    – Multicolinearidade em seus recursos
    – Sinais de overfitting com OLS

Com Ridge, você precisará escolher eu. Comece com um pausa de valores (geralmente espaçados logaritmicamente) e escolha aquele que oferece o melhor desempenho de validação.

Aparentemente, o valor padrão λ = 1 fornece o melhor RMSE para nosso conjunto de dados.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LinearRegression
from sklearn.metrics import root_mean_squared_error
from sklearn.linear_model import Ridge

# Create dataset
data = {
'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny',
'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny',
'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
'Temperature': [85, 80, 83, 70, 68, 65, 64, 72, 69, 75, 75, 72, 81, 71, 81, 74, 76, 78, 82,
67, 85, 73, 88, 77, 79, 80, 66, 84],
'Humidity': [85, 90, 78, 96, 80, 70, 65, 95, 70, 80, 70, 90, 75, 80, 88, 92, 85, 75, 92,
90, 85, 88, 65, 70, 60, 95, 70, 78],
'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False,
True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
'Num_Players': [52, 39, 43, 37, 28, 19, 43, 47, 56, 33, 49, 23, 42, 13, 33, 29, 25, 51, 41,
14, 34, 29, 49, 36, 57, 21, 23, 41]
}

# Process data
df = pd.get_dummies(pd.DataFrame(data), columns=['Outlook'], prefix='', prefix_sep='', dtype=int)
df['Wind'] = df['Wind'].astype(int)
df = df[['sunny','overcast','rain','Temperature','Humidity','Wind','Num_Players']]

# Split data
X, y = df.drop(columns='Num_Players'), df['Num_Players']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=False)

# Scale numerical features
numerical_cols = ['Temperature', 'Humidity']
ct = ColumnTransformer([('scaler', StandardScaler(), numerical_cols)], remainder='passthrough')

# Transform data
X_train_scaled = pd.DataFrame(
ct.fit_transform(X_train),
columns=numerical_cols + [col for col in X_train.columns if col not in numerical_cols],
índice=X_train.índice
)

X_test_scaled = pd.DataFrame(
ct.transform(X_test),
columns=X_train_scaled.columns,
índice=X_test.índice
)

# Initialize and train the model
#model = LinearRegression() # Option 1: OLS Regression
model = Ridge(alpha=0.1) # Option 2: Ridge Regression (alpha is the regularization strength, equivalent to λ)

# Fit the model
model.fit(X_train_scaled, y_train)

# Make predictions
y_pred = model.predict(X_test_scaled)

# Calculate and print RMSE
rmse = root_mean_squared_error(y_test, y_pred)
print(f"RMSE: {rmse:.4f}")

# Additional information about the model
print("nModel Coefficients:")
print(f"Intercept : {model.intercept_:.2f}")
for feature, coef in zip(X_train_scaled.columns, model.coef_):
print(f"{feature:13}: {coef:.2f}")

Tags:

Crédito: Manadeira Original

Adriano Pina

Adriano Pina

Análise de Sistemas | SEO e Google Ads | Fundador da Loja Script PHP Aqui & Marca Shoslh de tecnologia

Especialista em transformar ideias em soluções digitais e acelerar o crescimento online.

Deixe um comentário

Tem perguntas? Nos envia sua mensagem 24/7!

(17) 99100-0874

Endereço & Contato

Centro, Interior de São Paulo
E-mail: [email protected]

Links Úteis
BAIXAR APP | SCRIPT PHP AQUI
Certificados
0
    0
    Seu carrinho
    Seu carrinho está vazio

    Usamos cookies para garantir que oferecemos a melhor experiência em nosso site. 

       

    X

    Clique em um de nossos representantes abaixo para conversar no WhatsApp ou envie um email para: 📧 [email protected]

    Precisa de ajuda fale conosco?