当前位置: 首页 > news >正文

快速构建数据集-假数据(生成划分)

快速构建数据集-假数据

  • 1、torch.randn(✅)
  • 2、HuggingFace Datasets(✅)
    • 🔹1. 从字典生成
    • 🔹2. 从 `pandas.DataFrame` 生成
    • 🔹3. 批量生成“业务型”假数据(配合 Faker)
    • 🔹4. 随机文本/时间序列假数据
    • 🔹5. 直接生成 `DatasetDict`
  • 3、HF Datasets 切分数据集
    • 🔹1. 随机切分(最常用)
    • 🔹2. 固定比例切分(多份)
    • 🔹3. 按索引选择(精确控制)
    • 🔹4. 按分片切分(均匀划分)
    • 🔹5. 自定义条件切分
    • 1️⃣ 使用 `train_test_split` 按比例划分
    • 2️⃣ 手动按索引切分 `select`
    • 3️⃣ 随机采样子集
    • 4️⃣ 多重划分(train/val/test)
    • 5️⃣ 使用数据集自带 split
    • 6️⃣ 高级:使用 `train_test_split` 并指定 stratify(按类别平衡)
      • ✅ 总结
  • 4、示例(窗口)
    • 1.示例1:切片
    • 2.示例2:HuggingFace Datasets
    • 3.示例3: 没窗口
    • 4.示例4:日期划分窗口
  • 5、汇总(生成)
    • 🔹1. 用 **Numpy / Pandas** 随机生成
    • 🔹2. 用 **Scikit-learn** 自带造数函数
    • 🔹3. 用 **Faker** 生成“真实感”假数据
    • 🔹4. 用 **Torch / TensorFlow** 生成张量假数据
    • 🔹5. 时间序列/股票类假数据
  • 6、汇总(划分)
    • **1. 使用 Python 原生方法(列表/数组切分)**
    • **2. 使用 NumPy 切分**
    • **3. 使用 scikit-learn `train_test_split`**
    • **4. 使用 pandas 切分**
    • **5. 时间序列专用切分**
    • **6. HuggingFace Datasets 快速切分**
      • 🔹 总结

推荐:
生成,torch.randn快速生成
切分, HuggingFace Datasets

1、torch.randn(✅)

# --- 1. 数据生成和辅助模块 (无变化) ---def generate_ohlcv_data(num_samples, seq_len, num_features, multi_step):"""生成伪造的 OHLCV 数据"""ohlcv = np.random.randn(num_samples, seq_len, num_features).astype(np.float32)y = np.random.randn(num_samples, multi_step, num_features).astype(np.float32)return torch.from_numpy(ohlcv), torch.from_numpy(y)
import torch
import torch.nn as nn
from mamba_ssm import Mamba
from st_moe_pytorch import MoE, Expert
import numpy as np# --- 1. 模拟数据生成 ---
def create_dummy_ohlcv_data(num_samples, seq_len, predict_steps):"""生成伪造的 OHLCV 股票数据。Args:num_samples (int): 样本数量。seq_len (int): 每个样本的序列长度。predict_steps (int): 预测的未来步数。Returns:tuple: (输入数据, 标签数据)"""# 5个特征: 开盘价, 最高价, 最低价, 收盘价, 交易量feature_dim = 5# 输入: (样本数, 序列长度, 特征维度)inputs = torch.randn(num_samples, seq_len, feature_dim)# 标签: (样本数, 预测步数, 预测维度)# 我们预测未来 predict_steps 的收盘价labels = torch.randn(num_samples, predict_steps, 1)print(f"生成的假数据输入形状: {inputs.shape}")print(f"生成的假数据标签形状: {labels.shape}")return inputs, labels

2、HuggingFace Datasets(✅)

HuggingFace Datasets,快速生成假数据集的方法

好问题 👍
如果你已经在用 🤗 HuggingFace Datasets,生成“假数据集”其实非常方便,可以直接从 字典 / DataFrame / 列表 构建。下面我整理几种常见方法:


🔹1. 从字典生成

最简单,直接写个 dict 就行:

