Почему я получаю оценку 0,0 при нахождении оценки тестовых данных с использованием гауссовского NB-классификатора?
У меня есть два разных набора данных. Один для обучения моего классификатора, а другой для тестирования. Оба набора данных представляют собой текстовые файлы с двумя столбцами, разделенными знаком ",". Первый столбец (числа) предназначен для независимой переменной (группы), а второй столбец - для зависимой переменной.
Набор обучающих данных
(например, всего несколько строк. Между каждой строкой нет пустых строк):
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 ответ
Во-первых, приведенные выше примеры данных не показывают, сколько классов в нем. Вы должны описать больше об этом.
Во-вторых, вы звоните 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)