Regressão linear de aprendizado de máquina

Regressão linear

Prefácio

Precisamos entender que o valor alvo resolvido pelo algoritmo de classificação é um problema discreto; enquanto o algoritmo de regressão resolve o problema do valor alvo contínuo

O que é regressão linear?

Definição: Regressão linear é uma análise de regressão modelada entre uma ou mais variáveis ​​independentes e dependentes. É caracterizada por uma combinação linear de um ou mais parâmetros do modelo chamados coeficientes de regressão.

Regressão linear univariada: apenas uma variável está envolvida
Regressão linear múltipla: duas ou mais variáveis ​​estão envolvidas

Insira a descrição da imagem aqui

Nota: A regressão linear precisa ser padronizada para evitar um único peso que é muito grande e afeta o resultado final

Exemplos

Insira a descrição da imagem aqui

Recurso único:

  • Tente encontrar um valor k, b satisfazendo:
  • Preço da casa = área da casa * k + b (b é compensado, a fim de ser mais comum para um único recurso)

Insira a descrição da imagem aqui

Múltiplas características: (tamanho da casa, localização da casa, ...)

  • Tente encontrar um valor de k1, k2, ..., b e atenda:
  • Preço da casa = área da casa * k1 + localização da casa * k2 +… + b

Modelo de relacionamento linear

Tente encontrar uma combinação de atributos e pesos para prever o resultado:
Insira a descrição da imagem aqui

No entanto, sempre há um erro no valor previsto, portanto, você precisa usar a função de perda para calcular o erro

Função de perda (método do quadrado mínimo)

Insira a descrição da imagem aqui

Como encontrar W (peso) no modelo para minimizar a perda? (O objetivo é encontrar o valor W correspondente à menor perda)

Otimização

A equação normal dos mínimos quadrados (não recomendado)

Insira a descrição da imagem aqui
Desvantagens:

  • Quando o recurso é muito complexo, a velocidade da solução é muito lenta
  • Para algoritmos complexos, equações normais não podem ser usadas (regressão logística, etc.)

O gráfico visual da função de perda (exemplo de variável única) é o seguinte:

Gráfico visual da função de perda (exemplo de variável única)

Descida em gradiente do método dos mínimos quadrados (❤️ ❤️ ❤️)

Insira a descrição da imagem aqui
Entenda: Encontre ao longo da direção descendente dessa função e, finalmente, encontre o ponto mais baixo da função e atualize o valor W. (O processo de iteração constante)
Insira a descrição da imagem aqui

Reserva de conhecimento

API de equação normal de regressão linear sklearn

  • sklearn.linear_model.LinearRegression ()
    coef_: coeficiente de regressão

API de descida do gradiente de regressão linear Sklearn

  • sklearn.linear_model.SGDRegressor ()
    coef_: coeficiente de regressão

Demonstração de código

Caso de equação normal


from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


def mylinear():
    '''
    线性回归预测房价
    :return: None
    '''

    # 加载数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train,y_test)

    # 进行标准化处理
    # 特征值和目标值都需要进行标准化处理
    # 扫描器要求的是二维数据类型,需要利用reshape
    std_x = StandardScaler()

    # 特征值
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    #目标值
    std_y = StandardScaler()

    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))

    # estimator预测
    # 正规方程求解方程预测结果
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    print(lr.coef_)

    # 预测测试集的房价
    y_predict = std_y.inverse_transform(lr.predict(x_test))

    print("预测测试集里面每个样本的测试价格:",y_predict)

    return None

if __name__ == "__main__":
    mylinear()

Insira a descrição da imagem aqui
Descida de gradiente


from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

