Guia para aprendizado de máquina Python do zero (2) - Regressão OLS de aprendizado supervisionado

introduzir

Este blog apresentará 监督学习/Supervised Learning/SLo primeiro branch com exemplos: 回归/Regression.

Preparação antes de começar

Antes de começar, certifique-se de ter os seguintes pacotes em seu ambiente python:
pandas, numpy, sklearn.

Todo o código deste artigo pode ser executado Anacondaem Jupyter Lab.

texto

Primeiro, vamos entender: Por que 回归/Regressioné uma espécie de aprendizagem supervisionada? Qual é a natureza deste problema?

Primeiro precisamos entender a natureza do problema de regressão. Simplificando, a essência do problema de regressão é que, para um mapeamento fff ,
f : R n ↦ R f:\mathbb{R}^n\mapsto \mathbb{R}f:RnR
, temos algum array de sua定义域/Domainsoma对应域/Codomain. Queremos usar esses dados existentes para encontrar um modelo/função de regressão que melhor se ajuste aos dados.

De outra perspectiva, para cada dado, o domínio de definição do mapeamento pode ser entendido como 特征集/Feature Set, e seu domínio correspondente pode ser entendido como 标签集/Label Set. O que procuramos é a função de mapeamento desconhecido, que corresponde àquela do aprendizado de máquina 黑箱模型/Blackbox Model.

Mas para transformar isto num problema de aprendizagem totalmente supervisionado, também precisamos de definir o que queremos otimizar. Como queremos encontrar o mapeamento que melhor se ajusta aos dados, podemos considerar a minimização 误差平方和/Sum of Squared Errors/SSE. Para uma pessoa com mmUm conjunto de dados de m dados e um mapeamento correspondentefff , a soma dos erros quadráticos deste mapeamento para este conjunto de dados é definida como

ℓ = ∑ i = 1 m ( y ( i ) − f ( x ( i ) ) ) 2 \ell = \sum_{i=1}^m \Big(y^{(i)} - f\big({ \bf x}^{(i)}\grande)\Grande)^2=eu = 1eu( você( eu )-f ( x( eu ) ))2

, ou seja, a diferença entre o rótulo verdadeiro de cada dado e o rótulo previsto mapeado é elevada ao quadrado e depois somada. Se considerarmos a soma dos erros quadráticos como aprendizagem supervisionada 损失函数/Loss Function, então este problema de regressão pode ser chamado 普通最小二乘法线性回归问题/OLS Linear Regression. Tudo o que precisamos fazer é encontrar o mapeamento fff , minimizando a soma dos erros quadráticos.

Vamos definir este problema com mais rigor. Seja x {\bf x}x como um conjunto de recursos,w \bf ww é usado como o conjunto de pesos de cada recurso, então para o mapeamento linear
f ( x ; w ) = w T ⋅ x = w 0 x 0 + w 1 x 1 + . . . + wnxnf({\bf x; w }) = {\bf w}^T\cdot{\bf x}=w_0x_0+w_1x_1+...+w_nx_nf ( x ;e )=cTx=c0x0+c1x1+...+cnãoxnão
, a função de perda que queremos minimizar ℓ \ell可定义为:
ℓ ( w ) = ∑ i = 1 m ( y ( i ) − f ( x ( i ) ) ) 2 = ∑ i = 1 n ( y ( i ) − w T ⋅ x ( i ) ) 2 = ∑ i = 1 n ( y ( i ) − y ^ ( i ) ) 2 . \ell({\bf w}) = \sum_{i=1}^m \Big(y^{(i)} - f\big({\bf x}^{(i)}\big)\Big )^2 = \sum_{i=1}^n \Big(y^{(i)} - {\bf w}^T\cdot{\bf x}^{(i)}\Big)^2 = \sum_{i=1}^n \Big(y^{(i)} - \hat{y}^{(i)}\Big)^2.( w )=eu = 1eu( você( eu )-f ( x( eu ) ))2=eu = 1não( você( eu )-cTx( eu ) )2=eu = 1não( você( eu )-sim^( eu ) )2. Em outras palavras ,
a essência da regressão linear sob aprendizagem supervisionada pode ser entendida como um problema de otimização:
w = arg ⁡ min ⁡ w ℓ ( w ). {\bf w} = \arg\min_{ {\bf w} } \ell({\bf w}).c=ar gcmin( C ) .

Então, como podemos encontrar a função de regressão linear mais apropriada?
Em primeiro lugar, este problema tem uma solução única e ótima e pertence ao P/NPproblema P. Somente desse ponto de vista, a regressão linear é um problema relativamente simples e fácil de resolver no mundo do aprendizado de máquina.

