当前位置:   article > 正文

ML机器学习|LR线性回归模型|MSE_mselrrx

mselrrx

算法演示和完整代码见文末,下一期将介绍无监督聚类的经典K-Means算法。若需转载请注明来源,谢谢。

 图片

 

扫码关注公众号,了解最新领域算法知识

  • 简要介绍

  • 部分理论

  • 数据清单

  • 评价指标

  • 工程复现

  • 动图演示

  • 总结展望

 简要介绍  

最近在李师兄的教学下开始巩固ML-NLP基础理论,将第一次课程部分理论融入自己的知识进行工程复现,内容涉及使用基本运算库实现线性回归、梯度下降法、MSE损失函数等。

 部分理论  

Model: Linear Regerssion

Loss: Mean Squared Error

 

Optimization: Batch gradient descent

图片

关注公众号,了解最新最完整文章

数据清单  

 

 

 

 

在线波士顿房价数据集

dataset.zip:包含506行,13列特征列,1列标签列

 

图片

Fig.1 Partial feature set display

  评价指标   

指标:MSE,全称Mean Squared Error,即为均方误差。

作用:是用来衡量模型预测结果对标准结果的接近程度一种衡量方法,均方误差的值越小,说明预测数据与真实数据越接近。

 工程复现  

配置基本需求库

  1. """ Import the basic requirements package """
  2. import time
  3. import math
  4. import numpy as np
  5. from sklearn.datasets import load_boston

配置数据集导出函数

  1. """ Dataset export function """
  2. def read_csv():
  3.     X, y = load_boston(return_X_y=True)
  4.     print(X.shape, y.shape)  # Print feature set and label set length
  5.     return X, y

配置MSE损失函数

  1. """ MSE loss function """
  2. def mse_loss(y_true, y_pred):
  3.     return np.sum(np.power(y_true - y_pred, 2)) / y_true.shape[0] / 2

配置梯度下降法函数

  1. """ Gradient descent function """
  2. def gradient_descent(learning_rate, W, b, X_train, y_train, y_pred):
  3.     dW = np.dot(y_pred - y_train, X_train)
  4.     W = W - learning_rate * dW
  5.     db = np.sum(y_pred - y_train)
  6.     b = b - learning_rate * db
  7.     return W, b

配置训练集验证集划分函数

  1. """ Trainset and Validset partition function """
  2. def train_valid_split(X, y, split_rate):
  3.     n_split = int(X.shape[0] * (1 - split_rate))
  4.     return X[ :n_split], y[ :n_split], X[n_split: ], y[n_split: ]

配置线性回归模型参数

  1. """ Linear Regression model training parameters """
  2. lr_params = {
  3.     'learning_rate'1e-08,      # Set learning rate
  4.     'n_estimators'10000,      # Set the number of iterations
  5.     'validation_split'0.2,        # Set Set the proportion of the Validset in the Dataset
  6.     'verbose'20,                    # Set how many iterations to keep the loss
  7.     'seed'2021,                     # Set random seed
  8. }

配置线性回归模型函数

  1. """ Linear Regression model function """
  2. # create model
  3. def LinearRegression(learning_rate=1e-8, n_estimators=1000, validation_split=0.2, verbose=20, seed=0):
  4.     lr_params = {
  5.     'learning_rate': learning_rate,
  6.     'n_estimators': n_estimators,
  7.     'validation_split': validation_split,
  8.     'verbose': verbose,
  9.     'seed': seed,
  10.     }
  11.     return lr_params
  12. # fit model
  13. def fit(lr_params, X, y):
  14.     X_train, y_train, X_valid, y_valid = train_valid_split(X, y, lr_params['validation_split'])
  15.     print(X_train.shape, y_train.shape, X_valid.shape, y_valid.shape, '\n')
  16.     # Randomly set W and b
  17.     np.random.seed(lr_params['seed'])
  18.     W = np.random.rand(X.shape[1])
  19.     b = np.random.rand()
  20.     loss = -1
  21.     y_pred = np.dot(X_train, W) + b
  22.     print("[Linear Regression] [Training]")
  23.     # for in n_estimators
  24.     for i in range(lr_params['n_estimators']):
  25.         # Update parameters W and b
  26.         W, b = gradient_descent(lr_params['learning_rate'], W, b, X_train, y_train, y_pred)
  27.         train_mse = mse_loss(np.dot(X_train, W) + b, y_train)
  28.         valid_mse = mse_loss(np.dot(X_valid, W) + b, y_valid)
  29.         y_pred = np.dot(X_train, W) + b
  30.         # Refresh loss according to verbose
  31.         if i % lr_params['verbose'] != 0:
  32.             print("\r[{:<4}] train mse_0's: {:<8.2f} valid mse_1's: {:<8.2f}".format(i, train_mse, valid_mse), end='')
  33.         else:
  34.             print("\r[{:<4}] train mse_0's: {:<8.2f} valid mse_1's: {:<8.2f}".format(i, train_mse, valid_mse), end='\n')
  35.         # early stoping judgment and shake avoid
  36.         if (loss < 0 or loss * 10 >= valid_mse) or i < 10:
  37.             loss = valid_mse
  38.         else:
  39.             print("\nEarly stopping, best iteration is:")
  40.             print("[{:<4}] train mse_0's: {:<8.2f} valid mse_1's: {:<8.2f}".format(i-1, train_mse, loss), end='\n')
  41.             return None
  42.     return None

配置训练主进程

  1. """ Linear Regression model training host process """
  2. if __name__ == '__main__':
  3.     sta_time = time.time()
  4.     X, y = read_csv()
  5.     lr_model = LinearRegression(**lr_params)
  6.     fit(lr_model, X, y)
  7.     print("Time:", time.time() - sta_time)

 动图演示 

图片

 总结展望  

在线性回归中理想状态的数据集为正定矩阵或满秩矩阵时可直接求解参数,但现实中往往难以使用此法,目前各类梯度下降法已经成为收敛算法模型的主流方法,本文采用经典的梯度下降法来收敛参数。其中对早停模块没有进行合理配置,导致验证集发生抖动立刻判定为最优解并停止模型向后迭代。

 完整代码  

 

后台回复"LR"获取完整代码

 参考链接  

Boston

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_boston.html

MSE Loss

https://rohanvarma.me/Loss-Functions/

Else Code

https://zhuanlan.zhihu.com/p/90844957

筝自然语言处理和推荐算法

https://t.1yb.co/tDgb

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/144941?site
推荐阅读
相关标签
  

闽ICP备14008679号