使用 scikit 和预计算内核 (SVM) 进行预测

机器算法验证 scikit-学习 内核技巧
2022-04-19 04:46:02

我是机器学习领域的新手,我正在评估一些工具等以了解它。

对于一个项目,我正在使用一个工具来创建一个预先计算的内核(gram 矩阵)并且还能够对其进行规范化(0 到 1 之间的值)。

我的问题是,在使用预计算内核时,我无法预测除训练集之外的任何内容。

简短总结问题描述:

  • 原始数据集是 1285 个实例
  • 通过使用将其拆分k_folds = sklearn.cross_validation.StratifiedKFold(list_of_annotations, k=5)为5折(手动拆分,使用方法中的索引)
  • 运行(目前仅用于测试目的)

    `分类器= svm.SVC(内核='预计算',概率=真)

    clf = classifier.fit(train_matrix, train_annotations)

    --> 似乎工作/没有问题,直到这里

    • clf.predict(test_matrix)给我以下错误消息:
ValueError: X.shape[1] = 257 should be equal to 1028, the number of samples at training time

我的方法错了吗?

我不太了解错误消息 - 如果我使用预先计算的内核训练 SVM,afaik 我将不会总是具有与预测相同的输入数据(输入数据上的预先计算内核)的形状训练集?!

2个回答

您用于预测的 gram 矩阵似乎是错误的。

一旦你拟合了 SVM,它的预测x是:y=signw,ϕ(x)

肯定有可能无法计算ϕ(x)但需要使用预先计算的 gram 矩阵。代替w=imαiϕ(xi) 进入上述预测表达式:

y=sign imαϕ(xi),ϕ(x)=sign imαiϕ(xi),ϕ(x)=sign imαiK(xi,x)=sign (Xx)Tα=sign Gα

在哪里X是训练数据的设计矩阵(行iXϕ(xi)) 和 gram 矩阵G=(Xx)T(注意 G 不是对称的)

您可以将此作为参考:

from sklearn.datasets import load_digits
from sklearn.svm import SVC
from sklearn.utils import shuffle
from sklearn.metrics import accuracy_score
import numpy as np


digits = load_digits()
X, y = shuffle(digits.data, digits.target)
X_train, X_test = X[:1000, :], X[100:, :]
y_train, y_test = y[:1000], y[100:]

svc = SVC(kernel='precomputed')

kernel_train = np.dot(X_train, X_train.T)  # linear kernel

svc.fit(kernel_train, y_train)

#kernel_test = np.dot(X_test, X_train[svc.support_, :].T)
kernel_test = np.dot(X_test, X_train.T)
y_pred = svc.predict(kernel_test)
print 'accuracy score: %0.3f' % accuracy_score(y_test, y_pred)

我发现我通常会从 kfold 循环之外的训练/矢量化中得到该错误。

vec.fit_transform()、vec.fit_transform()、clf.fit()、clf.pred() - 所有这四个函数调用都必须在循环内部,以确保所有矩阵都获得正确的形状。

您的测试算法设置是这样的吗?:

k_folds = sklearn.cross_validation.StratifiedKFold(list_of_annotations, k=5)

for train_index, test_index in k_folds:
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    vec = TfidfVectorizer()
--> X_train_matrix = vec.fit_transform(X_train)
--> X_test_matrix = vec.transform(X_test)

    clf = svm.SVC()
--> clf.fit(X_train_matrix, y_train)

--> y_pred = clf.predict(X_test_matrix)
    precision, recall, fscore, support = precision_recall_fscore_support(y_test, y_pred)
    # print/save accuracy scores