在 python 中的 SGDClassifier 中,概率总和始终为 1 (100%)

Posted

技术标签:

【中文标题】在 python 中的 SGDClassifier 中,概率总和始终为 1 (100%)【英文标题】:Sum of probability always gives as 1 (100%) in SGDClassifier in python 【发布时间】:2017-10-31 18:33:38 【问题描述】:

我根据我的训练数据集预测一些值并计算概率,将它们相加总是给我 1 或 100% 这是我的训练数据

Address                                                        Location_ID
Arham Brindavan,plot no.9,3rd road Near ls Stn,cannop          4485
Revanta,Behind nirmal puoto Mall, G-M link Road, Mulund(W)     10027
Sandhu Arambh,Opp St.Mary's Convent, rose rd, Mulund(W)        10027
Naman Premirer, Military Road, Marol Andheri E                 5041
Dattatreya Ayuedust Adobe Hanspal, bhubaneshwar                6479

这是我的测试数据

Address                                                          Location_ID
Tata Vivati , Mhada Colony, Mulund (E), Mumbai                     10027
Evershine Madhuvan,Sen Nagar, Near blue Energy,Santacruz(E)        4943

这是我尝试过的

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier

data=pd.read_csv('D:/All files/abc.csv')
msk = np.random.rand(len(data)) < 0.8
data_train = data[msk] 
data_train_add = data_train.ix[:,0] # divide dataset into training set
data_train_loc = data_train.ix[:,1] 

data_test1 = data[~msk]   
data_test = data_test1.ix[:,0]   # divide dataset into testing set            

data_train_add = np.array(data_train_add)
data_train_loc = np.array(data_train_loc)

count_vect = CountVectorizer(ngram_range=(1,3))
X_train_counts = count_vect.fit_transform(data_train_add.ravel())

tfidf_transformer = TfidfTransformer()
data_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

clf_svm = SGDClassifier(loss='log', penalty='l2', alpha=1e-3, n_iter=5, random_state=42).fit(data_train_tfidf, data_train_loc.ravel())

X_new_counts = count_vect.transform(data_test.ravel())
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted_svm = clf_svm.predict(X_new_tfidf)

clf_svm_prob=clf_svm.predict_proba(X_new_tfidf) 
prob_sum=clf_svm_prob.sum(axis=1)
print(prob_sum)
O/P
 array([ 1.,  1.,  1.,  1.])

为什么它给出 1% 或 100% 的概率,我应该更改哪个参数以使概率总和正确..请建议 提前致谢。

【问题讨论】:

它是对该样本所有类别的概率求和。显然它会是 1。你期待什么?你能再解释一下,你想达到什么目的?您想对所有测试样本的单个类别的概率求和吗? @VivekKumar 是的,我希望它应该给我每个单词的测试记录的概率总和......例如,如果对于这个测试数据记录(单词)“Tata Vivati,Mhada Colony, Mulund (E), Mumbai",概率为 0.00023,0.07693,0.28811,0.198827,0.123121,0.05920,那么它应该只添加这些概率(将上述所有值相加得到大约 0.737 或 73 %) clf_svm 是一个分类估计器。它不会输出单词概率,只会输出类。我不明白你所说的概率是什么意思。 【参考方案1】:

这按预期工作,因为您正在训练的模型是discriminative而不是generator。所以你得到的概率是

[P(label1 | x), P(label2 | x), ..., P(labelK | x)]

对于任何这样的概率分布(在可能值 label1 到 labelK 的有限集合上)。

SUMi P(labeli | x) = 1

判别模型模拟 P(X),实际上没有任何东西可以代表这个数量。为什么?因为这让学习变得更容易,而且如果你只关心标签/值,你永远不需要 P(X)。

从那时起,你所追求的是相反的数量 P(x | label1)

P(X) = SUMi P(x|labeli) P(labeli)

P(x|labeli) 在判别模型中也找不到。因此,如果您需要访问 P(X),您需要明确地学习它,例如使用 GMM、朴素贝叶斯等,而不是您现在使用的逻辑回归(这是一个判别模型)。

【讨论】:

以上是关于在 python 中的 SGDClassifier 中,概率总和始终为 1 (100%)的主要内容,如果未能解决你的问题,请参考以下文章

为啥python sgdclassifier 每次分类的结果都不一样

sklearn中的SGDClassifier

BayesSearchCV 在 SGDClassifier 参数调整期间不起作用

sample_weight 在 SGDClassifier 中是如何工作的?

随机梯度下降分类器(SGDClassifier)

带有 HashingVectorizer 和 TfidfTransformer 的 SGDClassifier