我在尝试进行情感分析实验,并尝试为以下内容运行随机分类器:
|Topic |value|label||Apples are great |-0.99|0 ||Balloon is red |-0.98|1 ||cars are running |-0.93|0 ||dear diary |0.8 |1 ||elephant is huge |0.91 |1 ||facebook is great |0.97 |0 |
在使用sklearn库将其分成训练和测试集后,
我对Topic列进行了以下处理,以便计数向量化器可以使用它:
x = train.iloc[:,0:2]#移除所有除字母外的标点符号x.replace("[^a-zA-Z]"," ",regex=True, inplace=True)#转换为小写x = x.apply(lambda a: a.astype(str).str.lower())x.head(2)
之后,我对topics列应用了计数向量化器,将其与value列一起转换,并应用随机分类器。
## 导入库以检查准确性from sklearn.metrics import classification_report,confusion_matrix,accuracy_scorefrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.ensemble import RandomForestClassifier## 实现词袋模型countvector=CountVectorizer(ngram_range=(2,2))traindataset=countvector.fit_transform(x['Topics'])train_set = pd.concat([x['compound'], pd.DataFrame(traindataset)], axis=1)# 实现随机森林分类器randomclassifier=RandomForestClassifier(n_estimators=200,criterion='entropy')randomclassifier.fit(train_set,train['label'])
但我收到了以下错误:
TypeError Traceback (most recent call last)TypeError: float() argument must be a string or a number, not 'csr_matrix'The above exception was the direct cause of the following exception:ValueError Traceback (most recent call last)<ipython-input-41-7a1f9b292921> in <module>() 1 # implement RandomForest Classifier 2 randomclassifier=RandomForestClassifier(n_estimators=200,criterion='entropy')----> 3 randomclassifier.fit(train_set,train['label'])4 frames/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order) 83 84 """---> 85 return array(a, dtype, copy=False, order=order) 86 87 ValueError: setting an array element with a sequence.
我的想法是:
我收到的值来自于应用vader-sentiment,我希望将其也应用到我的随机分类器中,以查看vader分数对输出的影响。
也许有办法将value列中的数据与生成的稀疏矩阵traindata相乘
请问有人可以告诉我如何在这种情况下操作吗?
回答:
问题在于将另一列连接到稀疏矩阵(countvector.fit_transform
的输出)。为了简化起见,假设你的训练数据是:
x = pd.DataFrame({'Topics':['Apples are great','Balloon is red','cars are running', 'dear diary','elephant is huge','facebook is great'], 'value':[-0.99,-0.98,-0.93,0.8,0.91,0.97,], 'label':[0,1,0,1,1,0]})
你可以看到这会产生一些奇怪的结果:
countvector=CountVectorizer(ngram_range=(2,2))traindataset=countvector.fit_transform(x['Topics'])train_set = pd.concat([x['value'], pd.DataFrame(traindataset)], axis=1)train_set.head(2) value 00 -0.99 (0, 0)\t1\n (0, 1)\t11 -0.98 (0, 3)\t1\n (0, 10)\t1
虽然可以将你的稀疏矩阵转换为密集的numpy数组,然后你的pandas数据框可以正常工作,但如果你的数据集很大,这将非常耗费资源。为了保持稀疏性,你可以这样做:
from scipy import sparsetrain_set = scipy.sparse.hstack([sparse.csr_matrix(x['value']).reshape(-1,1),traindataset])randomclassifier=RandomForestClassifier(n_estimators=200,criterion='entropy')randomclassifier.fit(train_set,x['label'])
也请查看稀疏矩阵的帮助页面