У меня есть данные студентов с 1500 строками и 30 столбцами. Я использовал GradientBoostingClassifier. Все данные категориальные и находятся в диапазоне категорий 0-80 и 0-90.
Мне нужно построить модель прогнозирования, чтобы предсказать, не сдаст ли студент или нет. столбцы «Статус» - моя целевая переменная. ниже приведен код, который я использовал
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
data=data.apply(le.fit_transform)
X=data.copy()
y=data['Status']
# Import train_test_split function
from sklearn.model_selection import train_test_split
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#Import Gradient Boosting Classifier model
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb.fit(X_train, y_train)
#Predict the response for test dataset
y_pred = gb.predict(X_test)
Ниже приведены характеристики моей модели.
Accuracy: 0.9719317419707395
Precision: 0.9090272918124562
Recall: 0.5650282731622445
Пожалуйста, дайте мне знать, что мне делать, чтобы улучшить модель и как обрабатывать широкий спектр категориальных данных. Также, когда я тестирую модель на другом наборе данных, чаще всего категории меняются либо из-за орфографической ошибки, либо из-за нового добавления.
std_id std_name Dem secn_id location bucket Primary_subject status
144 amy SEP 5.3 P dev english pass
230 mani SEV 11.3 E Tech math fail
299 sam DE 5.1 nap prac science pass
568 samy SEP 1.1 P prac V1 pass
769 elle SEP 1.2 pe prac english pass
761 tanj SEP 1.3 N tech V2 pass
112 jon ERM 3.0 N prac phy fail
116 pal NAN 9.1 sc etc V1V2 pass
116 pal NAN 9.2 sc etc V1V3 fail
113 josh NAN 9.3 du etc. erp fail
100 sug EVV 9.1 sc NAN che pass
323 adi ERP 3.1 NAN fit math fail
323 adi ERP 3.2 NAN fit math fail
Так выглядят мои входные данные. За отсутствующее значение я заменил его строкой «NAN». Есть повторяющиеся записи для учащихся, если они изменили какой-либо параметр.
Можете ли вы добавить Prec, Recall для обоих классов
хотя точность составляет 0,97. когда я использую новый набор данных, трансформирую его и вписываю в эту модель, он дает очень неверные прогнозы






Производительность вашей модели достойная. Для дальнейшего улучшения
Настройте параметры из GradientBoostingClassifier. Вы можете установить значения для таких параметров, как n_estimators, learning_rate и т. д., И проверить производительность вашей модели.
Для этой задачи я предлагаю GridSearchCV
Функциональная инженерия: вы можете создавать новые функции из существующих. Поскольку вы не предоставили данные, сложно что-либо предложить. Вы можете проверить важность функции, используя Random Forest и т. д., И использовать функции с высокой важностью.
Вы можете попробовать разные алгоритмы, например XGBoost, LightGBM или даже neural network
Вы можете использовать кросс-валидатор, например Стратифицированное перемешивание
По поводу вашей следующей проблемы.
Опять же, сложно что-либо предложить, не глядя на какие-либо данные. Чтобы избежать орфографических ошибок, вы можете заставить пользователей выбирать значения из раскрывающегося списка и т. д. Если это не так, вы можете посмотреть библиотеку дифлиб, которая найдет наиболее близкое соответствие вашей категории.
Я пытаюсь протестировать эту модель на другом наборе данных. но при этом делаю кодировку метки для значения категории. вижу несоответствие. например, после кодирования данных, значение P столбца 'location' было преобразовано в 1. но когда я сделал кодирование метки на data_new, столбец 'location' P был преобразован в 3. Пожалуйста, дайте мне знать, повлияет ли это на производительность модели и как исправить эту проблему.
Вы можете заранее определить свои категории и использовать их. Таким образом, значение P всегда будет 1. См. Вторую часть этого отвечать.
Я попробовал указанную выше ссылку. немного изменил его и создал свою собственную кодировку в dict, используя names = (np.unique (df.values)) ran = len (np.unique (df.values)) my_enc = dict (zip (names, range (ran + 1 ))) df.replace (my_enc, inplace = True). используя это, я исправил несоответствие. но длина моих уникальных значений 115. Так что у меня есть числа от 0 до 115. Интересно, вызовет ли это проблему ?? так как модель может учитывать иерархию типа 115> 93> 45 и т. д. и т. д. любые предложения по этому поводу ??
Прежде всего, я бы посоветовал начать с очистки и анализа данных. Тот факт, что ваши категории меняются из-за ошибок, необходимо исправить на этапе предварительной обработки. Здесь не слишком много ярлыков, нужно проверять и исправлять данные вручную.
Также проверьте наличие пропущенного значения. Если отсутствуют значения, вам необходимо также решить эту проблему. Вы можете удалить образцы (принимая потерю информации) или заменить отсутствующее значение средним значением для конкретной функции. В литературе есть и другие методы, но в качестве первого шага можно использовать эти два.
Пожалуйста, проверьте количество образцов, которые у вас есть в каждом классе. Если два класса сильно неуравновешены, вы можете подумать о поиске решения, которое касается «несбалансированных данных».
Классификатор как дерево решений / случайный лес - хороший вариант при работе с категориальными переменными.
Использование перекрестной проверки для настройки гиперпараметра классификатора также может улучшить производительность.
РЕДАКТИРОВАТЬ (после добавления таблицы данных)
Вероятно, вы не хотите использовать имена студентов, поскольку эта функция не связана с успехом / неудачей экзамена.
Отлично. Вы затронули темы, которые я пропустил в своем ответе :-)
точность 0,97 а нужно улучшить?