数据做StratifiedKFold方法

理论:
  • KFold随机分割数据,不会考虑数据的分布情况。
  • StratifiedKFold会根据原始数据的分布情况,分割出同分布的数据。
  • 使用场景:
  1. 类别不平衡:当数据集中某些类别的样本数量明显少于其他类别时,使用 StratifiedKFold 可以确保每个折叠中各类别的比例与原始数据集相同,从而避免某些折叠中缺少某些类别样本的情况。

  2. 需要保持数据分布一致:为了在训练和测试过程中保持一致的数据分布,确保模型在每个折叠中的表现能够更好地反映其泛化能力。

  3. 二分类问题:在一个二分类问题中,如果类别 0 和类别 1 的样本数量相差很大,普通的 K 折交叉验证可能会导致某些折叠中几乎没有类别 1 的样本,从而影响模型的训练效果。
  4. 多分类问题:在一个多分类问题中,某些类别的样本可能非常稀少。StratifiedKFold 可以确保每个折叠中所有类别都有样本,从而更全面地评估模型性能。
实践:
from pathlib import Path
from sklearn.model_selection import StratifiedKFold
import pandas as pd

# 1.输入输出文件

OUTPUT = Path("/root/autodl-fs/output") 

INPUT_DIR = Path("./")

train_data_0 = pd.read_csv("/root/autodl-fs/train_drcat_04.csv")
train_data_0 = train_data_0[train_data_0["label"]==1] #筛选,赋值
train_data_0 = train_data_0[["text","label"]] #重新选择赋值[[ ]]返回包含两列新的数据框
train_data_0['text'] = train_data_0['text'].str.replace('\n', '') #替换为空字符串

# print(train_data_0.iloc[0:2]) #.lioc[:]查看前两行
# pdb.set_trace()

train_data_1 = pd.read_csv("/root/autodl-fs/daigt_external_dataset.csv", sep=',')
train_data_1 = train_data_1.rename(columns={'generated': 'label'})#列重命名
train_data_1 = train_data_1[["source_text"]] #选择列
train_data_1.columns = ["text"]# 将列名更改为'text'
train_data_1['text'] = train_data_1['text'].str.replace('\n', '')# 从'text'列中删除换行符
train_data_1["label"] = 1# 添加一个名为'label'的新列,所有值均设置为1

train_data_2 = pd.read_csv("/root/autodl-fs/train_essays_RDizzl3_seven_v1.csv")

train_df = pd.concat([train_data_0, train_data_1, train_data_2])
train_df.reset_index(inplace=True, drop=True)

train_df['text_length'] = train_df['text'].apply(lambda x:len(x.split()))

from sklearn.model_selection import StratifiedKFold

# 初始化交叉验证,设置5折交叉验证,打乱数据,并固定随机种子姨确保结果可以复现
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 从数据框中分离特征x与标签y
X = train_df.loc[:, train_df.columns != "label"]
y = train_df.loc[:, train_df.columns == "label"]

# 执行分层k折交叉验证,并将折号分配给训练数据库
for i, (train_index, valid_index) in enumerate(skf.split(X, y)):
    train_df.loc[valid_index, "fold"] = i
#输出每个折叠中标签的值计数
print(train_df.groupby("fold")["label"].value_counts())


# fold0 as valid
valid_df = train_df[train_df["fold"] == 0]
train_df = train_df[train_df["fold"] != 0]

# 打印验证集和训练集的统计信息
print("Validation set:")
print(valid_df.head())
print("Training set:")
print(train_df.head())

# 保存训练集和验证集到 CSV 文件
train_df.to_csv(OUTPUT / "train.csv", index=False)
valid_df.to_csv(OUTPUT / "valid.csv", index=False)

print(f"Training data saved to {OUTPUT / 'train.csv'}")
print(f"Validation data saved to {OUTPUT / 'valid.csv'}")

train.csv:valid.csv:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值