繁体   English   中英

使用 scikit-learn 的余弦相似度和 SVC

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM