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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:24:53