[英]Cosine similarity and SVC using scikit-learn
我正在尝试使用余弦相似度内核对带有 1000 个单词的原始数据集的 SVM 进行文本分类:
# Libraries
import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
# Data
x_train, x_test, y_train, y_test = train_test_split(raw_data[:, 0], raw_data[:, 1], test_size=0.33, random_state=42)
# CountVectorizer
c = CountVectorizer(max_features=1000, analyzer = "char")
X_train = c.fit_transform(x_train).toarray()
X_test = c.transform(x_test).toarray()
# Kernel
cosine_X_tr = cosine_similarity(X_train)
cosine_X_tst = cosine_similarity(X_test)
# SVM
svm_model = SVC(kernel="precomputed")
svm_model.fit(cosine_X_tr, y_train)
y_pred = svm_model.predict(cosine_X_tst)
但是该代码会引发以下错误:
ValueError: X has 330 features, but SVC is expecting 670 features as input
我尝试了以下方法,但我不知道它在数学上是否准确,因为我还想实现其他未在scikit-learn
中实现的自定义内核,如直方图交集:
cosine_X_tst = cosine_similarity(X_test, X_train)
因此,基本上主要问题在于 SVC 接收到的矩阵的维度。 一旦将CountVectorizer
应用于训练和测试由于max_features
参数而具有1000 features
的数据集:
(670, 1000)
(330, 1000)
但在应用余弦相似度后,转换为平方矩阵:
(670, 670)
(330, 330)
当SVC
适合训练数据时,它会学习670 features
,并且由于具有不同数量的特征( 330
个)而无法预测测试数据集。 那么,我该如何解决这个问题并能够将自定义内核与SVC
一起使用?
那么,我该如何解决这个问题并能够将自定义内核与
SVC
一起使用?
自己定义一个函数,并将该函数传递给SVC()
中的kernel
参数,例如: SVC(kernel=your_custom_function)
。 看到这个。
此外,您应该在代码中使用如下cosine_similarity
内核:
svm_model = SVC(kernel=cosine_similarity)
svm_model.fit(X_train, y_train)
y_pred = svm_model.predict(X_test)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.