O processo de encontrar 普通最小二乘法线性回归问题/OLS Linear Regressiona solução ótima pode ser resolvido contando apenas com alguma álgebra linear. O processo de derivação é relativamente tedioso e complicado, e o blogueiro não o mostrará aqui. Os alunos interessados ​​podem pesquisá-lo por conta própria. Mas a conclusão é que o conjunto de pesos de recursos w ∗ {\bf w}^* que melhor se ajusta aos dados (ou minimiza a soma dos erros quadráticos)c , pode ser obtido pela seguinte multiplicação de matrizes:
w ∗ = ( XTX ) − 1 XTY {\bf w}^* = ({\bf X}^T {\bf X})^{-1}{\bf X }^T{\bf Y}c=( XT X)1 XT Y
, ondeX {\bf X}X é o conjunto de recursos (o tamanho é o tipo de recurso multiplicado pelo número de linhas de dados),Y {\bf Y}Y émmVetor de m elementos (conjunto de rótulos). Para computadores, esse tipo de multiplicação de matrizes é um caso pequeno.

Porém, sem o processo de aprendizagem, ainda será aprendizado de máquina?
Muitos estudantes, inclusive o próprio blogueiro, tiveram esse problema quando estudaram aqui. O modelo não parece ter um processo iterativo e progressivo, mas salta do zero para a solução ótima em uma única etapa. Mas, a rigor, existe um processo de aprendizagem. O modelo obtém o conjunto de recursos e o conjunto de rótulos e usa esses dados para melhorar sua capacidade de generalizar os dados. Embora não haja um passo a passo em direção a um melhor desempenho, o computador ainda aprende as características dos dados de maneira eficaz. Resumindo, a regressão linear também é um tipo de aprendizado de máquina.

Para um conjunto de dados com uma função de regressão desconhecida, se obtivermos a função de regressão ideal (ou seja, minimizar a soma dos erros quadráticos) através do método acima, teremos uma certa capacidade preditiva para novos dados.

Então, quais são os cenários de aplicação da regressão linear?
Existem muitos, como:

  1. Previsão de preço da casa. Se você tiver dados anteriores do mercado imobiliário (como temperatura média anual, média diária de horas de luz do dia, distância até a loja de conveniência mais próxima, etc.) e preços anuais de habitação, e se você acha que os preços da habitação têm uma relação linear (multidimensional) com estes características dos quartos, então você pode usar o OLS para prever os preços dos imóveis.
  2. Análise de estoque. Semelhante aos preços Das casas, algumas características Das existências (tais Como o lucro líquido Da empresa, o horário de abertura, o número de aumentos de limites diários, etc.) são também indicadores importantes DOS preços Das existências. No entanto, deve-se notar que, uma vez que o tempo e alguns dados inalcançáveis ​​(como a probabilidade de o proprietário da empresa pretender falir) têm um grande impacto nos preços das ações, um modelo de regressão linear simples pode não ser adequado para um problema tão complexo como prever ações.
  3. Previsão do valor da vida do cliente (CLV). A receita total que um cliente traz para uma empresa está amplamente ligada ao nível de renda do cliente, idade, consumo médio diário e outras informações. Se houver informações do cliente como um conjunto de recursos e a receita total correspondente da empresa como um conjunto de rótulos, essas informações poderão ser usadas para prever seu CLV.

código

Depois de compreender o princípio, podemos usar python para implementar o algoritmo de aprendizagem de regressão acima.

Primeiro, vamos gerar alguns dados simples.

import numpy as np # 用来进行一些数学运算
import pandas as pd # 用来用数据框的方式储存数据
import matplotlib # 用来画图的
import matplotlib.pyplot as plt
from sklearn import linear_model # 我们需要的模型

# X和Y包含生成的数据。X可以理解为特征/Features,Y可以看作标签/Label
# 我们要做的就是训练一个模型,使它能够通过X准确预测Y的对应值
# coeff包含生成函数所使用的系数
X, Y, coeff = skd.make_regression(n_samples=5000, n_features=2, 
                                  noise=5.0, 
                                  coef=True,
                                  random_state=114514)

print(f"特征集大小为{
      
      X.shape},标签集大小为{
      
      Y.shape}。")
# 特征集大小为(5000,2),标签集大小为(5000,)。

Após gerar os dados, podemos verificar o conteúdo dos dados:

from mpl_toolkits.mplot3d import Axes3D # 一个用来画3D图形的库

fig = plt.figure()
plot3d = fig.gca(projection='3d') # 调用matplotlib的对象
plot3d.view_init(elev=15., azim=35) # 观察角度

x1 = X[:, 0] # 选中X里第0列的所有行
x2 = X[:, 1] # 选中X里第1列的所有行

