Python 多列数据的多项式拟合

Python 多列数据的多项式拟合,python,pandas,machine-learning,scikit-learn,classification,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()

给定一个包含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\u Two']]
的类别,而不是这些类别中的数据

如果我仅为一个类别指定X,则上述代码有效,例如: X=df['Text']


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

我宁愿将文本列和文本列合并为一列,然后从中构造分类器。多项式NB仅适用于一个分类器。下面是将两列Text和Text_合二为一的代码

您可能对多类或多标签分类感兴趣,但它指的是目标变量(Y),而不是因变量(X)。 . 希望能有帮助

import pandas as pd
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split

df = pd.read_csv('data.csv', header=0, sep='|')
df.columns = [x.strip() for x in df.columns]

mnb = MultinomialNB()
tf = TfidfVectorizer()

#df.loc[df['Place'] == 'europe','Place'] = 0
#df.loc[df['Place'] == 'america','Place'] = 1
#X = df[['Text', 'Value', 'Text_Two']]
X = df.Text + df.Text_Two
y = df['Place']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
pipe = make_pipeline(TfidfVectorizer(), MultinomialNB())
pipe.fit(X_train, y_train)
pipe.predict(X_test)

这与多项式nb无关。它可以很好地处理多个列。问题是TFIDF矢量器

TfidfVectorizer仅适用于一维iterable(数据帧的单列),不会对输入数据的形状或类型进行任何类型的检查

它将:

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

ValueError:找到样本数不一致的输入变量:[3100]

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

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

1) 您需要对每个文本列(
text
text\u Two
)进行单独的tf idf矢量化,然后组合生成的矩阵以形成要与多项式nb一起使用的特征矩阵

2) 您可以按照@xmoůŜ的建议将两个文本列组合成一个列,然后对该列执行tf-idf


这两个选项都会产生不同的特征向量,因此您需要首先了解每个选项的作用并选择所需的特征向量。

这不是因为
MultinomialNB
,而是因为
TfidfVectorizer
TfidfVectorizer
仅适用于将根据找到的术语转换为二维数组的单列文本。
for doc in raw_documents:
...
...