• 机器学习-线性回归的各种操作代码


    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. import pandas as pd
    1. path = r"Salary_Data_Based_country_and_race.csv"#原始字符串
    2. df = pd.read_csv(path)#原始数据源,csv分隔符用逗号分
    3. df.dropna(axis=0, how='any', inplace=True) #数据有空的数据,无返回值(有问题的原因1有空数据,2学习率太大了)
    4. pd_data=df.drop(["Unnamed: 0","Gender","Education Level","Job Title","Country","Race"],axis=1)#以前直接drop列名
    5. pd_data


     

    1. import numpy as np
    2. orig_data=pd_data.values #得到数据的矩阵形式
    3. cols = orig_data.shape[1]#列,也就是特征数
    4. print(cols)
    5. xx=orig_data[:,:cols-1]#打印特征列,x,y分开,行得要,取到标签之前,索引从0开始,取,0,1,
    6. y=orig_data[:,cols-1:]#打印标签列
    7. yy = y.reshape((-1,1))#多少行都行,变为列向量
    8. print("xx",xx)
    9. print("yy",yy)#标签和特征值拆分
    10. #这里的y是个二维数组,千万注意

    1. #拆分数据集直接调用就行了,不是核心技术
    2. from sklearn.model_selection import train_test_split
    3. xx_train, xx_test, yy_train, yy_test = train_test_split(xx, yy, test_size=0.40, random_state=42)
    4. print("X_train=", xx_train)
    5. print("X_test=", xx_test)
    6. print("y_train=", yy_train)
    7. print("y_test=", yy_test)

    1. # 导入sklearn diabetes数据接口
    2. #加载数据集
    3. from sklearn.datasets import load_iris
    4. # 导入sklearn打乱数据函数
    5. from sklearn.utils import shuffle
    6. # 获取diabetes数据集
    7. iris = load_iris()
    8. # 获取输入和标签
    9. data, target = iris.data, iris.target#直接取
    10. # 打乱数据集
    11. X, y = shuffle(data, target, random_state=13)
    12. # 按照8/2划分训练集和测试集
    13. offset = int(X.shape[0] * 0.8)
    14. # 训练集
    15. X_train, y_train = X[:offset], y[:offset]
    16. # 测试集
    17. X_test, y_test = X[offset:], y[offset:]
    18. # 将训练集改为列向量的形式
    19. y_train = y_train.reshape((-1,1))#进行这个操作变成列向量,行向量就麻烦了
    20. # 将验证集改为列向量的形式
    21. y_test = y_test.reshape((-1,1))
    22. # 打印训练集和测试集维度
    23. print(y_train)
    24. print("X_train's shape: ", X_train.shape)
    25. print("X_test's shape: ", X_test.shape)
    26. print("y_train's shape: ", y_train.shape)
    27. print("y_test's shape: ", y_test.shape)

    1. ### 初始化模型参数
    2. def initialize_params(dims):
    3. '''
    4. 输入:
    5. dims:训练数据变量维度
    6. 输出:
    7. w:初始化权重参数值
    8. b:初始化偏差参数值
    9. '''
    10. # 初始化权重参数为零矩阵
    11. w = np.zeros((dims, 1))
    12. # 初始化偏差参数为零
    13. b = 1000
    14. return w, b
    1. ### 定义模型主体部分
    2. ### 包括线性回归公式、均方损失和参数偏导三部分
    3. def linear_loss(X, y, w, b):
    4. '''
    5. 输入:
    6. X:输入变量矩阵
    7. y:输出标签向量
    8. w:变量参数权重矩阵
    9. b:偏差项
    10. 输出:
    11. y_hat:线性模型预测输出
    12. loss:均方损失值
    13. dw:权重参数一阶偏导
    14. db:偏差项一阶偏导
    15. '''
    16. # 训练样本数量
    17. num_train = X.shape[0]
    18. # 训练特征数量
    19. num_feature = X.shape[1]
    20. # 线性回归预测输出
    21. y_hat = np.dot(X, w) + b
    22. # 计算预测输出与实际标签之间的均方损失
    23. loss = np.sum((y_hat-y)**2)/num_train
    24. # 基于均方损失对权重参数的一阶偏导数
    25. dw = np.dot(X.T, (y_hat-y)) /num_train
    26. # 基于均方损失对偏差项的一阶偏导数
    27. db = np.sum((y_hat-y)) /num_train
    28. return y_hat, loss, dw, db
    1. ### 定义线性回归模型训练过程
    2. def linear_train(X, y, learning_rate=0.01, epochs=10000):
    3. '''
    4. 输入:
    5. X:输入变量矩阵
    6. y:输出标签向量
    7. learning_rate:学习率
    8. epochs:训练迭代次数
    9. 输出:
    10. loss_his:每次迭代的均方损失
    11. params:优化后的参数字典
    12. grads:优化后的参数梯度字典
    13. '''
    14. # 记录训练损失的空列表
    15. loss_his = []
    16. # 初始化模型参数
    17. w, b = initialize_params(X.shape[1])
    18. # 迭代训练
    19. for i in range(1, epochs):
    20. # 计算当前迭代的预测值、损失和梯度
    21. y_hat, loss, dw, db = linear_loss(X, y, w, b)
    22. # 基于梯度下降的参数更新
    23. w += -learning_rate * dw
    24. b += -learning_rate * db
    25. # 记录当前迭代的损失
    26. loss_his.append(loss)
    27. # 每1000次迭代打印当前损失信息
    28. if i % 10000 == 0:
    29. print('epoch %d loss %f' % (i, loss))
    30. # 将当前迭代步优化后的参数保存到字典
    31. params = {
    32. 'w': w,
    33. 'b': b
    34. }
    35. # 将当前迭代步的梯度保存到字典
    36. grads = {
    37. 'dw': dw,
    38. 'db': db
    39. }
    40. return loss_his, params, grads
    1. # 线性回归模型训练
    2. loss_his, params, grads = linear_train(xx_train, yy_train, 0.0001, 200000)
    3. # 打印训练后得到模型参数
    4. print(params)

    1. ### 定义线性回归预测函数
    2. def predict(X, params):
    3. '''
    4. 输入:
    5. X:测试数据集
    6. params:模型训练参数
    7. 输出:
    8. y_pred:模型预测结果
    9. '''
    10. # 获取模型参数
    11. w = params['w']
    12. b = params['b']
    13. # 预测
    14. y_pred = np.dot(X, w) + b
    15. return y_pred
    16. # 基于测试集的预测
    17. y_pred = predict(xx_test, params)
    18. # 打印前五个预测值
    19. y_pred[:5]

  • 相关阅读:
    计网笔记-第五章:数据链路层
    ECCV 2022 | 港中文MMLab:基于Transformer的光流
    2023感恩节大促:跨境卖家如何借助海外网红营销赢得市场关注
    【附源码】Python计算机毕业设计纳雍县梦金园珠宝店管理系统
    [极致用户体验] 网页里的「返回」应该用 history.back 还是 push ?
    谷粒学院——Day08【课程发布-课程大纲和课程发布】
    Docker的简介及安装
    【斯坦福大学公开课CS224W——图机器学习】四、消息传递和节点分类
    散列表(hash表)的基本原理以及hash冲突(碰撞)
    区块链金融的开发流程
  • 原文地址:https://blog.csdn.net/zn2021220822/article/details/133758851