新冠病毒感染人数预测(基于回归的神经网络项目)

写在前面:我们做的事情:我们的目的是要得到一个好的模型,这个模型能够让我们预测好的y 首先拿到一批数据,这批数据有x和准确的y,我们让x通过模型得到预测的y,让预测的y与准确的y去计算差距loss,根据这个差距 loss去不断改变优化模型。

一、神经网络项目的流程

 1、数据预处理:(深度学习最主要的数据处理,要先拿到数据)

  • 使用 CovidDataset 类加载和处理数据。

  • 根据 all_feature 参数选择特征。

  • 划分训练集、验证集和测试集。

  • 对数据进行归一化。

 2、模型定义:(定义一个学习模型)

  • 定义神经网络模型 MyModel,包含两层全连接层和一个 ReLU 激活函数。

3、 训练和验证:

  • 使用 train_val 函数训练模型。

  • 在每个 epoch 中,分别对训练集和验证集进行前向传播、计算损失、反向传播和参数更新。

  • 保存验证损失最小的模型。

4、 测试和评估

  • 使用 evaluate 函数加载最佳模型。

  • 对测试集进行预测,并将结果保存到 CSV 文件中。

5、 主程序

  • 定义数据集路径、特征维度、批量大小等参数。

  • 初始化数据加载器、模型、优化器和损失函数。

  • 调用训练和测试函数。

 二、各个模块分析

        

模块和库

import matplotlib.pyplot as plt
import torch
import numpy as np
import csv
import pandas as pd
from torch.utils.data import DataLoader, Dataset
import torch.nn as nn
from torch import optim
import time
from sklearn.feature_selection import SelectKBest, chi2
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
  • 作用:导入必要的库和模块。

    • matplotlib.pyplot:用于绘图。

    • torch:PyTorch 深度学习框架。

    • numpy:数值计算库。

    • csv:处理 CSV 文件。

    • pandas:数据处理工具。

    • DataLoader, Dataset:PyTorch 中用于数据加载和处理的工具。

    • torch.nn:PyTorch 的神经网络模块。

    • optim:优化器模块。

    • time:时间计算。

    • SelectKBest, chi2:特征选择工具,用于选择最重要的特征。

    • os:操作系统接口,用于设置环境变量。

数据预处理

1、函数:get_feature_importance

这里其实就是计算相关系数,计算得到相关系数最重要的列

def get_feature_importance(feature_data, label_data, k=4, column=None):
    model = SelectKBest(chi2, k=k)  # 使用卡方检验选择 k 个最佳特征
    feature_data = np.array(feature_data, dtype=np.float64)
    X_new = model.fit_transform(feature_data, label_data)  # 选择出 k 个特征
    scores = model.scores_  # 每个特征的得分
    indices = np.argsort(scores)[::-1]  # 按得分从高到低排序
    if column:  # 如果提供了列名
        k_best_features = [column[i+1] for i in indices[0:k].tolist()]  # 提取列名
        print('k best features are: ', k_best_features)
    return X_new, indices[0:k]  # 返回选择后的特征和它们的索引

函数定义

def get_feature_importance(feature_data, label_data, k=4, column=None):
  • 作用:定义一个函数,用于选择最重要的 k 个特征。

    • 输入

      • feature_data:特征数据(二维数组)。

      • label_data:标签数据(一维数组)。

      • k:选择的特征数量(默认 4)。

      • column:列名(可选)。

    • 输出

      • X_new:选择后的特征数据。

      • indices:选择的特征索引。