from datasets import Datasetdata = {"text": ["hello world", "foo bar", "lorem ipsum"],"label": [0, 1, 0]
}
dataset = Dataset.from_dict(data)print(dataset)
print(dataset[0])

🔹2. 从 pandas.DataFrame 生成

结合前面提到的 numpy/pandas 假数据:

import pandas as pd
import numpy as np
from datasets import Datasetdf = pd.DataFrame({"feature1": np.random.randn(100),"feature2": np.random.randint(0, 10, 100),"label": np.random.choice([0, 1], size=100)
})dataset = Dataset.from_pandas(df)
print(dataset[0])

🔹3. 批量生成“业务型”假数据(配合 Faker)

from datasets import Dataset
from faker import Fakerfake = Faker("en_US")data = {"name": [fake.name() for _ in range(20)],"email": [fake.email() for _ in range(20)],"date": [fake.date() for _ in range(20)],"amount": [fake.random_int(100, 10000) for _ in range(20)]
}dataset = Dataset.from_dict(data)
print(dataset[0])

🔹4. 随机文本/时间序列假数据

比如快速生成 NLP 数据:

from datasets import Dataset
import numpy as npdata = {"sentence": [f"sample text {i}" for i in range(50)],"label": np.random.randint(0, 2, 50).tolist()
}dataset = Dataset.from_dict(data)
print(dataset[:5])

比如金融时间序列:

import pandas as pd
import numpy as np
from datasets import Datasetn = 100
df = pd.DataFrame({"date": pd.date_range("2025-01-01", periods=n),"price": 100 + np.random.randn(n).cumsum(),"volume": np.random.randint(100, 1000, n)
})dataset = Dataset.from_pandas(df)
print(dataset[:3])

🔹5. 直接生成 DatasetDict

方便划分 train/test:

from datasets import Dataset, DatasetDictdata = {"text": [f"sample {i}" for i in range(100)],"label": [i % 2 for i in range(100)]
}dataset = Dataset.from_dict(data)
dataset = dataset.train_test_split(test_size=0.2)dataset_dict = DatasetDict({"train": dataset["train"],"test": dataset["test"]
})print(dataset_dict)

✅ 总结:

  • Dataset.from_dict → 最快,直接传 Python dict
  • Dataset.from_pandas → 用 pandas/numpy 快速造数据
  • 配合 Faker → 生成“看起来真实”的假数据
  • train_test_split → 一步得到训练集/测试集

要不要我帮你写一个 通用函数 make_fake_hf_dataset(mode="classification"/"nlp"/"finance"),一行就能造 HuggingFace 假数据集?

3、HF Datasets 切分数据集

👌 在 🤗 HuggingFace Datasets 里,切分数据集非常灵活,主要用 .train_test_split(),也可以用 .select().shard() 等。下面给你总结常见方法:


🔹1. 随机切分(最常用)

from datasets import Datasetdata = {"text": [f"sample {i}" for i in range(100)], "label": [i % 2 for i in range(100)]}
dataset = Dataset.from_dict(data)# 80% train, 20% test
split = dataset.train_test_split(test_size=0.2, seed=42)print(split["train"])
print(split["test"])

🔹2. 固定比例切分(多份)

可以用 train_test_split 递归拆分,得到 train/valid/test:

# 先切 train/test
split = dataset.train_test_split(test_size=0.2, seed=42)# 再从 train 中切出 valid
split2 = split["train"].train_test_split(test_size=0.1, seed=42)# 合并成 DatasetDict
from datasets import DatasetDict
dataset_dict = DatasetDict({"train": split2["train"],"valid": split2["test"],"test": split["test"]
})print(dataset_dict)

🔹3. 按索引选择(精确控制)

train_dataset = dataset.select(range(0, 80))   # 前 80 个样本
test_dataset  = dataset.select(range(80, 100)) # 后 20 个样本

🔹4. 按分片切分(均匀划分)

# 把数据均匀分成 5 份,取第 0 份
part0 = dataset.shard(num_shards=5, index=0)# 取第 1 份
part1 = dataset.shard(num_shards=5, index=1)

🔹5. 自定义条件切分

比如按 label 分:

def is_positive(example):return example["label"] == 1positive = dataset.filter(is_positive)
negative = dataset.filter(lambda x: x["label"] == 0)

