快速構建數據集-假數據
- 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 dictDataset.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)
? 特點
- 保留時間順序,不打亂。
- 驗證集和測試集前加
window_size
歷史數據,保證模型有完整的序列輸入。 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))
? 特點
- 保留時間順序,適合時間序列。
- 驗證集和測試集前補歷史窗口,方便滑動窗口模型輸入。
- 輸出仍然是 HF Dataset 對象,可以直接用于
map
、set_format
等處理。
如果你需要,我可以幫你寫一個通用函數,直接傳入:
- HF Dataset
train_ratio
、val_ratio
window_size
然后返回 train/val/test
并自動處理窗口前置,非常適合批量時間序列切分。
你希望我寫嗎?
明白了,你想用 HuggingFace Datasets 做 時間序列切分,并且 驗證集和測試集前面要加上窗口長度的數據,保證滑窗模型輸入完整。下面給你一個通用方法。
1?? 思路
假設:
dataset
是 HF Datasetwindow_size
是滑窗長度- 切分比例:
train_ratio
、valid_ratio
、test_ratio
做法:
- 按比例計算訓練集、驗證集、測試集的結束索引。
- 驗證集前加上訓練集最后
window_size
行。 - 測試集前加上驗證集最后
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 | 打亂順序,不適合時間序列 |
pandas | DataFrame 友好 | 打亂順序,不適合時間序列 |
時間序列切分 | 保留順序 | 無隨機性 |
HuggingFace Datasets | 高效、可擴展 | 需要安裝 datasets |
如果你愿意,我可以幫你寫一個統一函數,只要傳入 DataFrame 或 Dataset,就能根據比例快速切分成 train/val/test
,還能選擇隨機或時間序列切分。
你希望我幫你寫嗎?