CountVectorizer 值在分类器中单独工作,在添加其他功能时无法工作
CountVectorizer values work alone in classifier, cannot get working when adding other features
我有一个 Twitter 个人资料数据的 CSV,包含:名称、描述、粉丝数、关注数、机器人(class 我想预测)
我在仅使用 CountVectorizer 值 (xtrain) 和 Bot (ytrain) 时成功执行了 class化模型。但是无法将此功能添加到我的其他功能集中。
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:[=11=]_MyFiles[=11=]_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:[=11=]_MyFiles[=11=]_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.
我做了一些调试:
print(type(training_data.NewCol))
print(type(training_data.NewCol[0]))
>>> <class 'pandas.core.series.Series'>
>>> <class 'numpy.ndarray'>
如有任何帮助,我们将不胜感激。
我会反其道而行之,将您的特征添加到矢量化中。这是我用玩具示例的意思:
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_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()
这将 return:
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()
这将 return,正如预期的那样:
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" 列)传递给训练功能,显然您不应该这样做。
我有一个 Twitter 个人资料数据的 CSV,包含:名称、描述、粉丝数、关注数、机器人(class 我想预测)
我在仅使用 CountVectorizer 值 (xtrain) 和 Bot (ytrain) 时成功执行了 class化模型。但是无法将此功能添加到我的其他功能集中。
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:[=11=]_MyFiles[=11=]_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:[=11=]_MyFiles[=11=]_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.
我做了一些调试:
print(type(training_data.NewCol))
print(type(training_data.NewCol[0]))
>>> <class 'pandas.core.series.Series'>
>>> <class 'numpy.ndarray'>
如有任何帮助,我们将不胜感激。
我会反其道而行之,将您的特征添加到矢量化中。这是我用玩具示例的意思:
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_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()
这将 return:
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()
这将 return,正如预期的那样:
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" 列)传递给训练功能,显然您不应该这样做。