总结

  • 随机划分.train_test_split()
  • 固定索引/前后切分.select()
  • 均匀分片.shard()
  • 条件过滤.filter()
  • 组合多份DatasetDict

要不要我帮你写一个 通用函数 split_dataset(dataset, train=0.8, valid=0.1, test=0.1),自动返回 DatasetDict(train/valid/test)

HuggingFace Datasets 里,切分数据集的方法主要有几种,根据你是想 按比例按索引、还是 使用自带 split 来划分。下面详细说明并举例:


1️⃣ 使用 train_test_split 按比例划分

from datasets import load_dataset# 加载数据集(通常 split='train')
dataset = load_dataset("imdb", split="train")# 划分 80% 训练,20% 测试
split_dataset = dataset.train_test_split(test_size=0.2, seed=42)train_dataset = split_dataset["train"]
test_dataset  = split_dataset["test"]print(len(train_dataset), len(test_dataset))
  • test_size 可以是整数(样本数)或浮点数(比例)
  • seed 用于固定随机打乱结果

2️⃣ 手动按索引切分 select

train_end = 20000
val_end   = 25000train_dataset = dataset.select(range(0, train_end))
val_dataset   = dataset.select(range(train_end, val_end))
test_dataset  = dataset.select(range(val_end, len(dataset)))
  • 适合固定顺序划分
  • dataset.select(indices) 会返回一个新的 Dataset 子集

3️⃣ 随机采样子集

# 打乱数据
shuffled = dataset.shuffle(seed=42)# 取前 5000 条作为子集
subset = shuffled.select(range(5000))
  • 常用于快速调试或小规模实验

4️⃣ 多重划分(train/val/test)

# 先划分训练+测试
train_test = dataset.train_test_split(test_size=0.2, seed=42)# 再划分测试集为验证集+测试集
valid_test = train_test["test"].train_test_split(test_size=0.5, seed=42)train_dataset = train_test["train"]
valid_dataset = valid_test["train"]
test_dataset  = valid_test["test"]
  • 常用于需要三份数据集的情况

5️⃣ 使用数据集自带 split

dataset = load_dataset("imdb")train_dataset = dataset["train"]
test_dataset  = dataset["test"]
  • 有些数据集本身就提供了 split,无需再划分

6️⃣ 高级:使用 train_test_split 并指定 stratify(按类别平衡)

split_dataset = dataset.train_test_split(test_size=0.2, stratify_by_column="label", seed=42)
  • 可以保证训练集和测试集的标签分布一致

✅ 总结

方法适用场景
train_test_split快速按比例随机划分
select按固定索引自定义划分
shuffle().select()随机采样子集
数据集自带 split直接使用官方划分
多次 train_test_split生成 train/val/test 三份数据
stratify_by_column保持标签分布一致

如果你需要,我可以帮你写一个 通用函数,只用一个方法就能支持:

  • train/val/test 划分
  • 按比例或固定数量
  • 是否随机打乱
  • 是否保持类别分布

这样直接调用就能得到切好的 HF Dataset。

你希望我写吗?

4、示例(窗口)

时间序列切分,验证和测试集加上前面窗口长度数据

1.示例1:切片

明白了,你想做时间序列切分,并且为了训练模型或滚动预测,需要在 验证集和测试集前面补上 window_size 的历史数据,保证模型可以拿到足够的历史信息。下面给你一个标准示例:

