使用高斯NB分类器查找测试数据得分时,为什么得分为0.0?

时间:2018-11-21 10:18:41

标签: python-3.x pandas machine-learning scikit-learn gaussian

我有两个不同的数据集。一个用于训练我的分类器,另一个用于测试。这两个数据集都是文本文件,两列之间用“,”分隔。第一列(数字)用于自变量(组),第二列用于因变量。

训练数据集

(例如,只有几行。每行之间没有空行):

EMI3776438,1
EMI3776438,1
EMI3669492,1
EMI3752004,1

测试数据设置

(如您所见,我从训练数据中选择了数据,以确保分数一定不能为零)

EMI3776438,1

Python 3.6中的代码:

# #all the import statements have been ignored to keep the code short
# #loading the training data set

training_file_path=r'C:\Users\yyy\Desktop\my files\python\Machine learning\Carepack\modified_columns.txt'

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

training_file_data =  pandas.read_table(training_file_path, 
                                        header=None, 
                                        names=['numbers','group'],
                                        sep=',')

training_file_data = training_file_data.apply(le.fit_transform)

features = ['numbers']

x = training_file_data[features]
y = training_file_data["group"]

from sklearn.model_selection import train_test_split
training_x,testing_x, training_y, testing_y = train_test_split(x, y, 
                                                        random_state=0,
                                                        test_size=0.1)

from sklearn.naive_bayes import GaussianNB

gnb= GaussianNB()
gnb.fit(training_x, training_y)

# #loading the testing data 
testing_final_path=r"C:\Users\yyy\Desktop\my files\python\Machine learning\Carepack\testing_final.txt"
testing_sample_data=pandas.read_table(testing_final_path, 
                                      sep=',',
                                      header=None, 
                                      names=['numbers','group'])

testing_sample_data = testing_sample_data.apply(le.fit_transform)

category = ["numbers"]

testing_sample_data_x = testing_sample_data[category]

# #finding the score of the test data
print(gnb.score(testing_sample_data_x, testing_sample_data["group"]))

1 个答案:

答案 0 :(得分:0)

首先,以上数据样本未显示其中有多少个类。您需要描述更多。

第二,您再次调用测试数据的le.fit_transform,这将忘记所有训练样本从字符串到数字的映射。 LabelEncoder文件将再次从头开始对测试数据进行编码,这与映射训练数据的方式不同。因此,GaussianNB的输入现在不正确,因此结果也不正确。

将其更改为:

testing_sample_data = testing_sample_data.apply(le.transform)

更新

对不起,我忽略了您的数据中有两列的事实。 LabelEncoder仅适用于单列数据。为使其一次可在多个熊猫列上工作,请查看以下问题的答案:

如果您使用的是最新版本的scikit(0.20)或可以对其进行更新,则不需要任何此类黑客,而直接使用the OrdinalEncoder

from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder()

training_file_data = enc.fit_transform(training_file_data)

在测试期间:

training_file_data = enc.transform(training_file_data)