如何使用sklearn的SGDClassifier获得前3或前N个预测

Pra*_*hur 11 python scikit-learn multilabel-classification

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from sklearn import linear_model
arr=['dogs cats lions','apple pineapple orange','water fire earth air', 'sodium potassium calcium']
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(arr)
feature_names = vectorizer.get_feature_names()
Y = ['animals', 'fruits', 'elements','chemicals']
T=["eating apple roasted in fire and enjoying fresh air"]
test = vectorizer.transform(T)
clf = linear_model.SGDClassifier(loss='log')
clf.fit(X,Y)
x=clf.predict(test)
#prints: elements
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,clf.predict()仅为列表X中的样本打印1个最佳预测.我对列表X中特定样本的前3个预测感兴趣,我知道函数/ 返回列表Y中每个特征的所有概率的列表,但它必须排序然后与列表Y中的特征相关联才能获得的顶部3的结果.有没有直接有效的方法?predict_probapredict_log_proba

And*_*ler 13

没有内置功能,但有什么问题

probs = clf.predict_proba(test)
best_n = np.argsort(probs, axis=1)[-n:]
Run Code Online (Sandbox Code Playgroud)

  • 切片不应该是`best_n = np.argsort(probs,axis = 1)[:, - n:]`? (8认同)
  • clf.classes_提供了这些. (2认同)

use*_*942 7

我知道已经回答了...但是我可以添加更多...

#both preds and truths are same shape m by n (m is number of predictions and n is number of classes)
def top_n_accuracy(preds, truths, n):
    best_n = np.argsort(preds, axis=1)[:,-n:]
    ts = np.argmax(truths, axis=1)
    successes = 0
    for i in range(ts.shape[0]):
      if ts[i] in best_n[i,:]:
        successes += 1
    return float(successes)/ts.shape[0]
Run Code Online (Sandbox Code Playgroud)

它既快又脏,但我发现它很有用。一个人可以添加自己的错误检查等。


val*_*ner 5

希望Andreas会对此有所帮助。当 loss='hinge' 时 predict_probs 不可用。要在 loss='hinge' 时获得前 n 级,请执行以下操作:

calibrated_clf = CalibratedClassifierCV(clfSDG, cv=3, method='sigmoid')
model = calibrated_clf.fit(train.data, train.label)

probs = model.predict_proba(test_data)
sorted( zip( calibrated_clf.classes_, probs[0] ), key=lambda x:x[1] )[-n:]
Run Code Online (Sandbox Code Playgroud)

不确定 clfSDG.predict 和calibred_clf.predict 是否总是预测相同的类。