def mylinear():
    '''
    线性回归预测房价
    :return: None
    '''

    # 加载数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train,y_test)

    # 进行标准化处理
    # 特征值和目标值都需要进行标准化处理
    # 扫描器要求的是二维数据类型,需要利用reshape
    std_x = StandardScaler()

    # 特征值
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    #目标值
    std_y = StandardScaler()

    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))

    # estimator预测
    # 正规方程求解方程预测结果
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    print(lr.coef_)
    # 预测测试集的房价
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))

    print("正规方程预测测试集里面每个样本的测试价格:",y_lr_predict)

    # 梯度下降进行房价预测
    # 学习率参数 learning_rate 默认 learning_rate = invscaling
    '''
    learning_rate : string, default='invscaling'
        The learning rate schedule:

        'constant':
            eta = eta0
        'optimal':
            eta = 1.0 / (alpha * (t + t0))
            where t0 is chosen by a heuristic proposed by Leon Bottou.
        'invscaling': [default]
            eta = eta0 / pow(t, power_t)
        'adaptive':
            eta = eta0, as long as the training keeps decreasing.
            Each time n_iter_no_change consecutive epochs fail to decrease the
            training loss by tol or fail to increase validation score by tol if
            early_stopping is True, the current learning rate is divided by 5.
    '''
    sgd = SGDRegressor()

    sgd.fit(x_train, y_train)

    print(sgd.coef_)

    # 预测测试集的房价
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))

    print("梯度下降预测测试集里面每个样本的测试价格:",y_sgd_predict)

    return None

if __name__ == "__main__":
    mylinear()

Insira a descrição da imagem aqui

Avaliação de desempenho de regressão

Insira a descrição da imagem aqui

Perda de regressão do erro quadrado médio

mean_squared_error (y_true, y_pred)

  • y_true: valor verdadeiro
  • y_pred: valor previsto
  • return: resultado de ponto flutuante

Nota: O valor verdadeiro, o valor previsto é o valor antes da normalização


from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

def mylinear():
    '''
    线性回归预测房价
    :return: None
    '''

    # 加载数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train,y_test)

    # 进行标准化处理
    # 特征值和目标值都需要进行标准化处理
    # 扫描器要求的是二维数据类型,需要利用reshape
    std_x = StandardScaler()

    # 特征值
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    #目标值
    std_y = StandardScaler()

    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))

    # estimator预测
    # 正规方程求解方程预测结果
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    print(lr.coef_)
    # 预测测试集的房价
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))

    #print("正规方程预测测试集里面每个样本的测试价格:",y_lr_predict)

    print("正规方程的均方误差",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

    # 梯度下降进行房价预测
    # 学习率参数 learning_rate 默认 learning_rate = invscaling
    '''
    learning_rate : string, default='invscaling'
        The learning rate schedule:

        'constant':
            eta = eta0
        'optimal':
            eta = 1.0 / (alpha * (t + t0))
            where t0 is chosen by a heuristic proposed by Leon Bottou.
        'invscaling': [default]
            eta = eta0 / pow(t, power_t)
        'adaptive':
            eta = eta0, as long as the training keeps decreasing.
            Each time n_iter_no_change consecutive epochs fail to decrease the
            training loss by tol or fail to increase validation score by tol if
            early_stopping is True, the current learning rate is divided by 5.
    '''
    sgd = SGDRegressor()

    sgd.fit(x_train, y_train)

    print(sgd.coef_)

    # 预测测试集的房价
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))

    #print("梯度下降预测测试集里面每个样本的测试价格:",y_sgd_predict)

    print("梯度下降的均方误差",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

    return None

if __name__ == "__main__":
    mylinear()

Insira a descrição da imagem aqui

Sumário

Insira a descrição da imagem aqui

Características: A regressão linear é o modelo de regressão mais simples e fácil de usar.
Até certo ponto, o uso é restrito, mas, sem conhecer a relação entre os recursos, ainda usamos a regressão linear como a principal escolha para a maioria dos sistemas.
Dados em pequena escala: Regressão linear (não pode resolver o problema de ajuste) e outros
dados em grande escala: SGDRegressor

Publicado 83 artigos originais · elogiados 6 · 10.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/qq_39682037/article/details/105487679
Recomendado
Clasificación