https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
经常用到sklearn中的SVC函数,这里把文档中的参数翻译了一些,以备不时之需。
本身这个函数也是基于libsvm实现的,所以在参数设置上有很多相似的地方。(PS: libsvm中的二次规划问题的解决算法是SMO)。
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,
tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
参数:
l C:C-SVC的惩罚参数C?默认值是1.0
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
l kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 线性:u'v
1 – 多项式:(gamma*u'*v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(gamma*u'*v + coef0)
l degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
l gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
l coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
l probability :是否采用概率估计?.默认为False
l shrinking :是否采用shrinking heuristic方法,默认为true
l tol :停止训练的误差值大小,默认为1e-3
l cache_size :核函数cache缓存大小,默认为200
l class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
l verbose :允许冗余输出?
l max_iter :最大迭代次数。-1为无限制。
l decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
l random_state :数据洗牌时的种子值,int值
主要调节的参数有:C、kernel、degree、gamma、coef0。
numpy.random.rand()
numpy.random.rand(d0,d1,…,dn)
rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
dn表格每个维度
返回值为指定维度的array
eg:
np.random.randn(2,4)
>>>array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],
[-1.16724625, -0.22408299, 0.63006614, -0.41714538]])
In your clf,
coef_ are the weights assigned to the features; (Note it only works for linear SVM)
support_vectors_ and support_ are the support vectors and the corresponding index;
dual_coef_ is the coefficients of the support vector in the decision function; and
intercept_ is the bias in decision function.
coef_ : array, shape = [n_class * (n_class-1) / 2, n_features]
Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.
coef_ is a readonly property derived from dual_coef_ and support_vectors_.
intercept_ : array, shape = [n_class * (n_class-1) / 2]
Constants in decision function.
support_ : array-like, shape = [n_SV]
Indices of support vectors.
support_vectors_ : array-like, shape = [n_SV, n_features]
Support vectors.
n_support_ : array-like, dtype=int32, shape = [n_class]
Number of support vectors for each class.
我的无法画图,加上
%matplotlib inline
就可以了
好了,别人的代码已经运行好了,现在来读代码:
(1)数据集:
1)数据集介绍:
LFW数据集主要测试人脸识别的准确率,该数据库从中随机选择了6000对人脸组成了人脸辨识图片对,其中3000对属于同一个人2张人脸照片,3000对属于不同的人每人1张人脸照片。测试过程LFW给出一对照片,询问测试中的系统两张照片是不是同一个人,系统给出“是”或“否”的答案。通过6000对人脸测试结果的系统答案与真实答案的比值可以得到人脸识别准确率。这个集合被广泛应用于评价 face verification算法的性能。
2)数据集获取方法:
#原始图像为250 x 250像素,但默认切片并调整大小参数将它们减少到62 x 74。
def fetch_lfw_people(data_home=None, funneled=True, resize=0.5,
min_faces_per_person=0, color=False,
slice_=(slice(70, 195), slice(78, 172)),
download_if_missing=True)
各参数意义:
data_home:可选,默认值:无
为数据集指定另一个下载和缓存文件夹。默认情况下
所有scikit学习数据都存储在'〜/ scikit_learn_data'子文件夹中
funneled: boolean,optional,默认值:True
下载并使用数据集的漏斗变体。
resize: float,optional,默认值0.5
比率用于调整每张脸部图片的大小。
min_faces_per_person:int,optional,默认无
提取的数据集将仅保留具有at的人的图片
至少`min_faces_per_person`不同的图片。
color: 布尔值,可选,默认为False
保留3个RGB通道,而不是将它们平均为一个灰度通道。如果颜色为True,则数据的形状 具有比颜色= False的形状多一个维度。
slice_: 可选
提供自定义2D切片(高度,宽度)以提取 '有趣'的jpeg文件部分,避免使用统计来自背景 的相关性
download_if_missing:可选,默认为True
如果为False,则在数据不在本地可用时引发IOError 而不是尝试从源站点下载数据。
返回值的意义:
dataset:具有以下属性的类似dict的对象:
dataset.data:numpy数组形状(13233,2914)
每行对应于原始尺寸62 x 47的拉面图像像素。更改``slice_``或调整大小参数将改变输出形状 dataset.images:numpy数组形状(13233,62,47)
每行是一个面部图像,对应于5749人中的一个数据集。更改``slice_``或调整大小参数将会改 变输出的形状。
dataset.target:numpy数组形状(13233,)
与每个面部图像相关联的标签。这些标签的范围为0-5748并对应于人员ID。
dataset.DESCR:string
野外Labeled Faces(LFW)数据集的描述。
3)fetch_lfw_people主要的实现思路
1、获取人脸数据集的文件路径,其中check_fetch_lfw函数完成此功能。check_fetch_lfw函数会根据给定的路径判断路径下是否有人脸数据集,若有,返回数据集路径,若没有,那么他会从网上下载,然后自动解压,将解压后的路径返回,并且将压缩包删除。
知识点:os.join,合并路径
用Logger输出日志
用raise 输出异常
用tarfile解压文件
2、 获取人名信息target_names,人名对应的人脸信息faces,target,首先看一下人脸数据集的结构
由上图可以看出lfw_funneled文件夹下包含以人名来命名的文件夹,每个人名的文件夹下都是他的人脸信息。这样的结构化的信息是非常友好的。在这儿_fetch_lfw_people函数负责加载人脸数据集合人脸对应的人名信息。
# searchsorted是寻求插入位置的函数,在这儿巧妙的将person_names数字化,target代表person_names中每各名字在target_names的位置
3.加载图片_load_imgs
_load_imgs要说的不多,主要是作者在考虑到py兼容问题时候考虑的很细致
接下来就是根据slice数据对图片切片,然后在resize特征脸可视化
挑选了前11个主要特征脸,可视化效果图如下:
---------------------
作者:Shane Zhao
来源:CSDN
原文:https://blog.csdn.net/silence2015/article/details/71598631
版权声明:本文为博主原创文章,转载请附上博文链接!
(2)方法:PCA+SVM实现人脸识别
PCA主要是通过奇异值分解将数据映射到低纬度的空间(正交去相关)。PCA在数据降维,数据压缩,特征提取有很大贡献。在此,我们利用PCA提取150个主要特征,并将人脸数据全部映射到150维度,通过这150维人脸特征作为训练数据训练基于rbf kernel的SVM,模型差不多有0.85的准确率。
1)sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False):
参数意义:
n_components:
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
类型:int 或者 string,缺省时默认为None,所有成分被保留。
赋值为int,比如n_components=1,将把原始数据降到一个维度。
赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
whiten:
类型:bool,缺省时默认为False
意义:白化,使得每个特征具有相同的方差。
关于“白化”:
我们已经了解了如何使用PCA降低数据维度。在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化(一些文献中也叫sphering)。举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。
2、PCA对象的属性
components_ :返回具有最大方差的成分。
explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
n_components_:返回所保留的成分个数n。
mean_:
noise_variance_:
3、PCA对象的方法
fit(X,y=None)
fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。
fit(X),表示用数据X来训练PCA模型。
函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。
fit_transform(X)
用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。
inverse_transform()
将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)
transform(X)
将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。
此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法,以后用到再补充吧。
4.GridSearchCV方法自动选择超参数
在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工神经网络模型中的隐藏层层数和每层的节点个数,正则项中常数大小等等,它们都需要事先指定。超参数选择不恰当,就会出现欠拟合或者过拟合的问题。
我们在选择超参数有两个途径:
1.凭经验
2.选择不同大小的参数,带入到模型中,挑选表现最好的参数。
通过途径2选择超参数时,可以使用Python中的GridSearchCV方法,自动对输入的参数进行排列组合,并一一测试,从中选出最优的一组参数。
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=’warn’)
例如:
clf=GridSearchCV(模型,param_grid,cv=5)
clf.fit(X_train,y_train)
5.classification_report:
sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。
主要参数:
y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。
y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
digits:int,输出浮点值的位数.
(3)测试结果进行显示:
1.figure语法及操作
(1)figure语法说明
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
2.subplot(nrows,ncols,index,**kwargs)
subplot(pos,**kwargs)
subplot(ax)
一个3位整数或三个独立的整数,用于描述子图的位置。如果三个整数按顺序为nrows,ncols和index,则子图将采用nrows行和ncols列的网格上的索引位置。 index从左上角的1开始向右增加。
pos是一个三位整数,其中第一个数字是行数,第二个是列数,第三个是子图的索引。即fig.add_subplot(235)与fig.add_subplot(2,3,5)相同。请注意,所有整数必须小于10才能使此表单生效。
3.rsplit
str. rsplit([sep[, maxsplit]])
返回字符串中单词的列表,由分隔符字符串(从右侧开始)分隔。
sep
可选的。将字符串分成分组的字符;默认是空格。
maxsplit
可选的。要做的分裂数量;默认值为-1,它会拆分所有项目。