我想计算我的模型的F1分数。但我收到一个警告,得到一个0.0的F1分数,我不知道该怎么办。
这里是源代码。
def model_evaluation(dict):
for key,value in dict.items():
classifier = Pipeline([('tfidf', TfidfVectorizer()),
('clf', value),
])
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
print("Accuracy Score of" , key , ": ", metrics.accuracy_score(y_test,predictions))
print(metrics.classification_report(y_test,predictions))
print(metrics.f1_score(y_test, predictions, average="weighted", labels=np.unique(predictions), zero_division=0))
print("---------------","\n")
dlist = { "KNeighborsClassifier": KNeighborsClassifier(3),"LinearSVC":
LinearSVC(), "MultinomialNB": MultinomialNB(), "RandomForest": RandomForestClassifier(max_depth=5, n_estimators=100)}
model_evaluation(dlist)
这里是结果。
Accuracy Score of KNeighborsClassifier : 0.75
precision recall f1-score support
not positive 0.71 0.77 0.74 13
positive 0.79 0.73 0.76 15
accuracy 0.75 28
macro avg 0.75 0.75 0.75 28
weighted avg 0.75 0.75 0.75 28
0.7503192848020434
---------------
Accuracy Score of LinearSVC : 0.8928571428571429
precision recall f1-score support
not positive 1.00 0.77 0.87 13
positive 0.83 1.00 0.91 15
accuracy 0.89 28
macro avg 0.92 0.88 0.89 28
weighted avg 0.91 0.89 0.89 28
0.8907396950875212
---------------
Accuracy Score of MultinomialNB : 0.5357142857142857
precision recall f1-score support
not positive 0.00 0.00 0.00 13
positive 0.54 1.00 0.70 15
accuracy 0.54 28
macro avg 0.27 0.50 0.35 28
weighted avg 0.29 0.54 0.37 28
0.6976744186046512
---------------
C:\Users\Cey\anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Accuracy Score of RandomForest : 0.5714285714285714
precision recall f1-score support
not positive 1.00 0.08 0.14 13
positive 0.56 1.00 0.71 15
accuracy 0.57 28
macro avg 0.78 0.54 0.43 28
weighted avg 0.76 0.57 0.45 28
0.44897959183673475
---------------
谁能告诉我该怎么做?只有在使用 "MultinomialNB() "分类器时,我才会收到这个消息。
第二,在使用高斯分类器(GaussianNB())扩展字典时,我收到这样一条错误信息:
当使用高斯分类器(GaussianNB())扩展字典时,我收到了这个错误信息。
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.
我应该在这里做什么?
谁能告诉我该怎么做?只有在使用 "MultinomialNB() "分类器时,我才会收到这样的信息。
第一个错误似乎表明,在使用该函数时,没有预测到一个特定的标签。MultinomialNB
导致未定义的 f-score
或 不明确,因为缺失值被设置为 0
. 解释如下 此处
当使用高斯分类器(GaussianNB())扩展字典时,我收到了这个错误信息。 TypeError: 传递了一个稀疏矩阵,但需要密集数据。使用X.toarray()转换为一个密集的numpy数组。
按照这个问题,错误是很明确的,问题是 TfidfVectorizer
正在返回一个 sparse
矩阵,它不能作为输入用于 GaussianNB
. 所以,在我看来,你要么避免使用 GaussianNB
或者你添加一个中间变压器,把稀疏数组变成密集数组,我不建议这样做的结果是一个 tf-idf
矢量化。