Неправильная классификация данных по заданным параметрам на основе библиотеки tenserflow в python

Рейтинг: 0Ответов: 0Опубликовано: 10.06.2023

Разрабатываю программу для классификации студентов по параметрам(Средний балл"avg_grade", подтягивания"avg_grade", количество нарядов"uniforms"). Суть программы в том, чтобы она определяла класс по параметрам, к которому относится каждый студент. Всего есть 3 класса A,B,C(A - лучший студент, B - средний студент,C - плохой студент). Проблема заключается в том, что нейросеть классифицирует учеников неправильно.

ниже представлен рисунок:

Красным цветом показано и подписано к каким студентам относится тот или иной класс. Оценка класса определяется по всем параметрам. Гончаров должен иметь класс В, потому что несмотря на средний балл, количество подтягиваний недостаточно. Володин должен иметь Класс В, потому что несмотря на удовлетворительный средний балл его количество подтягиваний довольно высокое и большое количество нарядов может оправдать его средний уровень учёбы

ниже представлен код программы:

# импортируем необходимые библиотеки
import tensorflow as tf
import pandas as pd
import random
from tabulate import tabulate

# создаем набор данных
data = {'student': ['Иванов', 'Петров', 'Сидоров', 'Володин', 'Гончаров'],
        'avg_grade': [4.9, 4.2, 2.9, 3.4, 2.1],
        'pull-ups': [15, 3, 7, 10, 9],
        'uniforms': [1, 9, 3, 3, 7],
        'class': ['A', 'A', 'C', 'B', 'C']}
# преобразуем данные в DataFrame
df = pd.DataFrame(data)

# определяем параметры модели
input_size = 3
output_size = 3
hidden_size = 10

# создаем модель обучения с учителем
model = tf.keras.Sequential([
    tf.keras.layers.Dense(hidden_size, activation='relu', input_shape=(input_size,)),
    tf.keras.layers.Dense(hidden_size, activation='relu'),
    tf.keras.layers.Dense(output_size, activation='softmax')
])

# компилируем модель
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# разделяем данные на обучающую и тестовую выборки
X_train = df[['avg_grade', 'pull-ups', 'uniforms']]
y_train = pd.get_dummies(df['class'])
X_test = X_train.sample(frac=0.5)
y_test = y_train.loc[X_test.index]
X_train = X_train.drop(X_test.index)
y_train = y_train.drop(X_test.index)

# обучаем модель на обучающей выборке
model.fit(X_train, y_train, epochs=1000)

# определяем класс студента на основе его параметров
student = {'avg_grade': 4.3, 'pull-ups': 15, 'uniforms': 4}
input_data = [[student['avg_grade'], student['pull-ups'], student['uniforms']]]
output_data = model.predict(input_data)
class_index = tf.math.argmax(output_data, axis=1).numpy()[0]
class_list = ['A', 'B', 'C']
class_tf = class_list[class_index]

# создаем таблицу со случайными параметрами
students = ['Иванов', 'петров', 'Сидоров', 'Володин', 'Гончаров']
data = []
for student in students:
    avg_grade = round(random.uniform(2, 5), 1)
    pull_ups = random.randint(0, 25)
    uniforms = random.randint(0, 15)
    data.append([student, avg_grade, pull_ups, uniforms])

# выводим таблицу в консоль
print(tabulate(data, headers=['студент', 'Ср. балл', 'Подтягивания', 'Наряды']))

# определяем класс для каждого студента
classes = []
for student_data in data:
    input_data = [[student_data[1], student_data[2], student_data[3]]]
    output_data = model.predict(input_data)
    class_index = tf.math.argmax(output_data, axis=1).numpy()[0]
    class_list = ['A', 'B', 'C']
    class_tf = class_list[class_index]
    classes.append(class_tf)

# выделяем каждый класс своим цветом
colors = {'A': '\033[91m', 'B': '\033[92m', 'C': '\033[93m'}
for i in range(len(data)):
    class_color = colors[classes[i]]
    print(class_color + data[i][0] + ': ' + classes[i] + '\033[0m')
# останавливаю непреднамеренный выход из консоли
input()`

Ответы

Ответов пока нет.