我最近一直在使用SVM在一个性别识别项目(python)中工作,但是我迷失了获得的结果:
为什么召回男性为0.09,女性为1?还是女性的精确度只有50%?
SVM Accuracy: 0.540041067762
Classification report:
precision recall f1-score support
Females 0.52 1.00 0.68 242
Males 1.00 0.09 0.16 245
avg / total 0.76 0.54 0.42 487
我将所有图像裁剪,对齐并呈灰度显示如何提高精度?
我需要更改以下参数:clf = svm.SVC()?
我的代码:
import os, sys
import numpy as np
import PIL.Image as Image
import cv2
from sklearn import svm
from sklearn.externals import joblib
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
def read_images(path, id, sz=None):
c = id
X,y = [], []
for dirname, dirnames, filenames in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
for filename in os.listdir(subject_path):
try:
im = Image.open(os.path.join(subject_path, filename))
im = im.convert("L")
# resize to given size (if given)
if (sz is not None):
im = im.resize(sz, Image.ANTIALIAS)
X.append(np.asarray(im, dtype=np.uint8).ravel())
y.append(c)
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
except:
print "Unexpected error:", sys.exc_info()[0]
raise
#c = c+1
return [X,y]
def main():
contador = 0;
# check arguments
if len(sys.argv) != 3:
print "USAGE: example.py </path/to/images/males> </path/to/images/females>"
sys.exit()
# read images and put them into Vectors and id's
[X,x] = read_images(sys.argv[1], 1)
[Y, y] = read_images(sys.argv[2], -1)
# R all images and r all id's
[R, r] = [X+Y, x+y]
R_train, R_test, r_train, r_test = train_test_split(R, r)
# Default svm
clf = svm.SVC()
clf.fit(R_train, r_train)
r_pred = clf.predict(R_test)
target_names = ['Female', 'Male']
print "SVM Accuracy:", accuracy_score(r_test, r_pred)
print "Classification report:\n", classification_report(r_test, r_pred, target_names=target_names)
if __name__ == '__main__':
main()
我将非常感谢您如何使用SVM进行性别识别方面的帮助,感谢您的阅读
好的,现在使用归一化的数据(介于0和1之间),我尝试使用GridSearchCV来使用以下方法调整C和Gamma:
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
svr = svm.SVC()
clf = grid_search.GridSearchCV(svr, param_grid)
一段时间后,我得到这个结果:
{'n_jobs': 1, 'verbose': 0, 'estimator__gamma': 0.0, 'estimator__probability': False, 'param_grid': [{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}, {'kernel': ['rbf'], 'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}], 'cv': None, 'scoring': None, 'estimator__cache_size': 200, 'estimator__verbose': False, 'pre_dispatch': '2*n_jobs', 'estimator__kernel': 'rbf', 'fit_params': {}, 'estimator__max_iter': -1, 'refit': True, 'iid': True, 'estimator__shrinking': True, 'score_func': None, 'estimator__degree': 3, 'estimator__class_weight': None, 'loss_func': None, 'estimator__random_state': None, 'estimator': SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False), 'estimator__coef0': 0.0, 'error_score': 'raise', 'estimator__tol': 0.001, 'estimator__C': 1.0}
SVM Accuracy: 0.767326732673
Classification report:
precision recall f1-score support
Females 0.76 0.77 0.76 294
Males 0.78 0.77 0.77 312
avg / total 0.77 0.77 0.77 606
我不知道这是使用它的正确方法,并且给出此结果的参数C和gamma是什么,但是分类器已经改进,有人可以告诉我我是否做得很好,结果又意味着什么,或者我怎么能做这个?谢谢
桌子
SVM Accuracy: 0.540041067762
Classification report:
precision recall f1-score support
Females 0.52 1.00 0.68 242
Males 1.00 0.09 0.16 245
清楚地表明您的分类器几乎将所有示例识别为女性。这是为什么?100%的召回率表示所有女性样本均已正确识别为女性,而男性样本的100%精度意味着分类器认为男性的每个样本确实是男性。另一方面,女性人口的准确率达到50%,这意味着您平均分类为女性的样本中只有一半是真正的女性,而另一半是男性。
如果您仔细考虑一下,只会得出一个结论:分类器预测(几乎)显示的“女性”标签。现在,您必须找出原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句