【问题标题】:100% error rate on test set with one class svm一类支持向量机的测试集错误率 100%
【发布时间】:2020-01-04 22:19:42
【问题描述】:

我正在尝试检测异常图像。但是我从模型中得到了奇怪的结果。

我已经用 cv2 读取图像,将它们展平为一维数组,然后将它们转换为 pandas 数据帧,然后将其输入到 SVM。

import numpy as np
import cv2
import glob
import pandas as pd
import sys, os
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn import *
import seaborn as sns`

加载标签和文件

labels_wt = np.loadtxt("labels_wt.txt", delimiter="\t", dtype="str")
files_wt = np.loadtxt("files_wt.txt", delimiter="\t", dtype="str")`

加载并展平图像

wt_images_tmp = [cv2.imread(file) for file in files_wt]
wt_images = [image.flatten() for image in wt_images_tmp]
tmp3 = np.array(wt_images)
mutant_images_tmp = [cv2.imread(file) for file in files_mut]
mutant_images = [image.flatten() for image in mutant_images_tmp]
tmp4 = np.array(mutant_images)


X = pd.DataFrame(tmp3) #load the wild-type images
y = pd.Series(labels_wt)
X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.2, random_state=42) 
X_outliers = pd.DataFrame(tmp4)
clf = svm.OneClassSVM(nu=0.15, kernel="rbf", gamma=0.0001)
clf.fit(X_train)

然后我根据oneclass SVM上的sklearn教程评估结果。

y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

print(n_error_train / len(y_pred_train))
print(float(n_error_test) / float(len(y_pred_test)))
print(n_error_outliers / len(y_pred_outliers))`

我在训练集上的错误率是可变的 (10-30%),但在测试集上,它们从未低于 100%。我做错了吗?

【问题讨论】:

    标签: python machine-learning scikit-learn svm


    【解决方案1】:

    我的猜测是您正在设置random_state = 42,这会使您的train_test_split 始终具有相同的拆分模式。您可以在this 回答中阅读更多相关信息。不要指定任何状态并再次运行代码,所以:

    X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.2)
    

    这将显示不同的结果。一旦你确定这可行,请确保你然后做cross-validation,可能使用k-fold验证。让我们知道这是否有帮助。

    【讨论】:

    • 我删除了随机状态,不幸的是没有看到改进。我什至改变了nu。我重新编写了代码来进行网格搜索,我现在正在努力。希望会有一些事情发生。
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2018-06-15
    • 2011-10-15
    • 2017-05-07
    • 2019-06-07
    • 2017-08-08
    • 2016-04-06
    • 2019-01-26
    相关资源
    最近更新 更多