1. ホーム
  2. python

[解決済み] scikit-learnを使って複数のカテゴリに分類する

2023-07-10 22:12:38

質問

scikit-learnの教師あり学習を使って、テキストの断片を1つ以上のカテゴリに分類しようとしています。私が試したすべてのアルゴリズムの予測関数は、1つのマッチを返すだけです。

たとえば、私はテキストの一部を持っています。

"Theaters in New York compared to those in London"

そして、私はアルゴリズムを訓練して、私が与えるすべてのテキストスニペットの場所を選ぶようにしました。

上記の例では、私はこのアルゴリズムが New YorkLondon を返しますが New York .

scikit-learnを使って複数の結果を返すことは可能でしょうか?あるいは、次に高い確率のラベルを返すことも可能ですか?

ご協力ありがとうございます。

---更新情報

を使ってみました。 OneVsRestClassifier を使ってみましたが、やはり1つのテキストに対して1つのオプションしか返ってきません。以下は、私が使用しているサンプルコードです。

y_train = ('New York','London')


train_set = ("new york nyc big apple", "london uk great britain")
vocab = {'new york' :0,'nyc':1,'big apple':2,'london' : 3, 'uk': 4, 'great britain' : 5}
count = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=2),vocabulary=vocab)
test_set = ('nice day in nyc','london town','hello welcome to the big apple. enjoy it here and london too')

X_vectorized = count.transform(train_set).todense()
smatrix2  = count.transform(test_set).todense()


base_clf = MultinomialNB(alpha=1)

clf = OneVsRestClassifier(base_clf).fit(X_vectorized, y_train)
Y_pred = clf.predict(smatrix2)
print Y_pred

結果 ['ニューヨーク' 'ロンドン' ]です。

どのように解決するのですか?

あなたが欲しいのは、マルチラベル分類と呼ばれるものです。Scikits-learnはそれができる。こちらを参照してください。 http://scikit-learn.org/dev/modules/multiclass.html .

私のバージョンのsklearnはWordNGramAnalyzerを持っていないようなので、この例で何が間違っているのかわかりません。おそらく、より多くの学習例を使用するか、別の分類器を試してみるか、ということでしょうか。しかし、マルチラベル分類器は、ターゲットがラベルのタプル/リストのリストであることを期待することに注意してください。

以下は私のために動作します。

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

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 = [[0],[0],[0],[0],[0],[0],[1],[1],[1],[1],[1],[1],[0,1],[0,1]]
X_test = np.array(['nice day in nyc',
                   'welcome to london',
                   'hello welcome to new york. enjoy it here and london too'])   
target_names = ['New York', 'London']

classifier = Pipeline([
    ('vectorizer', CountVectorizer(min_n=1,max_n=2)),
    ('tfidf', TfidfTransformer()),
    ('clf', OneVsRestClassifier(LinearSVC()))])
classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
for item, labels in zip(X_test, predicted):
    print '%s => %s' % (item, ', '.join(target_names[x] for x in labels))

私の場合、これは出力を生成します。

nice day in nyc => New York
welcome to london => London
hello welcome to new york. enjoy it here and london too => New York, London

これが役立つといいのですが。