# 画出数据散点。注意x1,x2,Y的行数要相同
plot3d.scatter3D(x1, x2, Y, c=Y, cmap='Greens', label='Noised Samples');

# 画出真实参考平面
x1min, x1max = int(np.floor(min(x1))), int(np.ceil(max(x1)))
x2min, x2max = int(np.floor(min(x2))), int(np.ceil(max(x2)))
x1plane = np.linspace(x1min, x1max, 2000)
x2plane = np.linspace(x2min, x2max, 2000)
xx1, xx2 = np.meshgrid(range(x1min, x1max), range(x2min, x2max))
x12_coord = np.array([xx1, xx2])
y = coeff[0] * x12_coord[0] + coeff[1] + x12_coord[1]
surf = plot3d.plot_surface(xx1, xx2, y, alpha=0.2, label="True model")

# 给3D图形加上标签
surf._facecolors2d = surf._facecolor3d
surf._edgecolors2d = surf._edgecolor3d 
plot3d.legend()

# 画出坐标轴标签
plot3d.set_xlabel('$x_1$')
plot3d.set_ylabel('$x_2$')
plot3d.set_zlabel('$y$')

plt.show()

Obtemos o seguinte gráfico:
gráficos de modelo
A próxima etapa é sklearntreinar o modelo de regressão linear. O código é muito simples, apenas duas linhas.

# 创造线性回归对象
OLS = linear_model.LinearRegression(fit_intercept=True)

# 训练模型
OLS.fit(X, Y)

Podemos comparar manualmente a diferença entre o modelo real e o modelo treinado:

print('真实模型参数:')
print('\tw0: {:.2f}, w1: {:.2f}, w2: {:.2f}'.format(0, *coeff))
print('训练模型参数:')
print('\tw0: {:.2f}, w1: {:.2f}, w2: {:.2f}'.format(0, *OLS.coef_))
'''
真实模型参数:
	w0: 0.00, w1: 12.56, w2: 7.64
训练模型参数:
	w0: 0.00, w1: 12.58, w2: 7.77
'''

Uma abordagem mais científica e abrangente é usar 交叉验证/Cross-validation. O princípio deste método é: cada vez que os dados são divididos aleatoriamente em um conjunto de treinamento e um conjunto de validação, e então substituídos no modelo para avaliar os erros do modelo durante o treinamento e validação. Matematicamente falando, este método reduz a aleatoriedade da verificação da amostragem aleatória e é uma avaliação mais abrangente do desempenho do modelo. código mostrado abaixo:

from sklearn.model_selection import cross_validate

# 这里的cv指的是把数据分成几份。比如,cv=10就是把数据分成十份,取一份作为验证集,九份作为训练集
cv_results = cross_validate(OLS, X, Y, cv=10, scoring="r2",
                            return_train_score=True)

print('Mean test score: {:.3f} (std: {:.3f})'
      '\nMean train score: {:.3f} (std: {:.3f})'.format(
                                              np.mean(cv_results['test_score']),
                                              np.std(cv_results['test_score']),
                                              np.mean(cv_results['train_score']),
                                              np.std(cv_results['train_score'])))
'''
Mean test score: 0.894 (std: 0.009)
Mean train score: 0.895 (std: 0.001)
'''

Nosso modelo tem uma precisão de validação de 89,4% e uma precisão de treinamento de 89,5%.De modo geral, é um modelo relativamente preciso, sem sobreajuste nem subajuste.

Também podemos usar o modelo treinado para fazer previsões, como:

print(OLS.predict([[42,24]])[0]) # 模型预测结果
print(coeff[0]*42+coeff[1]*24) # 真实值
'''
714.8098105630355
710.6836496552116
'''

Pode-se observar que embora a solução ótima seja garantida, as previsões do modelo ainda não são 100% precisas. A causa deste fenômeno vem do conjunto de dados 随机噪声/Random Noise, ou seja, os dados em si não são 100% consistentes com o seu modelo subjacente. Às vezes podemos reduzir o impacto do ruído no algoritmo. Por exemplo, para processamento de imagens, podemos usá-lo 高斯滤波/Gaussian Filterpara reduzir a interferência do ruído da imagem no algoritmo de aprendizagem.

Conclusão

No próximo blog, o blogueiro apresentará como usar métodos de ML para resolver 分类/Classificationproblemas simples. Se você tiver alguma dúvida ou sugestão, fique à vontade para comentar ou enviar uma mensagem privada. Codificar não é fácil. Se você gosta do conteúdo do blogueiro, curta e apoie!

Acho que você gosta

Origin blog.csdn.net/EricFrenzy/article/details/131298610
Recomendado
Clasificación