例如来自训练集的 SVC 中的低置信度分数
Low confidence score in SVC for example from training set
这是我的 SVC classifier 代码。
vectorizer = TfidfVectorizer(lowercase=False)
train_vectors = vectorizer.fit_transform(training_data)
classifier_linear = svm.LinearSVC()
clf = CalibratedClassifierCV(classifier_linear)
linear_svc_model = clf.fit(train_vectors, train_labels)
training_data
这里是英文句子的列表,train_lables
是关联的标签。在创建 training_data
的最终版本之前,我进行了通常的停用词删除和一些预处理。这是我的测试代码:
test_lables = ["no"]
test_vectors = vectorizer.transform(test_lables)
prediction_linear = clf.predict_proba(test_vectors)
counter = 0
class_probability = {}
lables = []
for item in train_labels:
if item in lables:
continue
else:
lables.append(item)
for val in np.nditer(prediction_linear):
new_val = val.item(0)
class_probability[lables[counter]] = new_val
counter = counter + 1
sorted_class_probability = sorted(class_probability.items(), key=operator.itemgetter(1), reverse=True)
print(sorted_class_probability)
现在,当我 运行 带有训练集中已经存在的短语的代码(在本例中是单词 'no')时,它可以正确识别,但置信度分数甚至更低.9
。输出结果如下:
[('no', 0.8474342514152964), ('hi', 0.06830103628879058), ('thanks', 0.03070201906552546), ('confused', 0.02647134535600733), ('ok', 0.015857384248465656), ('yes', 0.005961945963546264), ('bye', 0.005272017662368208)]
当我在线学习时,我发现训练集中已有数据的置信度分数通常接近 1
或几乎 1
,其余的几乎可以忽略不计。我该怎么做才能获得更好的置信度分数?我是否应该担心,如果我添加更多 class,置信度分数会进一步下降,我将很难肯定地指出一个突出的 class?
只要您的分数能帮助您正确分类输入,您就完全不必担心。如果有的话,如果您对训练数据中已有输入的信心过高,则可能意味着您的方法对数据过度拟合,无法推广到看不见的数据。
但是,您可以通过更改惩罚参数来调整方法的[=25=]复杂性。在 LinearSVC
的情况下,您同时拥有 penalty
和 C
参数。尝试这两者的不同值并观察效果。确保您还观察了对看不见的测试集的影响。
只是 C
的值应该是指数 space,例如。 [0.001, 0.01, 0.1, 1, 10, 100, 1000]
让您看到有意义的效果。
如果您对此类线性模型和调整参数感兴趣,SGDClassifier
可能与您的情况相关。
这是我的 SVC classifier 代码。
vectorizer = TfidfVectorizer(lowercase=False)
train_vectors = vectorizer.fit_transform(training_data)
classifier_linear = svm.LinearSVC()
clf = CalibratedClassifierCV(classifier_linear)
linear_svc_model = clf.fit(train_vectors, train_labels)
training_data
这里是英文句子的列表,train_lables
是关联的标签。在创建 training_data
的最终版本之前,我进行了通常的停用词删除和一些预处理。这是我的测试代码:
test_lables = ["no"]
test_vectors = vectorizer.transform(test_lables)
prediction_linear = clf.predict_proba(test_vectors)
counter = 0
class_probability = {}
lables = []
for item in train_labels:
if item in lables:
continue
else:
lables.append(item)
for val in np.nditer(prediction_linear):
new_val = val.item(0)
class_probability[lables[counter]] = new_val
counter = counter + 1
sorted_class_probability = sorted(class_probability.items(), key=operator.itemgetter(1), reverse=True)
print(sorted_class_probability)
现在,当我 运行 带有训练集中已经存在的短语的代码(在本例中是单词 'no')时,它可以正确识别,但置信度分数甚至更低.9
。输出结果如下:
[('no', 0.8474342514152964), ('hi', 0.06830103628879058), ('thanks', 0.03070201906552546), ('confused', 0.02647134535600733), ('ok', 0.015857384248465656), ('yes', 0.005961945963546264), ('bye', 0.005272017662368208)]
当我在线学习时,我发现训练集中已有数据的置信度分数通常接近 1
或几乎 1
,其余的几乎可以忽略不计。我该怎么做才能获得更好的置信度分数?我是否应该担心,如果我添加更多 class,置信度分数会进一步下降,我将很难肯定地指出一个突出的 class?
只要您的分数能帮助您正确分类输入,您就完全不必担心。如果有的话,如果您对训练数据中已有输入的信心过高,则可能意味着您的方法对数据过度拟合,无法推广到看不见的数据。
但是,您可以通过更改惩罚参数来调整方法的[=25=]复杂性。在 LinearSVC
的情况下,您同时拥有 penalty
和 C
参数。尝试这两者的不同值并观察效果。确保您还观察了对看不见的测试集的影响。
只是 C
的值应该是指数 space,例如。 [0.001, 0.01, 0.1, 1, 10, 100, 1000]
让您看到有意义的效果。
如果您对此类线性模型和调整参数感兴趣,SGDClassifier
可能与您的情况相关。