场景
- 一部电影可以同时属于爱情片和科幻片
- 一篇文章可以同时包含娱乐和汽车
- 一张图片可以同时出现猫和狗。
- 参考网址:https://scikit-learn.org/stable/modules/multiclass.html
多标签二值化
from sklearn.preprocessing import MultiLabelBinarizer
Y = [[], [1], [2], [1, 2]]
print(MultiLabelBinarizer().fit_transform(Y))
打印结果
[[0 0]
[1 0]
[0 1]
[1 1]]
分类器
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.tree import DecisionTreeClassifier
# 样本
X = [
[1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 0], [1, 0, 0, 1],
[1, 1, 0, 0], [2, 0, 0, 0], [0, 2, 0, 0],
[0, 0, 1, 1], [0, 0, 2, 0], [0, 0, 0, 2],
[1, 1, 1, 1], [2, 0, 2, 0], [0, 2, 0, 2],
]
Y = [
[], [], [], [],
[1], [1], [1],
[2], [2], [2],
[1, 2], [1, 2], [1, 2],
]
X_test = [[1, 0, 0, 0], [0, 0, 0, 1], [3, 0, 3, 3]]
Y_test = [[], [], [1, 2]]
# 标签处理
transformer = MultiLabelBinarizer()
Y = transformer.fit_transform(Y)
Y_test = transformer.transform(Y_test)
# 建模
model = OneVsRestClassifier(DecisionTreeClassifier())
model.fit(X, Y)
print('训练得分:%.2f' % model.score(X, Y), '测试得分:%.2f' % model.score(X_test, Y_test))
print(model.predict(X_test))
打印结果
训练得分:1.00 测试得分:1.00
[[0 0]
[0 0]
[1 1]]
各种分类器比较
import warnings
warnings.filterwarnings('ignore')
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
# 样本
X = [
[0, 0, 0, 0], [1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 0], [1, 0, 0, 1],
[1, 1, 0, 0], [2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 1, 1], [0, 0, 2, 0], [0, 0, 0, 2],
[1, 1, 1, 1], [2, 0, 2, 0], [0, 2, 0, 2], [2, 0, 0, 2], [0, 2, 2, 0]
]
Y = [
[], [], [], [], [],
[1], [1], [1], [2], [2], [2],
[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]
]
X_test = [[1, 0, 0, 0], [0, 0, 0, 1], [3, 0, 3, 3], [0, 3, 0, 0]]
Y_test = [[], [], [1, 2], [1]]
# 多标签二值化
transformer = MultiLabelBinarizer()
Y = transformer.fit_transform(Y)
Y_test = transformer.transform(Y_test)
# 建模
for clf in [MultinomialNB, DecisionTreeClassifier, LogisticRegression, SVC, MLPClassifier]:
model = OneVsRestClassifier(clf())
model.fit(X, Y)
print(clf.__name__, model.score(X, Y), model.score(X_test, Y_test))
# print(model.predict(X_test))
打印结果
MultinomialNB 0.75 0.25
DecisionTreeClassifier 1.0 1.0
LogisticRegression 0.75 0.5
SVC 1.0 1.0
MLPClassifier 1.0 1.0
文本分类
from jieba import cut
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression
# 样本
X = '''
某女星代言小米手机
小米手机预售价2000元
某女星片酬2000万
月入2000元
'''.strip().split()
Y = [
['娱乐', '手机'],
['手机'],
['娱乐'],
[],
]
X_test = '''
2000元
某女星买2000元的小米手机
'''.strip().split()
Y_test = [[], ['娱乐', '手机']]
# 文本向量化
vectorizer = TfidfVectorizer(tokenizer=cut)
X = vectorizer.fit_transform(X)
X_test = vectorizer.transform(X_test)
# 多标签二值化
transformer = MultiLabelBinarizer()
Y = transformer.fit_transform(Y)
Y_test = transformer.transform(Y_test)
# 建模
model = OneVsRestClassifier(LogisticRegression())
model.fit(X, Y)
print('训练得分:%.2f' % model.score(X, Y), '测试得分:%.2f' % model.score(X_test, Y_test))
print(model.predict_proba(X_test))
打印结果
训练得分:1.00 测试得分:1.00
[[0.39389651 0.45297039]
[0.51392277 0.54656221]]
1511



被折叠的 条评论
为什么被折叠?



