第三章 回归实战

所有内容均来源于【李哥考研项目复试班】

问题:美国有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用于绘图

torchtorch.nntorch.optim用于构建和训练神经网络模型

numpy用于数值计算

csv用于读取和写入CSV文件

pandas用于数据处理和分析

DataLoaderDataset用于构建数据集和数据加载器

SelectKBestchi2用于特征选择

二、相关性分析  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 ”表示以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值