Python 如何使用sklearn将第二个特征添加到计数矢量化特征?
我的数据集中有3列: 审查:产品审查 类型:类别或产品类型 成本:产品成本是多少 这是一个以类型为目标变量的多类问题。此数据集中有64种不同类型的产品 回顾和成本是我的两大特色 我已将数据分为4组,删除了类型变量:Python 如何使用sklearn将第二个特征添加到计数矢量化特征?,python,pandas,scikit-learn,countvectorizer,Python,Pandas,Scikit Learn,Countvectorizer,我的数据集中有3列: 审查:产品审查 类型:类别或产品类型 成本:产品成本是多少 这是一个以类型为目标变量的多类问题。此数据集中有64种不同类型的产品 回顾和成本是我的两大特色 我已将数据分为4组,删除了类型变量: X = data.drop('type', axis = 1) y = data.type X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1) 对于评论,我使用以下方法对其进行矢量化:
X = data.drop('type', axis = 1)
y = data.type
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
对于评论,我使用以下方法对其进行矢量化:
vect = CountVectorizer(stop_words = stop)
X_train_dtm = vect.fit_transform(X_train.review)
这就是我被困的地方
为了运行模型,我需要在训练集中同时拥有这两个功能,但是,由于X_train_dtm是一个稀疏矩阵,我不确定如何将我的pandas系列成本功能连接到该稀疏矩阵。由于数据已经是成本的数字,我认为我不需要对其进行转换,这就是为什么我没有使用类似“FeatureUnion”的东西,它结合了两个转换后的功能
任何帮助都将不胜感激
示例数据:
| Review | Cost | Type |
|:-----------------|------------:|:------------:|
| This is a review | 200 | Toy
| This is a review | 100 | Toy
| This is a review | 800 | Electronics
| This is a review | 35 | Home
更新
在应用tarashypka的解决方案后,我能够将第二个特性添加到X_train_dtm中。但是,我在尝试在测试集上运行相同的测试时出错:
从scipy.sparse导入hstack
vect = CountVectorizer(stop_words = stop)
X_train_dtm = vect.fit_transform(X_train.review)
prices = X_train.prices.values[:,None]
X_train_dtm = hstack((X_train_dtm, prices))
#Works perfectly for the training set above
#But when I run with test set I get the following error
X_test_dtm = vect.transform(X_test)
prices_test = X_test.prices.values[:,None]
X_test_dtm = hstack((X_test_dtm, prices_test))
Traceback (most recent call last):
File "<ipython-input-10-b2861d63b847>", line 8, in <module>
X_test_dtm = hstack((X_test_dtm, points_test))
File "C:\Users\k\Anaconda3\lib\site-packages\scipy\sparse\construct.py", line 464, in hstack
return bmat([blocks], format=format, dtype=dtype)
File "C:\Users\k\Anaconda3\lib\site-packages\scipy\sparse\construct.py", line 581, in bmat
'row dimensions' % i)
ValueError: blocks[0,:] has incompatible row dimensions
vect=countvectorier(stop\u words=stop)
X\u train\u dtm=向量拟合变换(X\u train.review)
价格=X_列价格值[:,无]
X_-train_-dtm=hstack((X_-train_-dtm,价格))
#适用于上述培训集
#但是当我使用测试集运行时,我得到以下错误
X_测试\u dtm=向量变换(X_测试)
价格检验=X检验。价格。值[:,无]
X_-test_-dtm=hstack((X_-test_-dtm,prices_-test))
回溯(最近一次呼叫最后一次):
文件“”,第8行,在
X_测试\u dtm=hstack((X_测试\u dtm,点测试))
文件“C:\Users\k\Anaconda3\lib\site packages\scipy\sparse\construct.py”,第464行,在hstack中
返回bmat([blocks],format=format,dtype=dtype)
文件“C:\Users\k\Anaconda3\lib\site packages\scipy\sparse\construct.py”,第581行,在bmat中
'行维度“%i”)
ValueError:块[0,:]的行维度不兼容
在您的案例中,X\u train\u dtm
计数向量器的结果是scipy.sparse.csr\u matrix
类型。如果不想将其转换为numpy数组,则可以通过scipy.sparse.hstack
添加另一列
>> from scipy.sparse import hstack
>> prices = X_train['Cost'].values[:, None]
>> X_train_dtm = hstack((X_train_dtm, prices))
在您的例子中,
X\u train\u dtm
计数向量器的结果是类型为scipy.sparse.csr\u matrix
。如果不想将其转换为numpy数组,则可以通过scipy.sparse.hstack
添加另一列
>> from scipy.sparse import hstack
>> prices = X_train['Cost'].values[:, None]
>> X_train_dtm = hstack((X_train_dtm, prices))
用来为你钉东西。这个问题很像你的问题。用来帮你解决问题。这很像你的问题。你能上传你的数据吗?@sera我添加了一些示例数据,谢谢!你能上传你的数据吗?@sera我添加了一些示例数据,谢谢!感谢您的帮助,但我得到了以下错误:ValueError:blocks[0,:]具有不兼容的行维度,这是因为data和X_train_dtm具有不同的行数,因为第二行是拆分第一行的结果。我更新了答案,现在检查一下。谢谢!这是可行的,但是我在尝试在测试集上生成hstack时遇到了相同的块错误。我已经更新了原始问题。@NegativeCorrelation您需要调用
fit\u transform
,而不是transform
(就像您对火车组所做的那样),因为第二个问题返回None
。这样做仍然会导致相同的问题:ValueError:blocks[0,:]具有不兼容的行维度感谢帮助,但是我得到了以下错误:ValueError:blocks[0,:]具有不兼容的行维度,这是因为data和X_train_dtm具有不同的行数,因为第二行是拆分第一行的结果。我更新了答案,现在检查一下。谢谢!这是可行的,但是我在尝试在测试集上生成hstack时遇到了相同的块错误。我已经更新了原始问题。@NegativeCorrelation您需要调用fit\u transform
,而不是transform
(就像您对火车组所做的那样),因为第二个问题返回None
。这样做仍然会导致相同的问题:ValueError:blocks[0,:]具有不兼容的行维度