python - 在多列数据上拟合 MultinomialNB

标签 python pandas machine-learning scikit-learn classification

给定一个包含 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: Found input variables with inconsistent numbers of samples: [3, 100]

据我所知,它只能看到使用 X = df[['Text', 'Value', 'Text_Two']] 设置的类别,而不是这些类别中的数据。

如果我只为一个类别指定 X,则上面的代码有效,例如: X = df['文本']

是否可以将 MultinomialNB 拟合到多个类别的数据上?

最佳答案

这与 MultinomialNB 无关。它可以很好地处理多列。问题是 TfidfVectorizer。

TfidfVectorizer 仅适用于单一维度的可迭代(数据框的单列),不会对输入数据的形状或类型进行任何类型的检查。

它将only do this :

for doc in raw_documents:
...
...

当您将数据框传递给它时(无论是单列还是多列),for doc in raw_documents:,在数据框上只会输出列名,而不输出实际数据。您在 X 中传递的数据具有三列,因此只有这些列用作文档,因此出现错误

ValueError:发现样本数量不一致的输入变量:[3, 100]

因为您的 y 的长度为 100,而您的 X(即使它的长度为 100,但由于 tfidfvectorizer,它现在只有 3 个长度)。

所以要解决这个问题,您有两个选择:

1) 您需要对每个文本列(TextText_Two)进行单独的 tf-idf 向量化,然后组合结果矩阵形成特征矩阵与 MultinomialNB 一起使用。

2) 您可以按照@âńōŋŷxmoůŜ 的建议将两个文本列组合成一个列,然后在该列上执行 tf-idf。

这两个选项会产生不同的特征向量,所以你需要先了解每个选项的作用,然后选择你想要的。

关于python - 在多列数据上拟合 MultinomialNB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51697502/

相关文章:

python - 无法更新 Django 1.9 BooleanField

python - 提取括号内字符串的内容

python - pandas dataframe 根据单元格中匹配的字符串获取行

python - 循环遍历产品以计算Python中的系列

r - R 中的在线机器学习

python - tensorflow ,凯拉斯。使用 bool 数组作为输入构建模型

python - 计算 Pandas groupby 中的唯一索引值

python - 任何人都可以解释为什么我收到此错误 [ImportError : lxml not found, 请安装它]

python - ValueError : all the input array dimensions for the concatenation axis must match exactly, 但沿维度 2,索引 0 处的数组大小为 3

python - Tensorflow 自定义层 : Creating a sparse matrix with trainable parameters