You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多CSV文件训练MLP时UnpicklingError报错及多数据集训练方案问询

问题解答

1. 当前逐文件训练实现的错误说明

你当前逐文件训练的逻辑本身是可实现的,但代码里存在3处明确错误:

  • 文件读取方式错误:CSV是文本格式文件,不能用pickle.load()读取(pickle仅能解析Python专属序列化的.pkl格式文件),这是你触发UnpicklingError的直接原因
  • 模型编译顺序错误:model.compile()必须放在model.fit()之前执行,否则模型没有定义优化器、损失函数,训练完全不生效
  • 缺少必要的预处理步骤:神经网络对输入特征的尺度高度敏感,你未对特征做标准化处理,会导致模型收敛慢、最终效果差

修正后的核心代码示例:

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 初始化标准化器,提前用全量训练数据拟合保证分布一致
scaler = StandardScaler()
all_X = []
for f in files:
    df = pd.read_csv(f) # 可根据你的CSV实际格式调整header、sep等参数
    all_X.append(df.iloc[:,:-1].values)
all_X = np.concatenate(all_X, axis=0)
scaler.fit(all_X)

# 修正后的生成器
def BatchGenerator(files, scaler):
    for file in files:
        current_data = pd.read_csv(file).values
        X_train = current_data[:,:-1]
        y_train = current_data[:,-1]
        X_train_scaled = scaler.transform(X_train)
        yield (X_train_scaled, y_train)

# 先编译模型再训练
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

n_epochs = 100
for epoch in range(n_epochs):
    for (X_train, y_train) in BatchGenerator(files, scaler):
        # 新版Keras用epochs参数替代旧版nb_epoch
        model.fit(X_train, y_train, batch_size=32, epochs=1, verbose=1)

2. 多训练数据集下的更优实现方案

方案1:内存足够时直接拼接训练

如果两个文件总数据量可以完全载入内存,优先选择拼接后做随机拆分训练,收敛更稳定,不会出现模型在两个数据集分布上反复震荡的问题:

# 拼接全量数据
df1 = pd.read_csv(file1)
df2 = pd.read_csv(file2)
all_data = pd.concat([df1, df2], axis=0).values
X = all_data[:,:-1]
y = all_data[:,-1]

# 拆分训练集、验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)

# 加入早停防止过拟合
es = EarlyStopping(patience=10, restore_best_weights=True)
model.fit(X_train_scaled, y_train, batch_size=32, epochs=100, validation_data=(X_val_scaled, y_val), callbacks=[es])

方案2:数据量过大时用Keras Sequence生成器

如果数据量太大无法全部载入内存,用Keras原生的Sequence类实现生成器,比你自定义的生成器稳定性更高,支持多进程加载、自动打乱数据顺序,避免数据顺序导致的模型偏差。

方案3:分布差异大时做加权训练

如果两个文件的数据分布差异较大,可在逐文件训练时加入学习率衰减策略,或每个文件训练完成后做加权参数平均,避免模型偏向某一个数据集的分布。


内容的提问来源于stack exchange,提问作者satyam sangeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:27:03