[英]How to use string kernels in scikit-learn?
我正在嘗試生成一個字符串內核,它提供支持向量分類器。 我嘗試使用計算內核的函數,就像那樣
def stringkernel(K, G):
for a in range(len(K)):
for b in range(len(G)):
R[a][b] = scipy.exp(editdistance(K[a] , G[b]) ** 2)
return R
當我把它作為參數傳遞給SVC時,我得到了
clf = svm.SVC(kernel = my_kernel)
clf.fit(data, target)
ValueError: could not convert string to float: photography
其中我的數據是字符串列表,目標是該字符串所屬的對應類。 我已經回顧了有關此問題的stackoverflow中的一些問題,但我認為對於這種情況,詞袋表示並不合適。
這是scikit-learn的一個限制,已經證明很難擺脫。 您可以嘗試此解決方法 。 用特征向量表示只有一個特征的字符串,這實際上只是字符串表的索引。
>>> data = ["foo", "bar", "baz"]
>>> X = np.arange(len(data)).reshape(-1, 1)
>>> X
array([[0],
[1],
[2]])
重新定義字符串內核函數以處理此表示:
>>> def string_kernel(X, Y):
... R = np.zeros((len(x), len(y)))
... for x in X:
... for y in Y:
... i = int(x[0])
... j = int(y[0])
... # simplest kernel ever
... R[i, j] = data[i][0] == data[j][0]
... return R
...
>>> clf = SVC(kernel=string_kernel)
>>> clf.fit(X, ['no', 'yes', 'yes'])
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
kernel=<function string_kernel at 0x7f5988f0bde8>, max_iter=-1,
probability=False, random_state=None, shrinking=True, tol=0.001,
verbose=False)
這樣做的缺點是,要對新樣本進行分類,您必須將它們添加到data
,然后為它們構建新的偽特征向量。
>>> data.extend(["bla", "fool"])
>>> clf.predict([[3], [4]])
array(['yes', 'no'],
dtype='|S3')
(您可以通過對偽特征進行更多解釋來解決這個問題,例如,查看i >= len(X_train)
的不同表格。但它仍然很麻煩。)
這是一個丑陋的黑客,但它的工作原理(它對集群來說稍微不那么難看,因為數據集在fit
后不會改變)。 代表scikit-learn開發人員發言,我說一個補丁來正確解決這個問題是值得歡迎的。
我認為shogun庫可能是解決方案,也是免費和開源的,我建議查看這個例子: https : //github.com/shogun-toolbox/shogun/tree/develop/src/shogun/kernel/string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.