我想对我的文本数据执行聚类。为了找到最佳的文本预处理参数,我制作了管道并将其放入 GridSearchCV:
text_clf = Pipeline([('vect1', CountVectorizer(analyzer = "word"),
('myfun', MyLemmanization(lemmatize=True,
leave_other_words = True)),
('vect2', CountVectorizer(analyzer = "word",
max_df=0.95, min_df=2,
max_features=2000)),
('tfidf', TfidfTransformer()),
('clust', KMeans(n_clusters=10, init='k-means++',
max_iter=100, n_init=1, verbose=1))])
parameters = {'myfun__lemmatize': (True, False),
'myfun__leave_other_words': (True, False)}
gs_clf = GridSearchCV(text_clf, parameters, n_jobs=1, scoring=score)
gs_clf = gs_clf.fit(text_data)
Run Code Online (Sandbox Code Playgroud)
在哪里 score
score = make_scorer(my_f1, greater_is_better=True)
Run Code Online (Sandbox Code Playgroud)
并my_f1
具有以下形式:
def my_f1(labels_true, labels_pred):
# fancy stuff goes here
Run Code Online (Sandbox Code Playgroud)
并且专为聚类而设计
所以我的问题是:如何使它起作用?如何通过labels_pred
,作为一个自然人,我只能做
gs_clf.fit(data)
Run Code Online (Sandbox Code Playgroud)
而在分类中有可能:
gs_clf.fit(data, labels_true)
Run Code Online (Sandbox Code Playgroud)
我知道我可以编写我的自定义函数,就像我做的那样MyLemmanization
:
class MyLemmanization(BaseEstimator, TransformerMixin):
def __init__(self, …
Run Code Online (Sandbox Code Playgroud) 我试图了解在数据集不平衡的情况下,AUC 为何是比分类准确性更好的指标。
假设数据集包含 3 个类别的 1000 个示例,如下所示:
a = [[1.0, 0, 0]]*950 + [[0, 1.0, 0]]*30 + [[0, 0, 1.0]]*20
Run Code Online (Sandbox Code Playgroud)
显然,这个数据是不平衡的。
一个幼稚的策略是预测属于第一类的每个点。
假设我们有一个具有以下预测的分类器:
b = [[0.7, 0.1, 0.2]]*1000
Run Code Online (Sandbox Code Playgroud)
使用列表中的真实标签a
和列表中的预测b
,分类精度为 0.95。
因此,人们会认为该模型确实在分类任务上表现良好,但这并不是因为该模型正在预测一个类别中的每个点。
因此,建议使用 AUC 指标来评估不平衡的数据集。如果我们使用 TF Keras AUC
指标
预测 AUC ,我们会得到 ~0.96。
如果我们通过设置 来使用 sklearn f1-score指标来预测 f1-score ,我们会得到 0.95。 b=[[1,0,0]]*1000
现在我有点困惑,因为所有指标(准确度、AUC 和 f1-score)都显示出很高的价值,这意味着该模型非常擅长预测任务(但这里的情况并非如此)。
我在这里遗漏了哪一点以及我们应该如何解释这些价值观?
谢谢。
python scikit-learn auc multiclass-classification tensorflow2.0