Построение модели классификации

У меня есть данные студентов с 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». Есть повторяющиеся записи для учащихся, если они изменили какой-либо параметр.

точность 0,97 а нужно улучшить?

dejanmarich 13.11.2018 08:00

Можете ли вы добавить Prec, Recall для обоих классов

Venkatachalam 13.11.2018 09:19

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

aim 13.11.2018 09:21
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
165
2

Ответы 2

Производительность вашей модели достойная. Для дальнейшего улучшения

  1. Настройте параметры из GradientBoostingClassifier. Вы можете установить значения для таких параметров, как n_estimators, learning_rate и т. д., И проверить производительность вашей модели. Для этой задачи я предлагаю GridSearchCV

  2. Функциональная инженерия: вы можете создавать новые функции из существующих. Поскольку вы не предоставили данные, сложно что-либо предложить. Вы можете проверить важность функции, используя Random Forest и т. д., И использовать функции с высокой важностью.

  3. Вы можете попробовать разные алгоритмы, например XGBoost, LightGBM или даже neural network

  4. Вы можете использовать кросс-валидатор, например Стратифицированное перемешивание

По поводу вашей следующей проблемы.

Опять же, сложно что-либо предложить, не глядя на какие-либо данные. Чтобы избежать орфографических ошибок, вы можете заставить пользователей выбирать значения из раскрывающегося списка и т. д. Если это не так, вы можете посмотреть библиотеку дифлиб, которая найдет наиболее близкое соответствие вашей категории.

Я пытаюсь протестировать эту модель на другом наборе данных. но при этом делаю кодировку метки для значения категории. вижу несоответствие. например, после кодирования данных, значение P столбца 'location' было преобразовано в 1. но когда я сделал кодирование метки на data_new, столбец 'location' P был преобразован в 3. Пожалуйста, дайте мне знать, повлияет ли это на производительность модели и как исправить эту проблему.

aim 14.11.2018 09:23

Вы можете заранее определить свои категории и использовать их. Таким образом, значение P всегда будет 1. См. Вторую часть этого отвечать.

Sociopath 14.11.2018 10:14

Я попробовал указанную выше ссылку. немного изменил его и создал свою собственную кодировку в 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 и т. д. и т. д. любые предложения по этому поводу ??

aim 14.11.2018 12:48

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

Также проверьте наличие пропущенного значения. Если отсутствуют значения, вам необходимо также решить эту проблему. Вы можете удалить образцы (принимая потерю информации) или заменить отсутствующее значение средним значением для конкретной функции. В литературе есть и другие методы, но в качестве первого шага можно использовать эти два.

Пожалуйста, проверьте количество образцов, которые у вас есть в каждом классе. Если два класса сильно неуравновешены, вы можете подумать о поиске решения, которое касается «несбалансированных данных».

Классификатор как дерево решений / случайный лес - хороший вариант при работе с категориальными переменными.

Использование перекрестной проверки для настройки гиперпараметра классификатора также может улучшить производительность.

РЕДАКТИРОВАТЬ (после добавления таблицы данных)

Вероятно, вы не хотите использовать имена студентов, поскольку эта функция не связана с успехом / неудачей экзамена.

Отлично. Вы затронули темы, которые я пропустил в своем ответе :-)

Sociopath 13.11.2018 08:05

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