Python CountVectorizer值在分类器中单独工作,在添加其他功能时无法工作

Python CountVectorizer值在分类器中单独工作,在添加其他功能时无法工作,python,scikit-learn,classification,text-classification,countvectorizer,Python,Scikit Learn,Classification,Text Classification,Countvectorizer,我有一个twitter档案数据的CSV,包含:姓名、描述、追随者数量、追随者数量、机器人(我想预测的类) 仅使用CountVectorizer值(xtrain)和Bot(ytrain)时,我成功地执行了一个分类模型。但我无法将此功能添加到我的其他功能集中 vectorizer = CountVectorizer() CountVecTest = vectorizer.fit_transform(training_data.description.values.astype('U')) Count

我有一个twitter档案数据的CSV,包含:姓名、描述、追随者数量、追随者数量、机器人(我想预测的类)

仅使用CountVectorizer值(xtrain)和Bot(ytrain)时,我成功地执行了一个分类模型。但我无法将此功能添加到我的其他功能集中

vectorizer = CountVectorizer()
CountVecTest = vectorizer.fit_transform(training_data.description.values.astype('U'))
CountVecTest = CountVecTest.toarray()
arr = sparse.coo_matrix(CountVecTest)
training_data["NewCol"] = arr.toarray().tolist()

rf = RandomForestClassifier(criterion='entropy', min_samples_leaf=10, min_samples_split=20)
rf = rf.fit(training_data[["followers_count","friends_count","NewCol","bot"]], training_data.bot)
错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-54-7d67a6586592> in <module>()
      1 rf = RandomForestClassifier(criterion='entropy', min_samples_leaf=10, min_samples_split=20)
----> 2 rf = rf.fit(training_data[["followers_count","friends_count","NewCol","bot"]], training_data.bot)

D:\0_MyFiles\0_Libraries\Documents\Anaconda3\lib\site-packages\sklearn\ensemble\forest.py in fit(self, X, y, sample_weight)
    245         """
    246         # Validate or convert input data
--> 247         X = check_array(X, accept_sparse="csc", dtype=DTYPE)
    248         y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None)
    249         if sample_weight is not None:

D:\0_MyFiles\0_Libraries\Documents\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    431                                       force_all_finite)
    432     else:
--> 433         array = np.array(array, dtype=dtype, order=order, copy=copy)
    434 
    435         if ensure_2d:

ValueError: setting an array element with a sequence.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1 rf=随机森林分类器(标准=熵,最小样本数=10,最小样本数=20)
---->2 rf=rf.fit(培训数据[[“粉丝数”、“朋友数”、“新col”、“bot”]],培训数据.bot)
D:\0\u MyFiles\0\u Libraries\Documents\Anaconda3\lib\site packages\sklearn\employ\forest.py适合(self、X、y、sample\u weight)
245         """
246#验证或转换输入数据
-->247 X=检查数组(X,接受sparse=“csc”,dtype=dtype)
248 y=检查数组(y,接受sparse='csc',确保2d=False,dtype=None)
249如果样品重量不是无:
检查数组中的D:\0\u MyFiles\0\u Libraries\Documents\Anaconda3\lib\site packages\sklearn\utils\validation.py(数组、接受稀疏、数据类型、顺序、复制、强制所有有限、确保二维、允许、确保最小样本、确保最小特征、警告数据类型、估计器)
431力(所有有限)
432其他:
-->433 array=np.array(array,dtype=dtype,order=order,copy=copy)
434
435如果确保_2d:
ValueError:使用序列设置数组元素。
我做了一些调试:

print(type(training_data.NewCol))
print(type(training_data.NewCol[0]))
>>> <class 'pandas.core.series.Series'>
>>> <class 'numpy.ndarray'>
打印(类型(training_data.NewCol))
打印(类型(training_data.NewCol[0]))
>>> 
>>> 

任何帮助都将不胜感激。

我会以另一种方式来做,并将您的功能添加到矢量化中。以下是我对玩具示例的意思:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from scipy.sparse import hstack, csr_matrix
假设现在您在名为
df
的数据框中有了功能,在
y\u train
中有了标签:

df = pd.DataFrame({"a":[1,2],"b":[2,3],"c":['we love cars', 'we love cakes']})
y_train = np.array([0,1])
您希望对列
c
执行文本矢量化,并将功能
a
b
添加到矢量化中

vectorizer = CountVectorizer()
CountVecTest = vectorizer.fit_transform(df.c)

CountVecTest.toarray()
这将返回:

array([[0, 1, 1, 1],
       [1, 0, 1, 1]], dtype=int64)
但是
CountVecTest
现在是一个scipy稀疏矩阵。因此,您需要做的是将您的功能添加到此矩阵中。如下所示:

X_train = hstack([CountVecTest, csr_matrix(df[['a','b']])])

X_train.toarray()
这将如预期的那样返回:

array([[0, 1, 1, 1, 1, 2],
       [1, 0, 1, 1, 2, 3]], dtype=int64)
然后你可以训练你的随机森林:

rf = RandomForestClassifier(criterion='entropy', min_samples_leaf=10, min_samples_split=20)
rf.fit(X_train, y_train)

注意:在您提供的代码片段中,您将标签信息(“bot”列)传递给了培训功能,这显然是您不应该做的。

我将以另一种方式执行此操作,并将您的功能添加到矢量化中。下面是我对玩具示例的意思:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
from scipy.sparse import hstack, csr_matrix
假设现在您在名为
df
的数据框中有了功能,在
y\u train
中有了标签:

df = pd.DataFrame({"a":[1,2],"b":[2,3],"c":['we love cars', 'we love cakes']})
y_train = np.array([0,1])
您希望对列
c
执行文本矢量化,并将功能
a
b
添加到矢量化中

vectorizer = CountVectorizer()
CountVecTest = vectorizer.fit_transform(df.c)

CountVecTest.toarray()
这将返回:

array([[0, 1, 1, 1],
       [1, 0, 1, 1]], dtype=int64)
但是
CountVecTest
现在是一个scipy稀疏矩阵。因此,您需要做的是将您的功能添加到此矩阵中。如下所示:

X_train = hstack([CountVecTest, csr_matrix(df[['a','b']])])

X_train.toarray()
这将如预期的那样返回:

array([[0, 1, 1, 1, 1, 2],
       [1, 0, 1, 1, 2, 3]], dtype=int64)
然后你可以训练你的随机森林:

rf = RandomForestClassifier(criterion='entropy', min_samples_leaf=10, min_samples_split=20)
rf.fit(X_train, y_train)

注意:在您提供的代码片段中,您传递了标签信息(“bot”列)对于训练功能,您显然不应该这样做。

非常感谢!成功地使其工作。还需要将数据帧转换为int,但其他一切都是spot-onGlad,这很有帮助!非常感谢!成功地使其工作。也需要将数据帧转换为int,但其他一切都是spot-onGlad,这很有帮助!