函数体

    model = SelectKBest(chi2, k=k)
  • 作用:创建一个 SelectKBest 模型,使用卡方检验(chi2)选择最重要的 k 个特征。

    • SelectKBest 是 scikit-learn 中的一个工具,用于特征选择。

    • chi2 是一种统计检验方法,用于评估特征与目标之间的相关性。

    feature_data = np.array(feature_data, dtype=np.float64)
  • 作用:将输入的特征数据转换为 NumPy 数组,并确保数据类型为 float64

    • 这一步是为了确保数据格式与 SelectKBest 的要求一致。

    X_new = model.fit_transform(feature_data, label_data)
  • 作用:使用 SelectKBest 模型拟合数据,并返回选择后的特征数据。

    • fit_transform 方法:

      • fit:计算每个特征的重要性得分。

      • transform:根据得分选择出最重要的 k 个特征,并返回新的特征矩阵。

    • X_new 是一个二维数组,只包含被选中的特征。

    scores = model.scores_
  • 作用:提取每个特征的重要性得分。

    • scores_SelectKBest 模型的一个属性,保存了每个特征的重要性得分。

    • 得分越高,特征越重要。

    indices = np.argsort(scores)[::-1]
  • 作用:对特征得分进行排序,并返回从大到小的索引。

    • np.argsort(scores):返回得分从小到大的索引。

    • [::-1]:反转索引,使其从大到小排列。

    • argsort将得分按从小到大排序,但是里面放的不是得分,而是下标,比如1 0 2表示原数组下标为1的数最小,[::-1]表示反转一个列表或者矩阵,那么就变为从大到小
    if column:
        k_best_features = [column[i+1] for i in indices[0:k].tolist()]
        print('k best features are: ', k_best_features)
  • 作用:如果提供了列名,打印出最重要的 k 个特征的列名。

    • column[i+1]:假设 column 是一个列表,包含了所有列名(包括标签列),因此需要偏移 1 位。

    • indices[0:k].tolist():提取前 k 个索引,并将其转换为列表。

    return X_new, indices[0:k]
  • 作用:返回选择后的特征数据和它们的索引。

    • X_new:选择后的特征数据。

    • indices[0:k]:最重要的 k 个特征的索引。

总结

get_feature_importance 函数的作用是从输入的特征数据中选择出最重要的 k 个特征,并返回这些特征的数据和它们的索引。它的主要步骤包括:

  1. 使用 SelectKBestchi2 选择最重要的 k 个特征。

  2. 提取每个特征的重要性得分。

  3. 对特征得分进行排序,并返回从大到小的索引。

  4. 如果提供了列名,打印出最重要的 k 个特征的列名。

2、 类:CovidDataset

          这个类继承自 PyTorch 的 Dataset 类,用于加载和预处理数据。它可以根据不同的模式(训练、验证、测试)返回不同的数据子集。dataset是数据预处理最重要最基础的类,它主要包括三个函数:init数据初始化、gititem返回数据、len数据长度。

函数:__init__

def __init__(self, file_path, mode="train", all_feature=False, feature_dim=6):
  • 作用:初始化数据集对象。

    • 输入

      • file_path:数据文件路径。

      • mode:数据集模式(trainvaltest)。

      • all_feature:是否使用所有特征(默认 False)。

      • feature_dim:选择的特征数量(默认 6)。

函数体

    with open(file_path, "r") as f:
        ori_data = list(csv.reader(f))
  • 作用:打开并读取 CSV 文件。

    • csv.reader(f):读取 CSV 文件内容。

    • list(csv.reader(f)):将内容转换为列表格式。

        column = ori_data[0]  # 列名
  • 作用:提取 CSV 文件的第一行作为列名。

        csv_data = np.array(ori_data[1:])[:, 1:].astype(float)
  • 作用:将 CSV 文件的数据部分转换为 NumPy 数组,并去掉第一列。

    • ori_data[1:]:去掉第一行(列名)。

    • [:, 1:]:去掉第一列(通常是 ID 列)。

    • .astype(float):将数据转换为浮点型。

        feature = np.array(ori_data[1:])[:, 1:-1]
  • 作用:提取特征列(去掉第一列和最后一列)。

    • [:, 1:-1]:从第 2 列到倒数第 2 列。

        label_data = np.array(ori_data[1:])[:, -1]
  • 作用:提取标签列(最后一列)。

        if all_feature:
            col = np.array([i for i in range(0, 93)])
  • 作用:如果 all_feature=True,使用所有列作为特征。

    • np.array([i for i in range(0, 93)]):生成一个从 0 到 92 的数组。

 
 

你可能感兴趣的:(深度学习,回归,神经网络,数据挖掘)