如何在 SVM 情绪分析中使用 predict_proba

Posted

技术标签:

【中文标题】如何在 SVM 情绪分析中使用 predict_proba【英文标题】:How to use predict_proba at SVM Sentiment Analysis 【发布时间】: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了一下,没看懂。

【问题讨论】:

【参考方案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 将是每个类别针对样本的概率的二维数组。

【讨论】:

以上是关于如何在 SVM 情绪分析中使用 predict_proba的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 SVM 进行股票预测 + 新闻情绪?

使用 Word2Vec 进行 Twitter 情绪分析

如何去除 sklearn 线性 SVM 中 10% 最具预测性的特征

《面向微博的社会情绪词典构建及情绪分析方法研究》学习笔记

Vader 情绪分析:如何对单个单词进行评分?

GATE 情绪分析是如何工作的?