Почему я получаю оценку 0,0 при нахождении оценки тестовых данных с использованием гауссовского NB-классификатора? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть два разных набора данных.Один для обучения моего классификатора, а другой для тестирования.Оба набора данных представляют собой текстовые файлы с двумя столбцами, разделенными знаком «,».Первый столбец (числа) предназначен для независимой переменной (группы), а второй столбец - для зависимой переменной.

Набор обучающих данных

(например, всего несколько строк)между каждой строкой нет пустых строк:

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 голосов
/ 21 ноября 2018

Во-первых, приведенные выше примеры данных не показывают, сколько классов в нем.Вы должны описать больше об этом.

Во-вторых, вы снова вызываете le.fit_transform на тестовых данных, которые забудут все сопоставления обучающих выборок из строк в числа.Файл LabelEncoder начнет кодирование тестовых данных снова с нуля, что не будет равно тому, как они отображали тренировочные данные.Таким образом, ввод GaussianNB теперь неверен и, следовательно, неверные результаты.

Измените это на:

testing_sample_data = testing_sample_data.apply(le.transform)

ОБНОВЛЕНИЕ :

Извините, я упустил из виду тот факт, что у вас было два столбца вваши данные.LabelEncoder работает только для одного столбца данных.Чтобы заставить его работать одновременно с несколькими столбцами панд, взгляните на ответы на следующий вопрос:

Если вы используете последнюю версию scikit (0.20) или можете обновить ее, то вам не понадобятся такие хаки, и вы напрямую используете 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)
...