Keras训练信用卡欺诈模型报ValueError: Data cardinality错误如何解决
错误原因与修复方案
核心报错根因
你遇到的样本数量不匹配问题是由多个代码逻辑错误共同导致的,具体问题点如下:
- 标签变量未正确定义,特征与标签赋值逻辑混乱
原代码开头先把trainSamples赋值为标签列Class,后续又将其覆盖为特征集,全程没有给trainLabels赋值,直接导致标签数据异常。 - 特征缩放前的维度变形错误,是触发报错的直接原因
原始特征集形状是(284807, 29)(28万多样本,29个特征),执行trainSamples.reshape(-1,1)后,形状变成了(284807*29, 1)也就是700多万条单特征样本,和28万的标签量完全不匹配,对应你报错里的x和y大小差异。 - 样本和标签分别独立打乱,破坏了特征与标签的对应关系
shuffle操作必须同时作用于样本和标签,单独打乱两者会导致样本和标签无法匹配,即使解决数量问题后续训练也会完全失效。 - 模型输入维度和实际特征维度不匹配
每个样本有29个特征,模型的input_shape应该设置为(29,),而非(1,)。
修正后可运行代码
import numpy as np import pandas as pd import tensorflow as tf from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam from sklearn.utils import shuffle from sklearn.preprocessing import MinMaxScaler data = pd.read_csv("creditcard.csv") # 正确拆分特征和标签 labels = ['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount'] trainSamples = data[labels] trainLabels = data['Class'] trainSamples = np.array(trainSamples) trainLabels = np.array(trainLabels) # 同时打乱样本和标签,保留对应关系 trainSamples, trainLabels = shuffle(trainSamples, trainLabels) # 特征缩放不需要额外变形,直接对29个特征做归一化 scaler = MinMaxScaler(feature_range = (0, 1)) scaledTrainSample = scaler.fit_transform(trainSamples) # 输入维度修改为29,对应特征数量 model = Sequential([ Dense(units = 16, input_shape = (29, ), activation = 'relu'), Dense(units = 32, activation = 'relu'), Dense(units = 2, activation = 'softmax') ]) model.compile(optimizer = Adam(learning_rate = 0.0001), loss = 'sparse_categorical_crossentropy', metrics = ['accuracy']) model.fit(x = scaledTrainSample, y = trainLabels, validation_split = 0.1, batch_size = 10, epochs = 300, verbose = 2)
内容的提问来源于stack exchange,提问作者Abuzz
相关产品推荐
相关产品推荐

