Как мне совместить многочленный наивный байесовский классификатор с несколькими функциями в sci-kit?

#machine-learning #scikit-learn #naivebayes

#машинное обучение #scikit-learn #наивный Байес

Вопрос:

Я пытаюсь подогнать многочленный NB-классификатор в sci-kit с несколькими функциями, но при каждой попытке я получаю ошибку значения. Это мой фрейм данных:

 data = {"embedding":[[0, 3, 5, 7], [1, 4, 6, 8], [2, 6, 8, 11]],
       "mention": [0, 1, 1],
       "y_label": [0, 0, 1]}

df_training = pd.DataFrame(data=data)
 

Когда я пытаюсь подогнать, используя только одну функцию, она работает нормально. Например, следующее не вызывает проблем:

 X = df_training["embedding"].to_list()
y = df_training["y_label"]

clf = MultinomialNB()
clf.fit(X, y)
 

Однако, когда я пытаюсь добавить другую функцию, следующее вызывает ошибку значения:

 X = df_training[["embedding", "mention"]]
y = df_training["y_label"]

clf = MultinomialNB()
clf.fit(X, y)
 
 ValueError: setting an array element with a sequence.
 

Я попытался преобразовать X в массив numpy, но проблема не устранена. Есть идеи о том, почему это происходит? Я чувствую, что подгонка с несколькими функциями должна быть довольно простой, и, возможно, я упускаю что-то очевидное.

Ответ №1:

Вы можете подогнать классификатор к набору данных из нескольких функций, однако я считаю, что формат неверен! Если вы напечатаете X, вы увидите, что это выглядит так:

            embedding  mention
0   [0, 3, 5, 7]        0
1   [1, 4, 6, 8]        1
2  [2, 6, 8, 11]        1
 

Однако это должно выглядеть так:

    emb1  emb2  emb3  emb4  mention
0     0     3     5     7        0
1     1     4     6     8        1
2     2     6     8    11        1
 

Столбец встраивания должен быть разбит, поскольку каждый элемент встраивания сам по себе является индивидуальной функцией! Попробуйте этот код:

 from sklearn.naive_bayes import MultinomialNB
import pandas as pd

data = {"embedding":[[0, 3, 5, 7], [1, 4, 6, 8], [2, 6, 8, 11]],
       "mention": [0, 1, 1],
       "y_label": [0, 0, 1]}

df_training = pd.DataFrame(data=data)

X = df_training["embedding"].to_list()
y = df_training["y_label"]

clf = MultinomialNB()
clf.fit(X, y)

df_training[['emb1','emb2','emb3','emb4']] = pd.DataFrame(df_training.embedding.tolist(), index= df_training.index)

X = df_training[['emb1','emb2','emb3','emb4', "mention"]]
y = df_training["y_label"]

print(X)
print(y)
clf = MultinomialNB()
clf.fit(X, y)
 

Комментарии:

1. Спасибо! Это был всего лишь пример, но в моем реальном ноутбуке каждое из моих вложений имеет размер 256, и у меня есть только 24 строки обучающих данных. Разве нецелесообразно иметь «толстые» фреймы данных, в которых больше столбцов, чем строк?

2. Да, вы должны попытаться получить больше данных! Вероятно, ваш классификатор не будет хорошо обрабатывать данные только с 24 примерами!