所有内容均来源于【李哥考研项目复试班】
问题:美国有40个州,统计了这40个周连续三天的新冠阳性人数,和每天的一些社会特征,比如带口罩情况, 居家办公情况等等。现根据前两天的情况以及第三天的特征,来预测第三天的阳性人数。
数据集:通过网盘分享的文件:新冠人数预测
链接: https://pan.baidu.com/s/1EWHofyP3wz5yBc9eaBkz7w?pwd=94jg 提取码: 94jg
一、导入库
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_OK"] = "TRUE"
matplotlib.pyplot
用于绘图
torch
、torch.nn
、torch.optim
用于构建和训练神经网络模型
numpy
用于数值计算
csv
用于读取和写入CSV文件
pandas
用于数据处理和分析
DataLoader
和Dataset
用于构建数据集和数据加载器
SelectKBest
和chi2
用于特征选择
二、相关性分析 get_feature_importance
def get_feature_importance(feature_data, label_data, k=4, column=None):
"""
此处省略 feature_data, label_data 的生成代码。
如果是 CSV 文件,可通过 read_csv() 函数获得特征和标签。
这个函数的目的是, 找到所有的特征种, 比较有用的k个特征, 并打印这些列的名字。
"""
model = SelectKBest(chi2, k=k) # 定义一个选择k个最佳特征的函数
feature_data = np.array(feature_data, dtype=np.float64)
# label_data = np.array(label_data, dtype=np.float64)
X_new = model.fit_transform(feature_data, label_data) # 用这个函数选择k个最佳特征
# feature_data是特征数据,label_data是标签数据,该函数可以选择出k个特征
print('x_new', X_new)
scores = model.scores_ # scores即每一列与结果的相关性
# 按重要性排序,选出最重要的 k 个
indices = np.argsort(scores)[::-1] # [::-1]表示反转一个列表或者矩阵。
# argsort这个函数, 可以矩阵排序后的下标。 比如 indices[0]表示的是,scores中最小值的下标。
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] # 返回选中列的特征和他们的下标。
从给定的特征数据和标签数据中选择最重要的 k 个特征,并打印这些特征的列名。
feature_data:特征数据
label_data:标签数据
k:要选择的特征数量(此处默认为4)
column:特征列名列表
X_new 是选择后的特征数据
indices 存储了排序后的特征索引
返回选择后的特征数据 X_new 和前 k 个特征的索引。
三、数据处理 CovidDataset
1、初始化
class CovidDataset(Dataset):
def __init__(self, file_path, mode="train", all_feature=False, feature_dim=6):
with open(file_path, "r") as f:
ori_data = list(csv.reader(f))
column = ori_data[0]
csv_data = np.array(ori_data[1:])[:, 1:].astype(float)
feature = np.array(ori_data[1:])[:, 1:-1]
label_data = np.array(ori_data[1:])[:, -1]
if all_feature:
col = np.array([i for i in range(0, 93)])
else:
_, col = get_feature_importance(feature, label_data, feature_dim, column)
col = col.tolist()
if mode == "train": # 逢5取1.
indices = [i for i in range(len(csv_data)) if i % 5 != 0]
data = torch.tensor(csv_data[indices, :-1])
self.y = torch.tensor(csv_data[indices, -1])
elif mode == "val":
indices = [i for i in range(len(csv_data)) if i % 5 == 0]
data = torch.tensor(csv_data[indices, :-1])
self.y = torch.tensor(csv_data[indices, -1])
else:
indices = [i for i in range(len(csv_data))]
data = torch.tensor(csv_data[indices])
data = data[:, col]
self.data = (data - data.mean(dim=0, keepdim=True)) / data.std(dim=0, keepdim=True)
self.mode = mode
初始化方法代码如上,为便于阅读,下面解释的内容会将上述代码截取对应部分便于对应
(1)类定义和初始化方法
CovidDataset 类继承 Dataset 类
__init__ 方法用于初始化数据集对象
file_path:csv文件路径
mode:数据集的模式(训练集/验证集/测试集)
all_feature:是否使用所有特征列
feature_dim:要选择的特征数量
(2)读取数据
with open(file_path, "r") as f:
ori_data = list(csv.reader(f))
column = ori_data[0]
csv_data = np.array(ori_data[1:])[:, 1:].astype(float)
with open(file_path, "r") as f: 打开指定路径 file_path 的文件,“ r ”表示以