python - 多标签计算类权重 - 不可散列的类型
问题描述
使用 Keras、sklearn 等在我的神经网络中处理具有13 个可能输出的多标签分类问题......
每个输出可以是一个数组,如 [0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1 ,0]。
我有一个不平衡数据集,我尝试应用compute_class_weight方法,例如:
class_weight = compute_class_weight('balanced', np.unique(Y_train), Y_train)
当我尝试运行我的代码时,我得到了Unhashable Type: 'numpy.ndarray':
Traceback (most recent call last):
File "main.py", line 115, in <module>
train(dataset, labels)
File "main.py", line 66, in train
class_weight = compute_class_weight('balanced', np.unique(Y_train), Y_train)
File "/home/python-env/env/lib/python3.6/site-packages/sklearn/utils/class_weight.py", line 41, in compute_class_weight
if set(y) - set(classes):
TypeError: unhashable type: 'numpy.ndarray'
我知道那是因为我使用数组,已经尝试添加一些字典,
IE:
class_weight_dict = dict(enumerate(np.unique(y_train), class_weight))
好吧,我不知道该怎么办,尝试了其他策略,但没有成功......有什么想法吗?
提前致谢!
解决方案
最近遇到了类似的问题,分享一下我的思考过程。
如果您的“类别不平衡”意味着某些标签组合比其他标签组合出现的频率更高,例如有 10 个 [0,1,0,0,1] 但只有 1 个 [0,1,0,0,0],您可以compute_sample_weight("balanced", Y_train)
改用的compute_class_weight()
。如果我是对的,这个函数会为训练数据集中的每个数据赋予权重。返回元组的长度是训练数据集的长度(即输入数据的数量)。该样本权重可以与 X_train 和 y_train 一起作为第三个参数添加到您的训练集中。
如果您的“类不平衡”指的是预测标签中的负数多于正数(0 多于 1)——这种情况会在训练过程中给出不切实际的高准确度分数,我认为上面@Prateek 的答案可以是一个解决方案,函数给出的权重是 0 和 1。
有人在这里出色地构建了一个代码,在 Keras 中使用类权重的多标签分类来回答这个问题。
如果您的“类别不平衡”是指某些类别的外观比其他类别多,例如在 10 个样本中,有 9 个包含标签 2,但其中只有 1 个包含标签 3,我不知道如何解决它使用 class_weight 或 sample_weight。也许你可以尝试硬编码,统计每个类的出现次数,然后通过以下公式计算每个类的权重:
# weight_of_class_1 = n_samples/n_class*n_freq_class_1
# n_sample: total number of data
# n_class: number of class
# n_freq_class_1: number of appearance of class 1 in all your labels.
此公式用于 compute_class_weight,但我不确定计算出的权重是否适合您的情况。
推荐阅读
- apache-nifi - QueryRecord 在使用属性时返回错误 (Apache NiFi)
- c++ - 使用 std::tuple 来实现 operator<、= 等是否有效且正确?
- sql - 在 SQL Server 中结束过程创建的语法
- python - conda 列出不在 Jupyter 活动环境中的包
- python - 如何为目录中的所有文件夹运行 Python 命令
- swift - 如何在 Swift 中使用 URL 结构?
- java - 不兼容的类型 - 发现 void java.util.Optional
- qt - 关于导入.STL文件的Qt QML问题
- python - 未能将上传的 txt 文件保存在烧瓶中
- python - 抓取和解析 BeautifulSoup TR:TD 表时的空白初始行