【问题标题】:How to use predict_proba at SVM Sentiment Analysis如何在 SVM 情绪分析中使用 predict_proba
【发布时间】:2020-01-12 21:15:25
【问题描述】:

我将 predict_proba 应用于分类问题。我有一些在 R 中构建分类模型的经验,但这是我第一次使用 Python 的 sklearn。

所以问题是:在拟合后的 sklearn 中,我找不到访问概率的方法。可能吗?有一个方法predict_proba(),但是……顾名思义,就是预测。这是我的代码:

import pandas as pd 
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
import pickle
from nltk.tokenize import sent_tokenize
from Model import SkripsiPipeline

def konten(kata, model):
    item = []
    loaded_model = pickle.load(open(model, 'rb'))
    for v in kata.itertuples(index = False):
        sentiment = [] 
        variabel1 = v[0]
        variabel2 = v[1]

        kalimat = variabel1 + variabel2

        hasil_tokenize = sent_tokenize(kalimat)

        preds = loaded_model.predict(hasil_tokenize)

        if preds == 1:
            proba = loaded_model.predict_proba(hasil_tokenize)
            proba = proba.reshape(-1, 1).tolist()
            sentiment.append('Positif')
            sentiment.append(proba[0])

        elif preds == 0:
            proba = loaded_model.predict_proba(hasil_tokenize)
            proba = proba.reshape(-1, 1).tolist()
            sentiment.append('Netral')
            sentiment.append(proba[1])

        elif preds == -1:
            proba = loaded_model.predict_proba(hasil_tokenize)
            proba = proba.reshape(-1,1).tolist()
            sentiment.append('Negatif')
            sentiment.append(proba[2])

        item.append(sentiment)

    return item

但我收到了这个错误:

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

这是 SkripsiPipeline 代码:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import KFold
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import pickle

class SkripsiPipeline():
    def __init__ (self, predictor):
        self.predictor = predictor
    def fit(self,X,y):
        vectorizer = CountVectorizer()
        tfidf_transformer = TfidfTransformer()
        svm_predictor = self.predictor
        X = vectorizer.fit_transform(X)
        X = tfidf_transformer.fit_transform(X)
        svm_predictor.fit(X,y)

        self.vectorizer = vectorizer
        self.tfidf_transformer = tfidf_transformer
        self.svm_predictor = svm_predictor

    def predict (self, X):
        X = self.vectorizer.transform(X)
        X = self.tfidf_transformer.transform(X)
        prediction = self.svm_predictor.predict(X)
        return prediction

我是 Python Sklearn 包的新手。谁能告诉我我的 Python 代码有什么问题。 google了一下,没看懂。

【问题讨论】:

    标签: python machine-learning scikit-learn svm sentiment-analysis


    【解决方案1】:

    您调用了predict_proba 类中不存在的SkripsiPipeline 方法。您应该实现一个,类似于predict 方法,但它从您的svm_predictor 调用predict_proba,而不是它的predict 方法。

    应该是这样的:

    def predict_proba(self, X):
        X = self.vectorizer.transform(X)
        X = self.tfidf_transformer.transform(X)
        proba = self.svm_predictor.predict_proba(X)
        return proba
    

    【讨论】:

      【解决方案2】:

      我知道已经晚了,但是可能遇到这个问题的人,根据 sklearn documentation ,方法 'predict_proba' 没有为 'LinearSVC' 定义,所以你有 2 个选项:

      1)

      LinearSVC_classifier = SklearnClassifier(SVC(kernel='linear',probability=True))
      

      将 SVC 与线性核一起使用,概率参数设置为 True。正如here 中所解释的那样。

      2) 您可以使用 _predict_proba_lr() 代替 predict_proba。像这样的:

      from sklearn import svm
      clf=svm.LinearSVC()
      
      clf.fit(X_train,Y_train)
      
      res= clf._predict_proba_lr(X_test,Y_test)
      

      res 将是每个类别针对样本的概率的二维数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 2017-11-06
        • 2016-07-25
        • 2015-09-23
        相关资源
        最近更新 更多