import pandas as pd# 假数据
data = pd.DataFrame({'date': pd.date_range('2020-01-01', periods=100),'value': range(100)
})window_size = 10  # 历史窗口长度
train_ratio = 0.7
val_ratio = 0.2  # 测试集自动是剩下的 0.1n = len(data)
train_end = int(n * train_ratio)
val_end = train_end + int(n * val_ratio)# 切分
train_data = data.iloc[:train_end]# 验证集前加上 window_size 历史数据
val_data = data.iloc[max(train_end - window_size, 0):val_end]# 测试集前加上 window_size 历史数据
test_data = data.iloc[max(val_end - window_size, 0):]print("Train:", train_data.shape)
print("Validation:", val_data.shape)
print("Test:", test_data.shape)
import pandas as pd
import numpy as np# 假数据
n = 100
data = pd.DataFrame({"date": pd.date_range("2025-01-01", periods=n),"value": np.random.randn(n).cumsum()
})window_size = 10
train_ratio, valid_ratio, test_ratio = 0.7, 0.2, 0.1train_end = int(len(data) * train_ratio)
valid_end = train_end + int(len(data) * valid_ratio)# 切分训练集
train_data = data.iloc[:train_end]# 验证集,需要加上前面 window_size 个数据
valid_data = data.iloc[train_end - window_size : valid_end]# 测试集,也需要加上前面 window_size 个数据
test_data = data.iloc[valid_end - window_size :]print("Train:", train_data.shape)
print("Valid:", valid_data.shape)
print("Test:", test_data.shape)

✅ 特点

  1. 保留时间顺序,不打乱。
  2. 验证集和测试集前加 window_size 历史数据,保证模型有完整的序列输入。
  3. max(..., 0) 防止索引越界。

如果你想,我可以帮你写一个可复用函数,直接传入 data, train_ratio, val_ratio, window_size,返回 train/val/test,并且自动处理窗口前置,非常适合滚动预测。

你希望我写这个函数吗?

2.示例2:HuggingFace Datasets

明白了,你想在 HuggingFace Datasets 中做 时间序列切分,同时保证 验证集和测试集前加上 window_size 的历史数据。下面是一个完整示例:

from datasets import Dataset
import pandas as pd# 假数据
df = pd.DataFrame({'date': pd.date_range('2020-01-01', periods=100),'value': range(100)
})# 转成 HF Dataset
dataset = Dataset.from_pandas(df)# 参数
window_size = 10
train_ratio = 0.7
val_ratio = 0.2n = len(dataset)
train_end = int(n * train_ratio)
val_end = train_end + int(n * val_ratio)# 切分索引
train_dataset = dataset.select(range(train_end))# 验证集:前加 window_size 历史
val_start = max(train_end - window_size, 0)
val_dataset = dataset.select(range(val_start, val_end))# 测试集:前加 window_size 历史
test_start = max(val_end - window_size, 0)
test_dataset = dataset.select(range(test_start, n))print("Train:", len(train_dataset))
print("Validation:", len(val_dataset))
print("Test:", len(test_dataset))

✅ 特点

  1. 保留时间顺序,适合时间序列。
  2. 验证集和测试集前补历史窗口,方便滑动窗口模型输入。
  3. 输出仍然是 HF Dataset 对象,可以直接用于 mapset_format 等处理。

如果你需要,我可以帮你写一个通用函数,直接传入:

  • HF Dataset
  • train_ratioval_ratio
  • window_size

然后返回 train/val/test 并自动处理窗口前置,非常适合批量时间序列切分。

你希望我写吗?

明白了,你想用 HuggingFace Datasets时间序列切分,并且 验证集和测试集前面要加上窗口长度的数据,保证滑窗模型输入完整。下面给你一个通用方法。


1️⃣ 思路

假设:

  • dataset 是 HF Dataset
  • window_size 是滑窗长度
  • 切分比例:train_ratiovalid_ratiotest_ratio

做法:

  1. 按比例计算训练集、验证集、测试集的结束索引。
  2. 验证集前加上训练集最后 window_size 行。
  3. 测试集前加上验证集最后 window_size 行。

2️⃣ 代码示例

from datasets import Dataset, DatasetDict
import numpy as np
import pandas as pd# 假数据
n = 100
df = pd.DataFrame({"date": pd.date_range("2025-01-01", periods=n),"value": np.random.randn(n).cumsum()
})dataset = Dataset.from_pandas(df)# 参数
window_size = 10
train_ratio, valid_ratio, test_ratio = 0.7, 0.2, 0.1# 索引
train_end = int(len(dataset) * train_ratio)
valid_end = train_end + int(len(dataset) * valid_ratio)# 切分
train_ds = dataset.select(range(0, train_end))
valid_ds = dataset.select(range(train_end - window_size, valid_end))
test_ds  = dataset.select(range(valid_end - window_size, len(dataset)))# 合并成 DatasetDict
dataset_dict = DatasetDict({"train": train_ds,"valid": valid_ds,"test": test_ds
})print(dataset_dict)

