如何在 sklearn.svm.libsvm.fit() 分类器中包含列表类型功能?

Posted

技术标签:

【中文标题】如何在 sklearn.svm.libsvm.fit() 分类器中包含列表类型功能?【英文标题】:How do I include a list type feature in sklearn.svm.libsvm.fit() classifier? 【发布时间】:2016-12-04 20:52:39 【问题描述】:

我正在尝试遍历多个文本文档并通过录制创建一个功能集:

位置列表在文本中 关键短语的词性 每个关键短语的长度(其中的字数) 每个关键词的频率

提取特征的代码sn-p:

#Take list of Keywords 
keyword_list = [line.split(':')[1].lower().strip() for line in keywords.splitlines() if ':' in line ]

#Position
position_list = [ [m.start()/float(len(document)) for m in re.finditer(re.escape(kw),document,flags=re.IGNORECASE)] for kw in keyword_list]
        
#Part of Speech
pos_list = []
for key in keyword_list:    
   pos_list.append([pos for w,pos in nltk.pos_tag(nltk.word_tokenize(key))])
    
#Length of each keyword
len_list = [ len(k.split(' ')) for k in keyword_list]
    
#Text Frequency 
freq_list = [ len(pos)/float(len(document)) for pos in position_list]
    
target.extend(keyword_list)
                    
for i in range(0,len(keyword_list)):
    data.append([position_list[i],pos_list[i],len_list[i],freq_list[i]])

在哪里

目标:关键字列表 数据:功能列表

我通过了一个分类器:

from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=0.25,random_state = 42)

import numpy as np
X_train = np.array(X_train)
y_train = np.array(y_train)


from sklearn import svm
cls = svm.SVC(gamma=0.001,C=100) # Parameter values Matter!
cls.fit(X_train,y_train)
predictions = cls.predict(X_test)

但我得到一个错误:

Traceback (most recent call last):
  File "supervised_3.py", line 113, in <module>
    cls.fit(X_train,y_train)
  File "/Library/Python/2.7/site-packages/sklearn/svm/base.py", line 150, in fit
    X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
  File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 373, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence

所以,我通过更改删除了所有列表项

data.append([position_list[i],pos_list[i],len_list[i],freq_list[i]])

data.append([len_list[i],freq_list[i]])

成功了。

但我需要包含position_listpos_list

我认为它不起作用,因为这 2 个是列表。所以,我尝试将它们转换为数组:

data.append([np.array(position_list[i]),np.array(pos_list[i]),len_list[i],freq_list[i]])

但我仍然遇到同样的错误。

【问题讨论】:

【参考方案1】:

在特征提取代码的最后一个 for 循环中,您尝试将四个元素的列表附加到 data,即 position_list[i]pos_list[i]len_list[i]freq_list[i]。问题是前两个元素本身就是列表,但是各个特征必须是 escalars(这就是为什么不能通过将子列表转换为 numpy 数组来解决问题的原因)。他们每个人都需要不同的解决方法:

    position_list[i] 这是一个浮点数列表。您可以将此列表替换为从中计算出的一些统计数据,例如均值和标准差。 pos_list[i] 这是从nltk.pos_tag 产生的 (token, tag)* 形式的元组列表中提取的标签列表。标签(字符串)可以通过计算它们的出现次数以直接的方式转换为数字。为简单起见,我将添加'NN''NNS' 标签的频率**

要让您的代码正常工作,您只需将最后一个 for 循环更改为:

for i in range(0, len(keyword_list)):
    positions_i = position_list[i]
    tags_i = pos_list[i]
    len_tags_i = float(len(tags_i))
    m = np.mean(positions_i)
    s = np.std(positions_i)
    nn = tags_i.count('NN')/len_tags_i
    nns = tags_i.count('NNS')/len_tags_i
    data.append([m, s, nn, nns, len_list[i], freq_list[i]])

通过这样做,生成的特征向量变为 6 维。不用说,您可以使用更多或更少的统计数据和/或标签频率,甚至是不同的标签集。

* 您在创建pos_list 的for 循环中使用的标识符w,pos 有点误导。

**您可以使用collections.Counter 更有效地计算每个标签的出现次数。

【讨论】:

以上是关于如何在 sklearn.svm.libsvm.fit() 分类器中包含列表类型功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?