用于sklearn分类的class_weight字典格式

时间:2019-05-20 02:57:49

标签: python tensorflow scikit-learn classification

尝试对约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.

关于此主题的在线信息有限,所以我想我会做一个清晰的帖子,并希望能掌握如何实现这一点。

1 个答案:

答案 0 :(得分:0)

经过吉米(Jimmy)的进一步研究和指导,我发现我误以为输入形式必须是错误的

  

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.出现的原因。寻找下一个字典