3️⃣ 滑窗生成 X, y(可选)

如果你要直接生成滑窗输入:

def create_windows(dataset, window_size, column="value"):values = np.array(dataset[column])X, y = [], []for i in range(len(values) - window_size):X.append(values[i:i+window_size])y.append(values[i+window_size])return np.array(X), np.array(y)X_train, y_train = create_windows(dataset_dict["train"], window_size)
X_valid, y_valid = create_windows(dataset_dict["valid"], window_size)
X_test, y_test   = create_windows(dataset_dict["test"], window_size)print(X_train.shape, X_valid.shape, X_test.shape)

✅ 特点:

  • 验证集和测试集包含前置 window_size 行,保证滑窗完整
  • 适合股票、传感器、气象等时间序列预测任务
  • 保持 HF Dataset 格式,可直接用于 Transformers 或自定义模型

如果你需要,我可以帮你写一个 通用函数 split_timeseries_hf(dataset, window_size, ratios),一行返回 train/valid/test HF DatasetDict,并自动处理前置窗口,非常方便。

你希望我帮你写吗?

3.示例3: 没窗口

from datasets import Dataset, DatasetDict
import numpy as np
import pandas as pd# -------------------------
SEED = 42
NUM_DAYS = 900
CONTEXT_LEN = 5
HORIZON = 2
BATCH_SIZE = 32
EPOCHS = 6
LR = 3e-3
D_MODEL = 64
DATE_INPUT_DIM = 3
LOSS_TYPE = "wmse"
REPORT_N = 3
# -------------------------def make_fake_stock(num_days=900, start_date="2018-01-01"):dates = pd.date_range(start=start_date, periods=num_days, freq="D")x = np.arange(num_days)base = 100.0 + 0.02*x + 5.0*np.sin(2*np.pi*x/30)open_ = base + np.random.normal(0,1,num_days)close = base + np.random.normal(0,1,num_days)high = np.maximum(open_,close) + np.abs(np.random.normal(0,1,num_days))low = np.minimum(open_,close) - np.abs(np.random.normal(0,1,num_days))volume = np.random.randint(1000,20000,num_days)df = pd.DataFrame({"date": dates,"open": open_,"high": high,"low": low,"close": close,"volume": volume})df["year"] = df["date"].dt.yeardf["month"] = df["date"].dt.monthdf["day"] = df["date"].dt.dayreturn dfdef prepare_hf_dataset(df, context_len=30, horizon=5):records = []N = len(df)for i in range(N - context_len - horizon + 1):ohlcv = df.loc[i:i+context_len-1, ["open","high","low","close","volume"]].values.astype(np.float32)date_feats = df.loc[i:i+context_len-1, ["year","month","day"]].values.astype(np.float32)labels = df.loc[i+context_len:i+context_len+horizon-1, "close"].values.astype(np.float32)records.append({"ohlcv": ohlcv,"date_feats": date_feats,"labels": labels})# 🔑 直接转成 Hugging Face Datasetreturn Dataset.from_list(records)df=make_fake_stock(num_days=900, start_date="2018-01-01")
print(df.head())# 1) 构造完整 Dataset
dataset = prepare_hf_dataset(df, CONTEXT_LEN, HORIZON)
print(dataset)# 2) 切分
N = len(dataset)
train_end = int(N * 0.7)
val_end = int(N * 0.85)dataset_dict = DatasetDict({"train": dataset.select(range(0, train_end)),"valid": dataset.select(range(train_end, val_end)),"test": dataset.select(range(val_end, N))
})print(dataset_dict)print(dataset_dict["train"][0])  # 查看第一个样本

4.示例4:日期划分窗口

