Вопрос или проблема
Извините, я новичок в машинном обучении, но я пытаюсь научиться. Я создаю классификатор на основе этого набора данных, чтобы предсказать психические расстройства на основе признаков. Я хотел запустить очень простую модель классификатора наивного Байеса, но постоянно получаю ошибку неправильной формы ввода (я хочу ввести такие признаки, как возраст, этничность и пол, чтобы получить потенциальные диагнозы). К сожалению, у меня возникают трудности с диагностикой источника моей ошибки и устранением неполадок. Есть какие-либо рекомендации? (игнорируйте многофункциональные данные вверху; я пробовал разные вещи, но предполагаю, что проблема в том, как я ввожу параметры данных)
А именно, для этих меток (диагнозов) я хочу получить вывод, который покажет наличие/отсутствие каждого [0 или 1] на основе признаков (которые являются числовыми)
Имена признаков
[‘YEAR’, ‘AGE’, ‘EDUC’, ‘ETHNIC’, ‘RACE’]
Значения
[ 9, -9, 4 , 2]
Метки:
[‘ADHDFLG’, ‘CONDUCTFLG’, ‘DELIRDEMFLG’, ‘BIPOLARFLG’, ‘DEPRESSFLG’, ‘ODDFLG’, ‘PDDFLG’, ‘PERSONFLG’, ‘SCHIZOFLG’, ‘ALCSUBFLG’]
Соответствующие значения меток
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0]
Также, вопрос на стороне — есть ли у кого-нибудь рекомендации по другим задачам машинного обучения, которые я мог бы попробовать с этим? Я делаю это для класса и пытаюсь подтолкнуть себя к изучению новых тем. Спасибо заранее!
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
import random
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
import scipy
from sklearn.model_selection import train_test_split
df = pd.read_csv("https://csprojectdatavisualizationsample50k.s3.us-east-2.amazonaws.com/sample_df.csv")
df_columns = df.columns
df_feature_names = (df_columns[1:6]).to_list()
df_features = df.iloc[:,2:6].values
df_label_names = (df_columns[26:36]).to_list()
df_labels = df.iloc[:, 26:36].values
#Ввод
print(df_label_names)
# Разделить наши данные
train, test, train_labels, test_labels = train_test_split(df_features,
df_labels,
test_size=0.50,
random_state=42)
print(train.shape)
print(test.shape)
# Инициализировать наш классификатор
gnb = GaussianNB()
# Обучить наш классификатор
model = gnb.fit(train, train_labels)
# Сделать прогнозы
preds = gnb.predict(test)
print(preds)
Согласно документации, GaussianNB может обрабатывать несколько классов, но его функция fit все еще принимает одномерный массив. Этот массив может содержать несколько классов, например: [0, 1, 2, 3,…]
Когда я изменил ваши метки обучения, как указано ниже, функция fit сработала:
train_labels = np.random.randint(0, 9, 25000)
Таким образом, вы можете создать массив для меток. Если каждый образец принадлежит только одному классу, то вы можете пометить этот образец соответствующим классом, но если есть образцы, которые одновременно имеют несколько классов, то вам следует использовать один из них или создать группы, состоящие из этих классов, и пометить образец, если он принадлежит этой группе или нет.
Ответ или решение
Интерпретация и диагностика ошибки "Bad Input Shape"
Ваша проблема с моделью машинного обучения, связанная с ошибкой "Bad Input Shape", может возникать из-за неправильного формата данных, подаваемых на вход классификатору. Давайте разберем возможные причины и пути их устранения, учитывая предоставленный вами код и описание.
1. Понимание структуры данных
Ваши данные могут содержать несколько классов меток, и это может быть источником проблемы. Как говорит документация к модели GaussianNB
, функция fit
принимает одномерный массив меток. Таким образом, вам нужно убедиться, что метки имеют правильный формат.
Вы указали, что ваш массив меток (df_labels
) содержит несколько меток. Например, если в ваших данных присутствуют более одной метки, такая структура может быть не совместима с моделью. Для большинства моделей классификации необходимо преобразовать ваши метки в однородный формат. Например, вы можете использовать мульти-меточные подходы, такие как бинаризация.
2. Как исправить поврежденную структуру входа
Для корректного формирования данных используются следующие шаги:
-
Преобразование меток: Если каждый пример имеет несколько меток, вы можете рассмотреть возможность использования бинаризации меток или однозначного представления. Например, если вы проводите бинаризацию, каждое из ваших заболеваний будет представлено как отдельная колонка с 0 и 1, где 1 указывает на наличие диагноза, а 0 — на его отсутствие.
Вы можете использовать
MultiLabelBinarizer
изsklearn
для автоматического преобразования ваших меток:from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() df_labels_binarized = mlb.fit_transform(df_labels)
-
Проверка формата входных данных: Прежде чем передавать данные в модель
fit
, убедитесь, что ваши признаки (train_features
) и метки (train_labels
) имеют необходимую форму. Например, для бинарных меток форма должна быть(n_samples, n_classes)
.Проверьте форму ваших данных так:
print("Training data shape:", train.shape) print("Training labels shape:", train_labels.shape) # Здесь должно быть (n_samples, n_classes)
-
Корректная настройка обучающих выборок: Убедитесь, что при разделении данных на обучающую и тестовую выборки, форма меток корректно передается. Следующий код обеспечивает создание входных данных правильной формы:
train, test, train_labels, test_labels = train_test_split(df_features, df_labels_binarized, test_size=0.5, random_state=42)
3. Дополнительные рекомендации по исследованию машинного обучения
В дополнение к вашей текущей задаче классификации, вот несколько направлений для дальнейшего изучения:
- Кластеризация: Попробуйте алгоритмы кластеризации, такие как
KMeans
, для группировки данных по подобным характеристикам. - Регрессионный анализ: Изучите линейную регрессию, чтобы спрогнозировать непрерывные переменные на основе ваших данных.
- Конволюционные нейронные сети (CNN): Если у вас есть возможность работать с изображениями (например, медицинскими изображениями), изучите CNN.
- Обработка естественного языка (NLP): Если данные содержат текстовые описания, можно изучить технологии NLP для анализа и классификации текстовой информации.
Заключение
Проблема с ошибкой "Bad Input Shape" может быть решена путем внимательной проверки формата вашего массива меток и преобразования их в единый формат, подходящий для вашей модели. Надеюсь, предоставленная информация поможет вам продолжить ваш путь в изучении машинного обучения. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!