Почему я получаю «1», как предсказывал класс? - PullRequest
0 голосов
/ 28 января 2019

У меня есть этот CSV-файл , где я пытаюсь предсказать Histology на основе данных в других строках.

У меня есть код, показанный ниже, чтобы сделать это,Тем не менее, я получаю все прогнозы как 1.Это почему?Хотя точность, которую я получаю после тренировки, составляет 86.81%.

import numpy as np 
import pandas as pd 
from keras.layers import Dense, Dropout, BatchNormalization, Activation
import keras.models as md
import keras.layers.core as core
import keras.utils.np_utils as kutils
import keras.layers.convolutional as conv

from keras.layers import MaxPool2D

from subprocess import check_output
dataset = pd.read_csv('mutation-train.csv')

dataset = dataset[['CDS_Mutation',
                   'Primary_Tissue',
                    'Genomic',
                    'Gene_ID',
                    'Official_Symbol',
                    'Histology']]

X = dataset.iloc[:,0:5].values
y = dataset.iloc[:,5].values

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_0 = LabelEncoder()
X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0])
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2= LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
labelencoder_X_4= LabelEncoder()
X[:, 4] = labelencoder_X_4.fit_transform(X[:, 4])

X = X.astype(float)
labelencoder_y= LabelEncoder()
y = labelencoder_y.fit_transform(y)

onehotencoder0 = OneHotEncoder(categorical_features = [0])
X = onehotencoder0.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder1 = OneHotEncoder(categorical_features = [1])
X = onehotencoder1.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder2 = OneHotEncoder(categorical_features = [2])
X = onehotencoder2.fit_transform(X).toarray()
X = X[:,0:]
onehotencoder4 = OneHotEncoder(categorical_features = [4])
X = onehotencoder4.fit_transform(X).toarray()
X = X[:,0:]

# Splitting the dataset training and test sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)

# Feature scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Evaluating the ANN
from sklearn.model_selection import cross_val_score
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

model=Sequential()
model.add(Dense(32, activation = 'relu', input_shape=(X.shape[1],)))
model.add(Dense(16, activation = 'relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ["accuracy"])

# Compile model
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# Fit the model
model.fit(X,y, epochs=3, batch_size=1)

# Evaluate the model
scores = model.evaluate(X,y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# Calculate predictions
predictions = model.predict(X)
prediction = pd.DataFrame(predictions,columns=['predictions']).to_csv('prediction.csv')

Спасибо.

1 Ответ

0 голосов
/ 28 января 2019

Поскольку вы получаете точность 86,81%, когда все значения равны 1 , кажется, что ваши данные несбалансированы, это означает, что в вашем учебном наборе данных один класс одолел другой.Таким образом, даже если ваш прогноз 1 для всех тестовых данных, вы получите более высокую точность.

См. Парадокс точности

Например.В вашем наборе данных около 85% выборок данных относятся к классу 1 , а остальные к классу 0 .

Как с этим бороться

Существует множество способов справиться с этим.

  1. Повышение частоты: создание дублирующих данных для класса 0 , поэтому оба класса 1 и класс 0 будут в одинаковом соотношении.
  2. Понижающая выборка: достаточно удалить некоторые образцы из класса 1 , чтобы получить то же значение.
  3. изменить Матрицу производительности: вместо использования точности в качестве матрицы производительности, оценки F1, точности или отзыва
  4. Вы можете назначать разные штрафы для разных классов при созданииошибка.В этом случае вы даете большой вес классу с низким уровнем данных.

И есть еще способы с этим справиться.

Для получения более подробной информации см. эту ссылку ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...