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

在python的SGDClassizer中,概率之和始终为1(100%),python,scikit-learn,svm,text-classification,linearmodels,Python,Scikit Learn,Svm,Text Classification,Linearmodels,我根据我的训练数据集预测一些值,并计算概率,将它们相加,总得到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)

我根据我的训练数据集预测一些值,并计算概率,将它们相加,总得到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.])
将熊猫作为pd导入
将numpy作为np导入
从sklearn.feature\u extraction.text导入countvectorier
从sklearn.feature_extraction.text导入TFIDF转换器
从sklearn.linear_模型导入SGDClassizer
data=pd.read\u csv('D:/All files/abc.csv')
msk=np.random.rand(len(data))<0.8
数据列车=数据[msk]
data_train_add=data_train.ix[:,0]#将数据集划分为训练集
数据列车loc=数据列车ix[:,1]
data_test1=数据[~msk]
data_test=data_test1.ix[:,0]#将数据集划分为测试集
data\u train\u add=np.数组(data\u train\u add)
数据列位置=np.数组(数据列位置)
count_vect=计数向量器(ngram_范围=(1,3))
X\u train\u counts=count\u vect.fit\u变换(data\u train\u add.ravel())
tfidf_transformer=tfidf transformer()
数据\u列\u tfidf=tfidf\u变压器。拟合\u变换(X\u列\u计数)
clf_svm=SGDClassizer(损失=log',惩罚=l2',α=1e-3,n_iter=5,随机状态=42).拟合(数据列tfidf,数据列loc.ravel())
X\u new\u counts=count\u vect.transform(data\u test.ravel())
X_new_tfidf=tfidf_transformer.transform(X_new_计数)
预测的支持向量机=clf支持向量机。预测(X新的tfidf)
clf_svm_prob=clf_svm.predict_proba(X_new_tfidf)
概率和=clf概率和(轴=1)
打印(问题和)
O/P
数组([1,1,1,1.]))
为什么它给出了1%或100%的概率,为了得到正确的概率之和,我应该改变哪个参数..请建议
提前感谢。

这与预期一样有效,因为您正在培训的模型是有辨别力的,而不是有生成性的。所以你得到的概率是

[P(label1 | x), P(label2 | x), ..., P(labelK | x)]
对于任何这样的概率分布(在有限的可能值集label1到labelK上)

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

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

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

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

它是对该样本的所有类的概率求和。显然是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
是一种分类估计器。它不会输出单词probability,只输出class。我不明白你所说的“概率”是什么意思。
P(X) = SUMi P(x|labeli) P(labeli)