как улучшить прогнозирование нейронной сети, классификация - PullRequest
2 голосов
/ 23 марта 2019

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

Моя проблема / вопрос: я пытался предсказать, и все предсказывает "0".я предполагаю, что это неверно.моя ложная точность 92%?я прочитал кое-что о ложной точности онлайн.

, пожалуйста, помогите!

Немного справочной информации: набор данных содержит 800 строк, 12 столбцов.я предсказываю последний столбец (правда / ложь).Я использую атрибуты данных, которые имеют числовые и категориальные.я обозначил закодированные числовые категории.92% этих карт являются ложными.8% соответствуют действительности.

Я сделал выборку и запустил нейронную сеть на 200 картах и ​​получил точность 91% ... Я также сбросил все и получил точность 92% на всех 800 картах.я переоснащаюсь?

Заранее спасибо за помощь

dataFrame = dataFrame.fillna(value='NaN')

labelencoder = LabelEncoder()

numpy_dataframe = dataFrame.as_matrix()
numpy_dataframe[:, 0] = labelencoder.fit_transform(numpy_dataframe[:, 0])
numpy_dataframe[:, 1] = labelencoder.fit_transform(numpy_dataframe[:, 1])

numpy_dataframe
X = numpy_dataframe[:,0:10]
Y = numpy_dataframe[:,10]
model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

#this shows that we have 91.88% accuracy with the whole dataframe


dataFrame200False = dataFrame 
dataFrame200False['Legendary'] = dataFrame200False['Legendary'].astype(str)
dataFrame200False= dataFrame200False[dataFrame200False['Legendary'].str.contains("False")]

dataFrame65True = dataFrame

dataFrame65True['Legendary'] = dataFrame65True['Legendary'].astype(str)
dataFrame65True= dataFrame65True[dataFrame65True['Legendary'].str.contains("True")]

DataFrameFalseSample = dataFrame200False.sample(200)
DataFrameFalseSample

dataFrameSampledTrueFalse = dataFrame65True.append(DataFrameFalseSample, ignore_index=True)
dataFrameSampledTrueFalse

#label encoding the files
labelencoder = LabelEncoder()

numpy_dataSample = dataFrameSampledTrueFalse.as_matrix()
numpy_dataSample[:, 0] = labelencoder.fit_transform(numpy_dataSample[:, 0])
numpy_dataSample[:, 1] = labelencoder.fit_transform(numpy_dataSample[:, 1])

numpy_dataSample
a = numpy_dataframe[:,0:10]
b = numpy_dataframe[:,10]

model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(a, b, epochs=1000, batch_size=10)

scoresSample = model.evaluate(a, b)
print("\n%s: %.2f%%" % (model.metrics_names[1], scoresSample[1]*100))

dataFramePredictSample = dataFrame.sample(500)
labelencoder = LabelEncoder()

numpy_dataframeSamples = dataFramePredictSample.as_matrix()
numpy_dataframeSamples[:, 0] = labelencoder.fit_transform(numpy_dataframeSamples[:, 0])
numpy_dataframeSamples[:, 1] = labelencoder.fit_transform(numpy_dataframeSamples[:, 1])

Xnew = numpy_dataframeSamples[:,0:10]
Ynew = numpy_dataframeSamples[:,10]


# make a prediction
Y = model.predict_classes(Xnew)
# show the inputs and predicted outputs
for i in range(len(Xnew)):
    print("X=%s, Predicted=%s" % (Xnew[i], Y[i]))

1 Ответ

2 голосов
/ 23 марта 2019

Проблема:

Проблема в том, что, как вы заявили, ваш набор данных сильно несбалансирован . Это означает, что у вас есть намного больше примеров обучения для класса 0, чем для класса 1. Это заставляет сеть во время обучения развить сильный уклон в сторону прогнозирования класса 0.

Оценка:

Первое, что вы должны сделать, это , а не , использовать точность в качестве меры оценки! Я бы предложил нарисовать матрицу путаницы , чтобы вы точно знали, что предсказывает модель. Вы также можете изучить усреднение макросов (прочитайте это , если вы не знакомы с техникой).

Решение проблемы:

Существует два способа улучшить производительность модели:

  • Повторная выборка ваших данных, чтобы они стали сбалансированными . У вас есть несколько вариантов здесь. Наиболее распространенным способом является передискретизация (например, SMOTE ) класса меньшинства, чтобы он достиг населения большинства. Другим вариантом является нижняя выборка (например, Clustering Centroids ) мажоритарного класса, чтобы его численность сократилась до численности меньшинства.
  • Используйте весовые классы во время тренировки. Это заставляет сеть уделять больше внимания сэмплам из класса меньшинства (подробнее читайте в этом посте ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...