Regresión lineal del aprendizaje automático.

Regresión lineal

Prólogo

Necesitamos entender que el valor objetivo resuelto por el algoritmo de clasificación es un problema discreto; mientras que el algoritmo de regresión resuelve el problema del valor objetivo continuo

¿Qué es la regresión lineal?

Definición: La regresión lineal es un análisis de regresión modelado entre una o más variables independientes y dependientes. Se caracteriza por una combinación lineal de uno o más parámetros del modelo llamados coeficientes de regresión.

Regresión lineal univariante: solo una variable está involucrada
Regresión lineal múltiple: dos o más variables están involucradas

Inserte la descripción de la imagen aquí

Nota: La regresión lineal debe estandarizarse para evitar que el peso individual sea demasiado grande y afecte el resultado final.

Ejemplos

Inserte la descripción de la imagen aquí

Característica única:

  • Intenta encontrar un valor k, b satisfactorio:
  • Precio de la vivienda = área de la vivienda * k + b (b está compensada, para ser más común para una sola característica)

Inserte la descripción de la imagen aquí

Múltiples características: (tamaño de la casa, ubicación de la casa, ...)

  • Intenta encontrar a k1, k2, ..., el valor b cumple:
  • Precio de la casa = área de la casa * k1 + ubicación de la casa * k2 +… + b

Modelo de relación lineal

Intente encontrar una combinación de atributos y pesos para predecir el resultado:
Inserte la descripción de la imagen aquí

Sin embargo, siempre hay un error en el valor predicho, por lo que debe utilizar la función de pérdida para calcular el error.

Función de pérdida (método de mínimos cuadrados)

Inserte la descripción de la imagen aquí

¿Cómo encontrar W (peso) en el modelo para minimizar la pérdida? (El propósito es encontrar el valor W correspondiente a la pérdida más pequeña)

Optimización

La ecuación normal de mínimos cuadrados (no recomendado)

Inserte la descripción de la imagen aquí
Desventajas

  • Cuando la función es demasiado compleja, la velocidad de la solución es demasiado lenta
  • Para algoritmos complejos, no se pueden usar ecuaciones normales (regresión logística, etc.)

El gráfico visual de la función de pérdida (ejemplo de variable única) es el siguiente:

Gráfico visual de la función de pérdida (ejemplo de variable única)

Descenso de gradiente del método de mínimos cuadrados (❤️ ❤️ ❤️)

Inserte la descripción de la imagen aquí
Comprender: Encuentre a lo largo de la dirección hacia abajo de esta función, y finalmente encuentre el punto más bajo de la función, y luego actualice el valor de W. (El proceso de iteración constante)
Inserte la descripción de la imagen aquí

Reserva de conocimiento

sklearn regresión lineal ecuación normal API

  • sklearn.linear_model.LinearRegression ()
    coef_: coeficiente de regresión

API de descenso de gradiente de regresión lineal de Sklearn

  • sklearn.linear_model.SGDRegressor ()
    coef_: coeficiente de regresión

Código de demostración

Caso de ecuación 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()

Inserte la descripción de la imagen aquí
Descenso 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()

Inserte la descripción de la imagen aquí

Evaluación de rendimiento de regresión

Inserte la descripción de la imagen aquí

Pérdida de regresión de error cuadrático medio

mean_squared_error (y_true, y_pred)

  • y_true: valor verdadero
  • y_pred: valor predicho
  • retorno: resultado de coma flotante

Nota: El valor verdadero, el valor predicho es el valor antes de la normalización.


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()

Inserte la descripción de la imagen aquí

Resumen

Inserte la descripción de la imagen aquí

Características: La regresión lineal es el modelo de regresión más simple y fácil de usar.
Hasta cierto punto, el uso está restringido, sin embargo, sin conocer la relación entre las características, todavía utilizamos la regresión lineal como la opción principal para la mayoría de los sistemas.
Datos a pequeña escala: regresión lineal (no puede resolver el problema de ajuste) y otros
datos a gran escala: SGDRegressor

Publicado 83 artículos originales · elogiado 6 · 10,000+ vistas

Supongo que te gusta

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