【问题标题】:How to calculate prediction probability in python and NLTK?如何在 python 和 NLTK 中计算预测概率?
【发布时间】:2018-10-29 06:57:19
【问题描述】:

我正在尝试使用 LinearSVCOneVsRestClassifier 计算 SVM 模型中的每个预测概率,但出现错误

AttributeError: 'LinearSVC' object has no attribute 'predict_proba'

尝试过的代码:

model = Pipeline([('vectorizer', CountVectorizer(ngram_range=(1,2))),
    ('tfidf', TfidfTransformer(use_idf=True)),
    ('clf', OneVsRestClassifier(LinearSVC(class_weight="balanced")))])

model.fit(X_train, y_train)
y_train.shape
pred = model.predict(X_test)

probas = model.predict_proba(X_test)

也试过了:

from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.svm import SVC

LinearSVC_classifier = SklearnClassifier(SVC(kernel='linear',probability=True))
prob_1 = LinearSVC_classifier.predict_proba(X_test)

但仍然出现错误AttributeError: 'SklearnClassifier' object has no attribute 'predict_proba'

请提出相同的建议。

【问题讨论】:

    标签: python python-3.x machine-learning nltk


    【解决方案1】:

    使用您的线性 SVM:

    from sklearn.calibration import CalibratedClassifierCV
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.pipeline import FeatureUnion, make_pipeline
    from sklearn.svm import LinearSVC
    
    word_vectorizer = TfidfVectorizer(ngram_range=(1, 2))
    features = FeatureUnion([('words', word_vectorizer), ])
    calibrated_svc = CalibratedClassifierCV(LinearSVC(), method='sigmoid', cv=3)
    pipeline = make_pipeline(features, calibrated_svc)
    pipeline.fit(train_x, train_y)
    predicted = pipeline.predict_proba(test_x)
    

    或使用逻辑回归:

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.pipeline import FeatureUnion, make_pipeline
    from sklearn.linear_model import LogisticRegression
    
    word_vectorizer = TfidfVectorizer(ngram_range=(1, 2))
    features = FeatureUnion([('words', word_vectorizer), ])
    pipeline = make_pipeline(features, LogisticRegression())
    pipeline.fit(train_x, train_y)
    predicted = pipeline.predict_proba(test_x)
    

    【讨论】:

    • 我收到错误:ValueError: Requesting 3-fold cross-validation but provided less than 3 examples for at least one class. 在这一行:pipeline.fit(train_x, train_y)。我已经更新了我的数据格式。请建议如何解决?
    • @user10468005 try 'from sklearn.model_selection import KFold' , 'kf = KFold(n_splits=3)' , 'calibrated_svc = CalibratedClassifierCV(LinearSVC(), method='sigmoid', cv=kf) '
    【解决方案2】:

    仅仅是因为“SKlearnClassifier”对象没有“predict_proba”属性

    您可以通过这种方式预测概率,

     classifier.classify_many(test)
    
     for pdist in classifier.prob_classify_many(test):
    ...     print('%.4f %.4f' % (pdist.prob('x'), pdist.prob('y')))
    

    来自here的代码

    【讨论】:

    • 得到错误AttributeError: 'Pipeline' object has no attribute 'classify_many'我已经这样做了:model.classify_many(test_data) for pdist in model.prob_classify_many(test_data): print('%.4f %.4f' % (pdist.prob('x'), pdist.prob('y')))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2021-05-31
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多