赞
踩
英文原文: 点我.
声明:此博文为对原英文文章的翻译加个人的理解,一方面为自己学习所用,另一方面为需要中文scikit-multilearn文档的小伙伴提供便利。
这篇文章将会指导你经历为你的问题选择分类器的过程。
请注意,并没有已经建立的,科学地证实的设立的规则,来规定解决一个普遍的多标记分类问题如何选择一个分类器。成功的方法通常来自混合的直觉,关于哪些分类器值得考虑,分解为子问题以及实验模型选择。
在选择分类器之前,你需要考虑两件事情:
有两个方法来做选择
让我们加载一个数据集看首先需要做什么
from skmultilearn.dataset import load_dataset
X_train, Y_train, feature_names, label_names = load_dataset('emotions', 'train')
X_test, Y_test, _, _ = load_dataset('emotions', 'test')
print('X_train is {}'.format(X_train.shape))
print('Y_train is {}'.format(Y_train.shape))
运行程序,输出结果如下:
通常分类器的性能取决于三个要素:
上述代码输出了emotions数据集训练集的矩阵大小。我们可以使用numpy和输出矩阵中具有非零值的行列表来获取唯一标记组合的数量。
import numpy as np
print(np.unique(Y_train.rows).shape, np.unique(Y_test.rows).shape)
print(X_train.shape[1])
下面有一些方法来测量一个分类器的泛化质量:
这些措施可以在sklearn中方便使用:
from skmultilearn.adapt import MLkNN
classifier = MLkNN(k=3)
prediction = classifier.fit(X_train, y_train).predict(X_test)
import sklearn.metrics as metrics
metrics.hamming_loss(y_test, prediction)
Scikit-multilearn提供了11种分类器,通过标记分区和集合分类允许用在很多场景,下面看看影响性能的重要因素。 g ( x ) g(x) g(x)在一些分类器中表设计基本分类器的性能。
Scikit-multilearn允许使用scikit-learn的模型选择GridSearchCV API来估计参数,以选择用于多标记分类的最佳模型。 在最简单的版本中,它可以查找scikit-multilearn分类器的最佳参数,我们将在估算MLkNN参数的示例情况下显示,在更复杂的问题转换方法的情况下,它可以估计方法的超级参数和基类分类器参数。
在估计多标记分类器的超参数的情况下,我们首先导入相关的分类器和scikit-learn的GridSearchCV类。 然后我们定义要评估的参数值。 我们感兴趣的是k(-邻居的数量)和s (平滑参数)的组合效果最好。 我们还需要选择一个我们想要优化的度量 - 我们选择了F1宏观分数。
选择参数后,我们初始化并运行交叉验证网格搜索并打印最佳超参数。
from skmultilearn.dataset import load_dataset
from skmultilearn.adapt import MLkNN
from sklearn.model_selection import GridSearchCV
X_train, Y_train, feature_names, label_names = load_dataset('emotions', 'train')
X_test, Y_test, _, _ = load_dataset('emotions', 'test')
print('X_train is {}'.format(X_train.shape))
print('Y_train is {}'.format(Y_train.shape))
parameters = {'k':range(1,3), 's':[0.5, 0.7, 1.0]}
clf = GridSearchCV(MLkNN(), parameters, scoring='f1_macro')
clf.fit(X_train,Y_train)
print(clf.best_params_, clf.best_score_)
运行代码结果如下:
得到的值就可以直接用于分类器。
在问题转换分类器中,我们不仅需要估计超参数,还需要估计基本分类器的参数,甚至可能是问题转换方法。 让我们看一下使用标记空间分区的问题转换分类器集合的三层结构,参数包括:
classifier:它接受一个参数 - 一个用于将多标记分类问题转换为单标记分类的分类器,我们将在Label Powerset和Classifier Chains之间做出决定
classifier__classifier:这是转换策略的基本分类器,我们将在这里使用随机林
classifier__classifier__n_estimators:要在林中使用的树的数量,将传递给随机林对象
clusterer:标签空间分区类,我们将决定NetworkX库提供的两种方法。
from skmultilearn.problem_transform import ClassifierChain, LabelPowerset from sklearn.model_selection import GridSearchCV from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier from skmultilearn.cluster import NetworkXLabelGraphClusterer from skmultilearn.cluster import LabelCooccurrenceGraphBuilder from skmultilearn.ensemble import LabelSpacePartitioningClassifier from sklearn.svm import SVC parameters = { 'classifier': [LabelPowerset(), ClassifierChain()], 'classifier__classifier': [RandomForestClassifier()], 'classifier__classifier__n_estimators': [10, 20, 50], 'clusterer' : [ NetworkXLabelGraphClusterer(LabelCooccurrenceGraphBuilder(weighted=True, include_self_edges=False), 'louvain'), NetworkXLabelGraphClusterer(LabelCooccurrenceGraphBuilder(weighted=True, include_self_edges=False), 'lpa') ] } clf = GridSearchCV(LabelSpacePartitioningClassifier(), parameters, scoring = 'f1_macro') clf.fit(X_train, Y_train) print (clf.best_params_, clf.best_score_)
我运行之后显示如下:
得到这个结果我是迷茫的,经过百度之后,发现需要修改以上代码。、
from skmultilearn.problem_transform import ClassifierChain, LabelPowerset from sklearn.model_selection import GridSearchCV from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier # 修改的地方在这里 from skmultilearn.cluster.networkx import NetworkXLabelGraphClusterer # 修改的地方在这里 from skmultilearn.cluster import LabelCooccurrenceGraphBuilder from skmultilearn.ensemble import LabelSpacePartitioningClassifier from sklearn.svm import SVC parameters = { 'classifier': [LabelPowerset(), ClassifierChain()], 'classifier__classifier': [RandomForestClassifier()], 'classifier__classifier__n_estimators': [10, 20, 50], 'clusterer' : [ NetworkXLabelGraphClusterer(LabelCooccurrenceGraphBuilder(weighted=True, include_self_edges=False), 'louvain'), NetworkXLabelGraphClusterer(LabelCooccurrenceGraphBuilder(weighted=True, include_self_edges=False), 'lpa') ] } clf = GridSearchCV(LabelSpacePartitioningClassifier(), parameters, scoring = 'f1_macro') clf.fit(X_train, Y_train) print (clf.best_params_, clf.best_score_)
然鹅,还是报错ModuleNotFoundError: No module named ‘community’,这时,又经过百度,发现需要安装python-louvain
pip install python-louvain
安装之后,再运行,成功了。
个人能力有限,望各位批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。