给定一个包含100行的数据表,例如:
Place | Text | Value | Text_Two
europe | some random text | 3.2 | some more random text
america | the usa | 4.1 | the white house
...
我试着用以下方法分类:
df = pd.read_csv('data.csv')
mnb = MultinomialNB()
tf = TfidfVectorizer()
df.loc[df['Place'] == 'europe','Place'] = 0
df.loc[df['Place'] == 'america','Place'] = 1
X = df[['Text', 'Value', 'Text_Two']]
y = df['Place']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
X_train_tf = tf.fit_transform(X_train)
mnb.fit(X_train_tf, y_train)
上述操作会产生以下错误:
ValueError:找到的输入变量的数目不一致
样品:[3100]
所以据我所知,它只看到用
X = df[['Text', 'Value', 'Text_Two']]
设置的类别,而不是这些类别中的数据。如果我只为一个类别指定X,则上面的代码有效,例如:
X=df[“文本”]
是否可以在多个数据类别上拟合多项式nb?
最佳答案
这与多项式无关。它可以很好地处理多个列。问题是TfidfVectorizer。
TfidfVectorizer只对一维的iterable(数据帧的单列)起作用,不会对输入数据的形状或类型进行任何检查。
它将only do this:
for doc in raw_documents:
...
...
当您将数据帧传递给它(无论是单列还是多列)时,数据帧上的
for doc in raw_documents:
将只输出列名,而不输出实际数据。传入的数据有三列,因此只有这些列用作文档,因此出现错误X
因为您的
ValueError: Found input variables with inconsistent numbers of samples: [3, 100]
将有100个长度,而您的X(尽管它有100个长度,但是由于tfidfvectorizer,它现在只有3个长度)。所以要解决这个问题,你有两个选择:
1)需要对每个文本列(
y
,Text
)进行单独的tf-idf矢量化,然后将所得矩阵组合起来形成要与多项式nb一起使用的特征矩阵。2)您可以将这两个文本列组合成一个单独的列,正如@ōೳxmoůŜ所建议的,然后对该单个列执行tf idf。
这两个选项将导致不同的特征向量,因此您需要首先了解每个选项的作用并选择所需的内容。
关于python - 在多列数据上拟合MultinomialNB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51697502/