使用 scikit-learn 实现多类别及多标签分类算法
多标签分类格式
对于多标签分类问题而言,一个样本可能同时属于多个类别。如一个新闻属于多个话题。这种情况下,因变量yy需要使用一个矩阵表达出来。
而多类别分类指的是y的可能取值大于2,但是y所属类别是唯一的。它与多标签分类问题是有严格区别的。所有的scikit-learn分类器都是默认支持多类别分类的。但是,当你需要自己修改算法的时候,也是可以使用scikit-learn
实现多类别分类的前期数据准备的。
多类别或多标签分类问题,有两种构建分类器的策略:One-vs-All及One-vs-One。下面,通过一些例子进行演示如何实现这两类策略。
#
from sklearn.preprocessing import MultiLabelBinarizer
y = [[2,3,4],[2],[0,1,3],[0,1,2,3,4],[0,1,2]]
MultiLabelBinarizer().fit_transform(y)
array([[0, 0, 1, 1, 1],
[0, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0]])
One-Vs-The-Rest策略
这个策略同时也称为One-vs-all策略,即通过构造K个判别式(K为类别的个数),第ii个判别式将样本归为第ii个类别或非第ii个类别。这种分类方法虽然比较耗时间,但是能够通过每个类别对应的判别式获得关于该类别的直观理解(如文本分类中每个话题可以通过只属于该类别的高频特征词区分)。
多类别分类学习
from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X,y = iris.data,iris.target
OneVsRestClassifier(LinearSVC(random_state = 0)).fit(X,y).predict(X)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
多标签分类学习
Kaggle上有一个关于多标签分类问题的竞赛:Multi-label classification of printed media articles to topics。
关于该竞赛的介绍如下:
This is a multi-label classification competition for articles coming from Greek printed media. Raw data comes from the scanning of print media, article segmentation, and optical character segmentation, and therefore is quite noisy. Each article is examined by a human annotator and categorized to one or more of the topics being monitored. Topics range from specific persons, products, and companies that can be easily categorized based on keywords, to more general semantic concepts, such as environment or economy. Building multi-label classifiers for the automated annotation of articles into topics can support the work of human annotators by suggesting a list of all topics by order of relevance, or even automate the annotation process for media and/or categories that are easier to predict. This saves valuable time and allows a media monitoring company to expand the portfolio of media being monitored.
我们从该网站下载相应的数据,作为多标签分类的案例学习。
数据描述
这个文本数据集已经用词袋模型进行形式化表示,共201561个特征词,每个文本对应一个或多个标签,共203个分类标签。该网站提供了两种数据格式:ARFF
和LIBSVM
,ARFF
格式的数据主要适用于weka,而LIBSVM
格式适用于matlab中的LIBSVM
模块。这里,我们采用LIBSVM
格式的数据。
数据的每一行以逗号分隔的整数序列开头,代表类别标签。紧接着是以\t分隔的id:value
对。其中,id
为特征词的ID,value
为特征词在该文档中的TF-IDF
值。
形式如下。
58,152 833:0.032582 1123:0.003157 1629:0.038548 ...
数据载入
# load modules
import os
import sys
import numpy as np
from sklearn.datasets import load_svmlight_file
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn import metrics
# set working directory
os.chdir("D:\\my_python_workfile\\Thesis\\kaggle_multilabel_classification")
# read files
X_train,y_train = load_svmlight_file("./data/wise2014-train.libsvm",dtype=np.float64,multilabel=True)
X_test,y_test = load_svmlight_file("./data/wise2014-test.libsvm",dtype = np.float64,multilabel=True)
模型拟合及预测
# transform y into a matrix
mb = MultiLabelBinarizer()
y_train = mb.fit_transform(y_train)
# fit the model and predict
clf = OneVsRestClassifier(LogisticRegression(),n_jobs=-1)
clf.fit(X_train,y_train)
pred_y = clf.predict(X_test)
模型评估
由于没有关于测试集的真实标签,这里看看训练集的预测情况。
# training set result
y_predicted = clf.predict(X_train)
#report
#print(metrics.classification_report(y_train,y_predicted))
import numpy as np
np.mean(y_predicted == y_train)
0.99604661023482433
保存结果
# write the output
out_file = open("pred.csv","w")
out_file.write("ArticleId,Labels\n")
id = 64858
for i in xrange(pred_y.shape[0]):
label = list(mb.classes_[np.where(pred_y[i,:]==1)[0]].astype("int"))
label = " ".join(map(str,label))
if label == "": # if the label is empty
label = "103"
out_file.write(str(id+i)+","+label+"\n")
out_file.close()
One-Vs-One策略
One-Vs-One策略即是两两类别之间建立一个判别式,这样,总共需要K(K−1)/2K(K−1)/2个判别式,最后通过投票的方式确定样本所属类别。
多类别分类学习
from sklearn import datasets
from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X,y = iris.data,iris.target
OneVsOneClassifier(LinearSVC(random_state = 0)).fit(X,y).predict(X)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
参考文献
http://yphuang.github.io/blog/2016/04/22/Multiclass-and-Multilabel-algorithms-Implementation-in-sklearn/
相关文章
- 自动数据增强论文及算法解读(附代码)
- python实现K近邻算法案例
- c语言 银行家算法(完整代码实现)
- 论文拾萃|用带改进下界的Branch-and-Bound 算法求解Block Relocation Problem
- NSGA3算法及其MATLAB版本实现
- Google Research等机构提出新的AI算法以了解人脑网络中的电刺激效应
- 手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)
- 操作系统之——银行家算法C语言实现
- 操作系统实验:银行家算法C语言实现
- 银行家算法-C语言实现
- 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等[通俗易懂]
- 【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现
- 多变量线性回归算法
- 一个c语言程序能实现几种算法_C语言实现算法
- 【安全算法之SHA224】SHA224摘要运算的C语言源码实现
- 【算法竞赛】Codeforces Round #841 (Div. 2) C, E
- 前端leetcde算法面试套路之堆5失败
- 双指针算法模板及练习
- 有监督解耦与信息压缩相结合,上交新型信息瓶颈算法实现良好的泛化、鲁棒性能
- R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
- 一种求离散数学传递闭包的算法java实现详解编程语言
- Java 实现–时间片轮转 RR 进程调度算法详解编程语言
- MySQL函数实现递归算法(mysql函数递归)
- KMP算法在Oracle环境中的应用实践(kmp oracle实现)
- 纵深挖掘Redis时间窗口算法实现(时间窗口算法redis)
- JS实现随机数生成算法示例代码
- c语言实现冒泡排序、希尔排序等多种算法示例
- 数据挖掘之Apriori算法详解和Python实现代码分享
- 算法练习之从String.indexOf的模拟实现开始
- VC++实现选择排序算法简单示例