sklearn 分类的 class_weight 字典格式

Posted

技术标签:

【中文标题】sklearn 分类的 class_weight 字典格式【英文标题】:class_weight dictionary format for sklearn classification 【发布时间】:2019-10-06 09:40:44 【问题描述】:

尝试对约 2500*~4000 个大型特征进行分类,并在训练数据随附一个置信度文档。

我正在尝试将置信度值用作分类器的 class_weight 参数,但无法理解 class_weight 所需的字典格式。 由于使用格式为 0:1, 1:0.66, 2:0.66, 3:1 ... 的字典,我一直在寻找错误的解决方案,但最近了解到该参数需要 [ 0:1, 1:1, 0:1, 1:5, 0:1, 1:1, 0:1, 1:1] [https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier]

我想我不明白 [a:b , c:d...] 的格式 我相信 d 是重量,但不确定结构的其余部分或如何从我的 csv 文件中到达那里。

到目前为止我所拥有的:


>>> with open('confidence.csv') as csvfile:
>>>    reader = csv.DictReader(csvfile, delimiter=",")
>>>    confidence_dict=int(row['ID'])-1:int(float(row['confidence'])) for row in reader #float(row['confidence'])

>>> print(confidence_dict)
0: 0.66, 1: 1, 2: 0.66, 3: 0.66, 4: 1, ...

>>> print(X)
    v0    v1    v2    v3     ...
0   1.413 0.874 0.506 1.790
1   0.253 0.253 0.486 1.864 
2   1.863 0.174 0.018 1.789
3   0.253 0.213 0.486 1.834
...

>>> print(y)
0   0
1   0
2   1
3   1
...

>>> linearSVC = LinearSVC(random_state=0, tol=1e-6, class_weight=confidence_dict)
>>> linearSVC.fit(X, y)

Class label not present. 在尝试使用当前字典形式中的类权重时返回。如果没有输入班级权重,则不会发生这种情况。

ValueError: Class label 2 not present.

网上关于这个话题的信息有限,所以我想我会尝试发表一个清晰的帖子,希望能掌握如何实现这一点。

【问题讨论】:

没有经验的发帖者,因此任何建议或反馈也表示赞赏 我很确定您在 confidence_dict 中提供的类权重比在 y 中实际存在的要多。该错误表示您的y 向量中没有类标签“2”。 y 向量中有哪些值? Xyconfidence_dict的长度都是一样的。但你确实让我做某事。在我复制 DataFrame 的地方,它变成了 pandas.core.series.Series。我只需将其转换为 pd.DataFrame() 即可获得所需的 pandas.core.frame.DataFrame 类型。但现在我有同样的问题,但ValueError: Class label 3 not present. 我的意思是y 中唯一值的数量与您在confidence_dict 中提供的类的数量不同:class_weights。分类器无法将类权重附加到标签上,结果中看不到,这是您的y-vector 啊,我明白了。您误解了类权重参数的用途。班级权重旨在处理不平衡的班级,这意味着您拥有比其他班级更多的班级。如果您的 y 向量只有 1 和 0,那么您只有 2 个类。每个班级只能提供一个权重 【参考方案1】:

经过 jimmy 在 cmets 的进一步研究和指导,我了解到我错误地认为输入需要以表格形式

dict(x1, x2, x3,...xn)

其中 x 是该预测的置信度。 class_weight 需要是表单中的字典

dict(0:y0, 1:z0, 0:y1, 1:z2, 0:y1, 1:z1,...)

其中 y 是结果 0 的置信度/权重,z 是结果 1 的置信度/权重。

这就是出现ValueError: Class label 2 not present. 的原因。它正在寻找下一本字典

【讨论】:

以上是关于sklearn 分类的 class_weight 字典格式的主要内容,如果未能解决你的问题,请参考以下文章

class_weights 如何应用于 sklearn 逻辑回归?

为啥 sklearn 中逻辑回归的等效 class_weights 会产生不同的结果?

类标签不存在 sklearn.ensemble.RandomForestClassifier for class_weight

在 sklearn RandomForestClassifier 中,class_weight=None 是不是等同于 class_weight="balanced_subsample&qu

如何在 sklearn 中对不平衡数据集执行交叉验证

sample_weight 与 scikit-learn 中的 class_weight 相比如何?