Sco*_*art 13 python machine-learning scikit-learn
鉴于这个简单的多标签分类示例(取自这个问题,使用scikit-learn分类为多个类别)
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.multiclass import OneVsRestClassifier
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
X_train = np.array(["new york is a hell of a town",
"new york was originally dutch",
"the big apple is great",
"new york is also called the big apple",
"nyc is nice",
"people abbreviate new york city as nyc",
"the capital of great britain is london",
"london is in the uk",
"london is in england",
"london is in great britain",
"it rains a lot in london",
"london hosts the british museum",
"new york is great and so is london",
"i like london better than new york"])
y_train_text = [["new york"],["new york"],["new york"],["new york"], ["new york"],
["new york"],["london"],["london"],["london"],["london"],
["london"],["london"],["new york","london"],["new york","london"]]
X_test = np.array(['nice day in nyc',
'welcome to london',
'london is rainy',
'it is raining in britian',
'it is raining in britian and the big apple',
'it is raining in britian and nyc',
'hello welcome to new york. enjoy it here and london too'])
y_test_text = [["new york"],["london"],["london"],["london"],["new york", "london"],["new york", "london"],["new york", "london"]]
lb = preprocessing.MultiLabelBinarizer()
Y = lb.fit_transform(y_train_text)
Y_test = lb.fit_transform(y_test_text)
classifier = Pipeline([
('vectorizer', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])
classifier.fit(X_train, Y)
predicted = classifier.predict(X_test)
print "Accuracy Score: ",accuracy_score(Y_test, predicted)
Run Code Online (Sandbox Code Playgroud)
代码运行正常,并打印准确度分数,但是如果我将y_test_text更改为
y_test_text = [["new york"],["london"],["england"],["london"],["new york", "london"],["new york", "london"],["new york", "london"]]
Run Code Online (Sandbox Code Playgroud)
我明白了
Traceback (most recent call last):
File "/Users/scottstewart/Documents/scikittest/example.py", line 52, in <module>
print "Accuracy Score: ",accuracy_score(Y_test, predicted)
File "/Library/Python/2.7/site-packages/sklearn/metrics/classification.py", line 181, in accuracy_score
differing_labels = count_nonzero(y_true - y_pred, axis=1)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/sparse/compressed.py", line 393, in __sub__
raise ValueError("inconsistent shapes")
ValueError: inconsistent shapes
Run Code Online (Sandbox Code Playgroud)
请注意引入不在训练集中的"英格兰"标签.如何使用多标签分类,以便如果引入"测试"标签,我仍然可以运行一些指标?或者甚至可能吗?
编辑:谢谢你的答案,我想我的问题更多的是关于scikit二进制文件如何工作或应该工作.鉴于我的简短示例代码,我也希望如果我将y_test_text更改为
y_test_text = [["new york"],["new york"],["new york"],["new york"],["new york"],["new york"],["new york"]]
Run Code Online (Sandbox Code Playgroud)
它会工作 - 我的意思是我们已经适合该标签,但在这种情况下,我得到
ValueError: Can't handle mix of binary and multilabel-indicator
Run Code Online (Sandbox Code Playgroud)
如果您在训练集中"引入"新标签,也可以这样:
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.multiclass import OneVsRestClassifier
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
X_train = np.array(["new york is a hell of a town",
"new york was originally dutch",
"the big apple is great",
"new york is also called the big apple",
"nyc is nice",
"people abbreviate new york city as nyc",
"the capital of great britain is london",
"london is in the uk",
"london is in england",
"london is in great britain",
"it rains a lot in london",
"london hosts the british museum",
"new york is great and so is london",
"i like london better than new york"])
y_train_text = [["new york"],["new york"],["new york"],["new york"],
["new york"],["new york"],["london"],["london"],
["london"],["london"],["london"],["london"],
["new york","England"],["new york","london"]]
X_test = np.array(['nice day in nyc',
'welcome to london',
'london is rainy',
'it is raining in britian',
'it is raining in britian and the big apple',
'it is raining in britian and nyc',
'hello welcome to new york. enjoy it here and london too'])
y_test_text = [["new york"],["new york"],["new york"],["new york"],["new york"],["new york"],["new york"]]
lb = preprocessing.MultiLabelBinarizer(classes=("new york","london","England"))
Y = lb.fit_transform(y_train_text)
Y_test = lb.fit_transform(y_test_text)
print Y_test
classifier = Pipeline([
('vectorizer', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])
classifier.fit(X_train, Y)
predicted = classifier.predict(X_test)
print predicted
print "Accuracy Score: ",accuracy_score(Y_test, predicted)
Run Code Online (Sandbox Code Playgroud)
输出:
Accuracy Score: 0.571428571429
Run Code Online (Sandbox Code Playgroud)
关键部分是:
y_train_text = [["new york"],["new york"],["new york"],
["new york"],["new york"],["new york"],
["london"],["london"],["london"],["london"],
["london"],["london"],["new york","England"],
["new york","london"]]
Run Code Online (Sandbox Code Playgroud)
我们在哪里插入"英格兰".这是有道理的,因为其他方式如果他之前没有看到它,如何预测分类器的某些标签?所以我们用这种方式创建了一个三标签分类问题.
编辑:
lb = preprocessing.MultiLabelBinarizer(classes=("new york","london","England"))
Run Code Online (Sandbox Code Playgroud)
您必须将类作为arg传递给MultiLabelBinarizer()它,它将适用于任何y_test_text.
| 归档时间: |
|
| 查看次数: |
12057 次 |
| 最近记录: |