是SVM分类的过度拟合问题吗?

问题描述

我是机器学习的新手,我想从脸上发现情绪。

预处理:我使用equalizeHist均衡灰度图像的直方图(JAFFE数据库中有213张图像),目的是标准化亮度并增加图像的对比度。

特征提取:我使用Gabors滤镜从图像中提取特征,并得到213x120的矩阵。我拆分数据:60%的训练数据和40%的测试数据,并将其标准化。

训练和测试:为了训练模型,我将SVM分类器与RBF内核一起使用。通过网格搜索,我选择了最佳的C对,γ(使用10倍交叉验证)。然后,我在测试数据(看不见的数据)上测试了模型的性能,并获得了89%的准确性。

问题是,当我想从新输入的面孔预测情绪时,我得到了错误的结果。。这是一个过拟合的问题吗?

更新1:特征提取

gf = GaborFilter(ksize=(11,11),freq_nbr=5,or_nbr=8,lambd=4,sigma=8,gamma=5,psi=5*np.pi/6) #Gabor filter with *cv2.getGaborKernel* 

data = []
for j in range(len(roi1_images)): # len(roi1_images) = 213
  vect1 = feature_extraction_roi_avr(roi1_images[j],gf.kernels) # feature vect from left eye
  vect2 = feature_extraction_roi_avr(roi2_images[j],gf.kernels) # feature vect from right eye (40 features)
  vect3 = feature_extraction_roi_avr(roi3_images[j],gf.kernels) # feature vect from mouth (40 features)
  vect = np.concatenate((vect1,vect2,vect3),axis=None) # feature vect of one face (40 features)
  data.append(vect)
data = np.array(data) # Data matrix (213,120)

更新2:学习和测试模型


clf = gridsearchcv(estimator=SVC(kernel='rbf'),param_grid=svm_parameters,cv=10,n_jobs=-1) # grid search with 10fold cross validation 
scaler = StandardScaler()
 
# Split data
X_train_,X_test_,y_train,y_test = train_test_split(data,data_labels,random_state=0,test_size=0.4,stratify=data_labels)

X_train = scaler.fit_transform(X_train) # normalize train data
clf.fit(X_train,y_train) # fit SVM model
X_test = scaler.transform(X_test) # normalize test data
score = clf.score(X_test,y_test) # calculate mean accuracy
print(score) # score accuracy = 0.8953488372093024

更新3:预测新输入

    landmarks,gs_image = detect_landmarks(path_image)
    roi1_image = extract_roi(gs_image,landmarks,1) #extract region 1 (eye 1)
    roi2_image = extract_roi(gs_image,2) #extract region 2 (eye 2)
    roi3_image = extract_roi(gs_image,3) #extract region 3 (eye 3)
    vect1 = feature_extraction_roi_avr(roi1_image,gf.kernels)
    vect2 = feature_extraction_roi_avr(roi2_image,gf.kernels) 
    vect3 = feature_extraction_roi_avr(roi3_image,gf.kernels)
    vect = np.concatenate((vect1,axis=0)
    vect = np.reshape(vect,(1,-1))
    vect = scaler.transform(vect)
    class_ = clf.predict(vect)[0]
    print(class_,end=" ")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)