Прогнозирование с двумя классами машинного обучения

def convertDCM(PathDCM) :
   data = []  
   for dirName, subdir, files in os.walk(PathDCM):
          for filename in sorted(files):
                     ds = pydicom.dcmread(PathDCM +'/' + filename)
                     im = fromarray(ds.pixel_array) 
                     im = keras.preprocessing.image.img_to_array(im)
                     im = cv2.resize(im,(300,300))
                     data.append(im) 
   return data

PathDCM = '/home/Desktop/FULL_BALANCED_BW/'

data = convertDCM(PathDCM)

class_names = ['Normal','Abnormal'] #Normal = 0, Abnormal = 1

read = pd.read_excel('/home/FULL_REDUCED_BALANCED_DATA.xlsx')
labels = read.iloc[:,2].tolist()

#scale the raw pixel intensities to the range [0,1]
data = np.array(data, dtype = "float")/255.0
labels = np.array(labels,dtype  = "uint8")


#splitting data into training and testing

(trainX, testX, trainY, testY) = train_test_split(
                            data,labels, 
                            test_size=0.2, 
                            random_state=42) 

img_width, img_height = 300, 300 #InceptionV3 size

train_samples =  1000
validation_samples = 200
epochs = 10
batch_size = 32

base_model = keras.applications.InceptionV3(
        weights ='imagenet',
        include_top=False, 
        input_shape = (img_width,img_height,3))

#Classifier Model ontop of Convolutional Model
model_top = keras.models.Sequential()
model_top.add(keras.layers.GlobalAveragePooling2D(input_shape=base_model.output_shape[1:], data_format=None)),
model_top.add(keras.layers.Dense(450,activation='relu'))
model_top.add(keras.layers.Dropout(0.5))
model_top.add(keras.layers.Dense(1,activation = 'sigmoid'))
model = keras.models.Model(inputs = base_model.input, outputs = model_top(base_model.output))

#Compiling model using Adam Optimizer 
model.compile(optimizer = keras.optimizers.Adam(
                    lr=0.00002,
                    beta_1=0.9,
                    beta_2=0.999,
                    epsilon=1e-08),
                    loss='binary_crossentropy',
                    metrics=['accuracy'])

#Image Processing and Augmentation 
train_datagen = keras.preprocessing.image.ImageDataGenerator(
          zoom_range = 0.1,
          width_shift_range = 0.2, 
          height_shift_range = 0.2,
          horizontal_flip = True,
          fill_mode ='nearest') 

val_datagen = keras.preprocessing.image.ImageDataGenerator()


train_generator = train_datagen.flow(
        trainX, 
        trainY,
        batch_size=batch_size,
        shuffle=True)

validation_generator = val_datagen.flow(
                testX,
                testY,
                batch_size=batch_size)

#Training the model
history = model.fit_generator(
    train_generator, 
    steps_per_epoch = train_samples//batch_size,
    epochs = epochs, 
    validation_data = validation_generator, 
    validation_steps = validation_samples//batch_size)

При прогнозировании вероятностей для двух классов я использую:

testX= convertDCM('home/Desktop/NewData')
testX = np.array(testX, dtype = "float")/255.0

predictions= model.predict(testX)
print(predictions)

И верните этот массив:

[[0.6151286 ]
[0.5269037 ]
[0.6088796 ]
[0.55031174]]

Поскольку у меня только два класса, является ли возвращаемое число вероятностью того, что оно принадлежит первому классу? Что означает класс в элементе 0 (нормальный)? Итак, согласно этому мышлению, значение меньше 0,5 считается нормальным, а значение больше 0,5 - ненормальным?

что такое textX? какая модель?

blue_note 21.08.2018 20:32

Это действительно вопрос интерпретации. Не видя кода, вы, вероятно, получаете вероятность принадлежности тестового образца к ненормальному случаю, а 1-p_normal - это вероятность другого класса. У вас не получается хорошее разделение между двумя классами всего на уровне ~ 0,6, но этого может быть достаточно для вашего конкретного случая, и здесь возникает интерпретация. Это очень широкий вопрос.

James 21.08.2018 20:34

Я обновил сообщение, добавив в него свой код.

student17 21.08.2018 20:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
227
2

Ответы 2

Возвращенное число - это вероятность предсказания положительного класса (кодируется как 1). В вашем случае это, вероятно, класс Abnormal (это зависит от того, как точно закодированы ваши данные). Вы можете преобразовать предсказанные вероятности в двоичные значения, вызвав:

(predictions > 0.5).astype(int)

Четыре числа соответствуют четырем входным параметрам модели.

Каждое число закодировано так же, как и цель во время тренировки (trainY). Если класс 1 был закодирован как целевой 0, а класс 2 был закодирован как 1, то вы можете интерпретировать выходное значение 0.6 как вероятность 0,6, что это класс 2.

Обратите внимание, что в производственной среде вы можете увидеть следующие случаи, с которыми вы не можете справиться:

  • Это ни класс 1, ни класс 2 - сеть по-прежнему будет назначать один класс с вероятностью не менее 50%, поскольку она не может делать разные
  • Это и класс 1, и класс 2 - сеть в лучшем случае присвоит каждому классу вероятность 50%.

Другие вопросы по теме