import pandas as pd
import numpy as np"""
最终数据格式如下:
date	    tic	  close volume
2020-01-01	AAPL	300	1000
2020-01-01	MSFT	150	20002020-01-02	AAPL	305	1100
2020-01-02	MSFT	NaN	NaN2020-01-03	AAPL	NaN	NaN
2020-01-03	MSFT	152	2100你的数据是 多股票、多天且时间不连续 的情况,并且希望在 切分交易集时加上训练集最后的窗口长度,保证滑窗完整。下面给你一个 完整可运行示例,包括:构造不连续时间的假数据(带 NaN)切分训练集和交易集对交易集前面加上训练集最后 window_size 天的数据
"""# =========================
# 1️⃣ 构造不连续时间的假数据
# =========================
dates = ["2020-01-01", "2020-01-03", "2020-01-06", "2020-01-08", "2020-01-10"]
tics = ["AAPL", "MSFT"]data_list = []
for date in dates:for tic in tics:close = np.random.randint(100, 500)volume = np.random.randint(1000, 5000)# 人为加入 NaNif np.random.rand() < 0.3:close, volume = np.nan, np.nandata_list.append([pd.to_datetime(date), tic, close, volume])processed_full = pd.DataFrame(data_list, columns=["date", "tic", "close", "volume"])
print("示例数据:")
print(processed_full)# =========================
# 2️⃣ 切分函数(带窗口)
# =========================
def data_split_with_window(df, start, end, window_size=0, target_date_col="date"):"""按日期切分数据集,并可在验证/交易集前加上前面 window_size 日期:param df: pandas DataFrame, 必须包含 target_date_col 和 'tic':param start: 起始日期(字符串或 Timestamp):param end: 结束日期(字符串或 Timestamp):param window_size: int, 交易集或验证集前加上训练集最后的 window_size 日期:param target_date_col: 时间列名称:return: pandas DataFrame"""# 主区间切分data = df[(df[target_date_col] >= start) & (df[target_date_col] < end)]# 如果需要窗口前置,取 start 前的 window_size 日期if window_size > 0:prev_dates = df[df[target_date_col] < start][target_date_col].drop_duplicates().sort_values().tail(window_size)prev_data = df[df[target_date_col].isin(prev_dates)]data = pd.concat([prev_data, data], ignore_index=True)# 按 date 和 tic 排序data = data.sort_values([target_date_col, "tic"], ignore_index=True)# 重新索引data.index = data[target_date_col].factorize()[0]return data# =========================
# 3️⃣ 定义日期区间和窗口长度
# =========================
TRAIN_START_DATE = '2020-01-01'
TRAIN_END_DATE = '2020-01-08'
TRADE_START_DATE = '2020-01-08'
TRADE_END_DATE = '2020-01-11'
WINDOW_SIZE = 2  # 假设滑窗长度为 2 天# =========================
# 4️⃣ 切分训练集和交易集
# =========================
train = data_split_with_window(processed_full, TRAIN_START_DATE, TRAIN_END_DATE, window_size=0)
trade = data_split_with_window(processed_full, TRADE_START_DATE, TRADE_END_DATE, window_size=WINDOW_SIZE)print("\nTrain length:", len(train))
print(train)print("\nTrade length (with window):", len(trade))
print(trade)

5、汇总(生成)

明白 ✅ 你想要的是 快速生成假数据集(fake dataset)的方法,用来做 测试 / 调试 / 原型开发。这类数据不需要真实含义,只要结构和格式对。下面给你几类常用的办法:


🔹1. 用 Numpy / Pandas 随机生成

适合表格类任务(分类、回归、时间序列等):

import numpy as np
import pandas as pd# 随机生成 1000 行数据,含 3 个特征和一个标签
n = 1000
df = pd.DataFrame({"feature1": np.random.randn(n),            # 正态分布"feature2": np.random.randint(0, 100, n),  # 整数"feature3": np.random.rand(n),             # 0-1之间"label": np.random.choice([0, 1], n)       # 分类标签
})print(df.head())

🔹2. 用 Scikit-learn 自带造数函数

特别适合分类、回归、聚类实验。

from sklearn.datasets import make_classification, make_regression, make_blobs# 分类数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)# 回归数据
X_reg, y_reg = make_regression(n_samples=1000, n_features=5, noise=0.1)# 聚类数据
X_blobs, y_blobs = make_blobs(n_samples=1000, centers=3, n_features=2)

