如何在 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的主要内容,如果未能解决你的问题,请参考以下文章