#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 примерами!