🔹3. 用 Faker 生成“真实感”假数据

适合生成带人名、地址、日期、公司等业务场景的数据。

from faker import Faker
import pandas as pdfake = Faker("en_US")  # 可改 "zh_CN" 生成中文数据
data = []
for _ in range(10):data.append({"name": fake.name(),"email": fake.email(),"address": fake.address(),"date": fake.date(),"amount": fake.random_int(100, 10000)})df = pd.DataFrame(data)
print(df.head())

🔹4. 用 Torch / TensorFlow 生成张量假数据

适合深度学习测试:

import torchX = torch.randn(1000, 20)          # 1000 个样本,每个20维特征
y = torch.randint(0, 2, (1000,))   # 二分类标签

🔹5. 时间序列/股票类假数据

cumsum 模拟股价走势:

import numpy as np
import pandas as pdn = 200
dates = pd.date_range("2023-01-01", periods=n)
prices = 100 + np.random.randn(n).cumsum()  # 模拟股价
volumes = np.random.randint(100, 1000, n)df = pd.DataFrame({"date": dates, "price": prices, "volume": volumes})
print(df.head())

✅ 总结:

  • 科研/调试numpy/pandas
  • 机器学习sklearn.datasets
  • 业务数据场景Faker
  • 深度学习torch.randn
  • 金融/时序cumsum

要不要我帮你写一个 通用函数 generate_fake_dataset(参数选择模式:分类/回归/业务/时间序列,直接返回 DataFrame)?

6、汇总(划分)

你想要快速切分数据集,可以根据数据量大小、数据类型(结构化/时间序列/文本/图像)选择不同方法。我整理了几种常用且高效的方法:


1. 使用 Python 原生方法(列表/数组切分)

适合小型数据集或自定义格式的数据。

import randomdata = list(range(1000))  # 假数据
random.shuffle(data)train_ratio = 0.8
train_size = int(len(data) * train_ratio)train_data = data[:train_size]
test_data = data[train_size:]
  • ✅ 简单、快速
  • ⚠️ 不适合复杂切分需求(分层、时间序列)

2. 使用 NumPy 切分

适合数值型大数组:

import numpy as npdata = np.arange(1000)
np.random.shuffle(data)train_ratio = 0.7
train_size = int(len(data) * train_ratio)train_data = data[:train_size]
test_data = data[train_size:]
  • ✅ 对大数组高效
  • ⚠️ 需要手动保证标签和特征对应

3. 使用 scikit-learn train_test_split

适合监督学习任务,有标签数据,可实现分层切分:

from sklearn.model_selection import train_test_splitX = np.random.rand(1000, 10)  # 特征
y = np.random.randint(0, 2, 1000)  # 标签X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y
)
  • ✅ 支持 train/val/test、分层采样
  • ✅ 支持随机种子控制可复现
  • ⚠️ 对时间序列不适合(会打乱顺序)

4. 使用 pandas 切分

适合 DataFrame 结构数据:

import pandas as pd
from sklearn.model_selection import train_test_splitdf = pd.DataFrame({'x': range(1000), 'y': range(1000)})train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
  • ✅ 可直接对 DataFrame 操作
  • ✅ 保留列名和索引
  • ⚠️ 默认打乱顺序,不适合时间序列

5. 时间序列专用切分

如果数据有时间顺序,不要随机打乱

data = pd.DataFrame({'date': pd.date_range('2020-01-01', periods=1000),'value': range(1000)})train_size = int(len(data) * 0.8)
train_data = data.iloc[:train_size]
test_data = data.iloc[train_size:]
  • ✅ 保证时间顺序
  • ✅ 可扩展到 sliding window 或 rolling split

6. HuggingFace Datasets 快速切分

如果使用 HF Datasets(文本/表格/CSV 数据集):

from datasets import Datasetdataset = Dataset.from_dict({'text': ['a', 'b', 'c', 'd', 'e'], 'label': [0,1,0,1,0]})
split = dataset.train_test_split(test_size=0.2, seed=42)train_dataset = split['train']
test_dataset = split['test']
  • ✅ 快速切分并保持 Dataset 对象
  • ✅ 支持随机种子
  • ✅ 可直接切分大规模文本/表格数据

