Keras类别权重设置遭遇KeyError问题求助
二分类任务类别权重设置引发KeyError:2问题
我之前见过类似问题,但现有方案无法解决我的问题。由于二分类数据存在严重不平衡,我在代码中添加了类别权重设置,代码如下:
from sklearn.utils.class_weight import compute_class_weight # 划分数据 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # 数据标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_val_scaled = scaler.transform(X_val) # 计算类别权重 class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(y_train), y=y_train) class_weights_dict = dict(zip(np.unique(y_train),class_weights)) print(f"Class Weights: {class_weights_dict}") def create_model(input_shape): model = Sequential() # 增加神经元数量和网络层数 model.add(Dense(128, activation='relu', input_shape=(input_shape,), kernel_regularizer=l2(0.01))) model.add(Dropout(0.4)) model.add(Dense(64, activation='relu', kernel_regularizer=l2(0.01))) model.add(Dropout(0.4)) model.add(Dense(32, activation='relu', kernel_regularizer=l2(0.01))) model.add(Dropout(0.4)) # 输出层 model.add(Dense(1, activation='sigmoid')) # 二分类任务 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model # 创建模型并训练 input_shape = X_train_scaled.shape[1] model = create_model(input_shape) # 训练模型 history = model.fit( X_train_scaled, y_train, epochs=20, batch_size=32, validation_data=(X_val_scaled, y_val), class_weight=class_weights )
输出的类别权重为:
Class Weights: {0: 0.5029020103669545, 1: 86.64717674574005}
但训练模型时出现如下KeyError错误:
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) Cell In[69], line 7 4 model = create_model(input_shape) 6 # 训练模型 ----> 7 history = model.fit( 8 X_train_scaled, y_train, 9 epochs=20, 10 batch_size=32, 11 validation_data=(X_val_scaled, y_val), 12 class_weight= class_weights 13 ) 15 # 保存模型 16 with open('model.pkl', 'wb') as file: File ~/.local/lib/python3.10/site-packages/keras/src/utils/traceback_utils.py:122, in filter_traceback.<locals>.error_handler(*args, **kwargs) 119 filtered_tb = _process_traceback_frames(e.__traceback__) 120 # 查看完整堆栈跟踪请调用: 121 # `keras.config.disable_traceback_filtering()` --> 122 raise e.with_traceback(filtered_tb) from None 123 finally: 124 del filtered_tb File ~/.local/lib/python3.10/site-packages/pandas/core/series.py:1111, in Series.__getitem__(self, key) 1108 return self._values[key] 1110 elif key_is_scalar: -> 1111 return self._get_value(key) 1113 # 将生成器转为列表再处理哈希部分 1114 # (我们会遍历生成器检查切片) 1115 if is_iterator(key): File ~/.local/lib/python3.10/site-packages/pandas/core/series.py:1227, in Series._get_value(self, label, takeable) 1224 return self._values[label] 1226 # 类似Index.get_value,但不回退到位置索引 -> 1227 loc = self.index.get_loc(label) 1229 if is_integer(loc): 1230 return self._values[loc] File ~/.local/lib/python3.10/site-packages/pandas/core/indexes/base.py:3809, in Index.get_loc(self, key) 3804 if isinstance(casted_key, slice) or ( 3805 isinstance(casted_key, abc.Iterable) 3806 and any(isinstance(x, slice) for x in casted_key) 3807 ): 3808 raise InvalidIndexError(key) -> 3809 raise KeyError(key) from err 3810 except TypeError: 3811 # 如果是类列表的键,_check_indexing_error会抛出InvalidIndexError 3812 # 否则重新抛出TypeError 3813 self._check_indexing_error(key) KeyError: 2
解决办法
修正
class_weight传入参数
你已经计算出了符合要求的字典class_weights_dict,但训练时错误传入了数组class_weights。Keras的class_weight参数要求传入字典格式,把代码里的class_weight=class_weights改成class_weight=class_weights_dict。排查标签取值是否异常
错误提示找不到键2,说明训练数据中存在标签值2,但你计算权重时只覆盖了0和1。先检查所有标签的唯一值:print("训练集标签唯一值:", np.unique(y_train)) print("验证集标签唯一值:", np.unique(y_val))如果确实存在标签2,要么清理数据移除该类别,要么重新计算包含所有类别的权重(注意这时候就不是二分类任务了,需要对应调整输出层)。
转换标签为NumPy数组
从错误栈看问题出在Pandas Series的索引匹配上,如果y_train是Pandas Series类型,建议转成NumPy数组:y_train = y_train.values y_val = y_val.values这样可以避免Keras混淆Pandas的索引和实际标签值。
内容的提问来源于stack exchange,提问作者Pinguiz
相关产品推荐
相关产品推荐