🔹 总结

方法优势注意点
原生 Python/NumPy简单、高效需手动处理标签
scikit-learn支持分层、train/val/test打乱顺序,不适合时间序列
pandasDataFrame 友好打乱顺序,不适合时间序列
时间序列切分保留顺序无随机性
HuggingFace Datasets高效、可扩展需要安装 datasets

如果你愿意,我可以帮你写一个统一函数,只要传入 DataFrame 或 Dataset,就能根据比例快速切分成 train/val/test,还能选择随机或时间序列切分

你希望我帮你写吗?


文章转载自:

http://w7TGtkLj.qtkdn.cn
http://UESjXJrM.qtkdn.cn
http://JWleutOl.qtkdn.cn
http://8YjGe8Bn.qtkdn.cn
http://CJsENFal.qtkdn.cn
http://fe7OwNkL.qtkdn.cn
http://qH6ZaYK3.qtkdn.cn
http://dsPOSrjy.qtkdn.cn
http://xUDkvOLG.qtkdn.cn
http://BpKqNor8.qtkdn.cn
http://v3ATMVwO.qtkdn.cn
http://9pNMnfII.qtkdn.cn
http://CGCEvN1p.qtkdn.cn
http://QD39rzhQ.qtkdn.cn
http://reLUswBw.qtkdn.cn
http://hPYVYcsN.qtkdn.cn
http://E5XPRNDd.qtkdn.cn
http://djkDtf0P.qtkdn.cn
http://LinZqI0U.qtkdn.cn
http://1ma6JTBj.qtkdn.cn
http://1H87LfAU.qtkdn.cn
http://RAE1qS42.qtkdn.cn
http://5YYIltiW.qtkdn.cn
http://JPBaCIOi.qtkdn.cn
http://Wx2xK0mi.qtkdn.cn
http://rxXZfbBw.qtkdn.cn
http://aChnVjVT.qtkdn.cn
http://pJZXFPp5.qtkdn.cn
http://hHJCcx6H.qtkdn.cn
http://Wr0IByCL.qtkdn.cn
http://www.dtcms.com/a/374346.html

相关文章:

  • c++ 杂记
  • Effective Modern C++ 条款26:避免在通用引用上重载
  • Android14 init.rc中on boot阶段操作4
  • PYQT5界面类继承以及软件功能开发小记
  • 【机器学习】吴恩达机器学习笔记
  • UE5 性能优化(1) 模型合并,材质合并
  • Selenium4+Pytest自动化测试框架实战
  • 基于RK3568多网多串(6网+6串+2光)1U/2U机架式服务器在储能与电力的应用
  • 【Python】运动路线记录GPX文件的操作API函数,以及相关GUI界面(支持复制、拼接、数据生成、修改,SRT字幕生成等功能)
  • 西嘎嘎学习 - C++vector容器 - Day 7
  • 第三章:Python基本语法规则详解(二)
  • Next系统总结学习(一)
  • 备考系统分析师-专栏介绍和目录
  • 【rk3229/rk3228a android7.1 LPDDR EMMC EMCP 批量sdk】
  • Kali 自带工具 dirb:Web 路径扫描与 edusrc 挖掘利器
  • 【系统分析师】第2章-基础知识:数学与工程基础(核心总结)
  • 房屋安全鉴定机构评价
  • JAVA:io字符流FileReader和FileWriter基础
  • 从零深入理解嵌入式OTA升级:Bootloader、IAP与升级流程全解析
  • 7.0 热电偶的工作原理
  • GPT(Generative Pre-trained Transformer)模型架构与损失函数介绍
  • 【51单片机】【protues仿真】基于51单片机公交报站系统
  • linux常用命令(2)——系统管理
  • Yarn介绍与HA搭建
  • 记个笔记:Cocos打包安卓使用安卓通信模块
  • 基于Python的云原生TodoList Demo 项目,验证云原生核心特性
  • 2025年- H121-Lc28. 找出字符串中第一个匹配项的下标(数组)--Java版
  • 【底层机制】auto 关键字的底层实现机制
  • 【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
  • leedcode 算法刷题第二八天