svm入门实战之手写体识别
先上代码!!
# 从sklearn.datasets里导入手写体数字加载器。
from sklearn.datasets import load_digits
# 从sklearn.cross_validation中导入train_test_split用于数据分割。
from sklearn.cross_validation import train_test_split
# 从sklearn.preprocessing里导入数据标准化模块。
from sklearn.preprocessing import StandardScaler
# 从sklearn.svm里导入基于线性假设的支持向量机分类器LinearSVC。
from sklearn.svm import LinearSVC
# 从sklearn.metrics里导入classification_report模块对预测结果做详细分析
from sklearn.metrics import classification_report
# 从通过数据加载器获得手写体数字的数码图像数据并储存在digits变量中。
digits = load_digits()
# 随机选取75%的数据作为训练样本;其余25%的数据作为测试样本。
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33)
# 从仍然需要对训练和测试的特征数据进行标准化。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 初始化线性假设的支持向量机分类器LinearSVC。
lsvc = LinearSVC()
#进行模型训练
lsvc.fit(X_train, y_train)
# 利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中。
y_predict = lsvc.predict(X_test)
# 打印出每个类别的精确率、召回率、f1值
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))
结果如下:
precision recall f1-score support
0 0.92 1.00 0.96 35
1 0.96 0.98 0.97 54
2 0.98 1.00 0.99 44
3 0.93 0.93 0.93 46
4 0.97 1.00 0.99 35
5 0.94 0.94 0.94 48
6 0.96 0.98 0.97 51
7 0.92 1.00 0.96 35
8 0.98 0.84 0.91 58
9 0.95 0.91 0.93 44
avg / total 0.95 0.95 0.95 450
知识点整理-sklearn的手写体数据集
# 1- 导入
from sklearn.datasets import load_digits
# 2- 属性
print(digits.keys())
#['images', 'data', 'target_names', 'DESCR', 'target']
# images: 手写体图片数组,(1797,8,8)
# data: 数组,(1797,64)
# target_names:数组,1-10,(10,1)
# target:data对应的实际值,(1797,1)
# DESCR;描述
知识点整理-数据集分割
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33)
# train_test_split用于切分数据集为训练集和测试集
# 接受的参数有 arrays(可有多个) 、 test_size 、random_state
# arrays :划分的样本特征集及对应的标签
# test_size : 测试集的比例,如果是整数则表示测试集的大小,默认是0.25
# random_state :是随机数的种子(其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样)
知识点整理-数据标准化模块
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 数据标准化的定义:数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间(归一化是特殊的标准化)
# 数据标准化的原因:SVM中处理分类问题如果不进行数据的归一化处理,会对准确率产生很大的影响,出现因为数值过大导致c,g取值超过寻优范围
# 本方法的实现细节:(X-X_mean)/X_std X_n:均值,x_std:方差
# 本方法的结果:对每个属性/每列来说所有数据都聚集在0附近,方差值为1
# 实例:
# 标准化前
(array([ 0., 0., 1., 14., 11., 0., 0., 0., 0., 0., 9., 15., 2.,
0., 4., 0., 0., 2., 16., 6., 0., 7., 16., 2., 0., 8.,
16., 6., 6., 16., 12., 0., 0., 5., 16., 16., 16., 15., 3.,
0., 0., 0., 1., 4., 16., 8., 0., 0., 0., 0., 0., 9.,
16., 1., 0., 0., 0., 0., 0., 15., 16., 0., 0., 0.]),
# 标准化后:
array([ 0.00000000e+00, -3.26723140e-01, -8.75547113e-01, 5.15429155e-01,
-2.02767578e-01, -1.01854560e+00, -4.16870153e-01, -1.28445208e-01,
-6.30488325e-02, -6.20016361e-01, -2.43754230e-01, 7.50084614e-01,
-1.76332093e+00, -1.36304030e+00, 5.63871245e-01, -1.38837739e-01,
-5.15600932e-02, -1.73546020e-01, 1.08113330e+00, -1.58796824e-01,
-1.15489364e+00, -1.25917647e-01, 4.24696964e+00, 4.40806560e+00,
-3.85614944e-02, 1.73466608e+00, 1.11511355e+00, -4.69981158e-01,
-6.29056628e-01, 1.41979885e+00, 2.54007235e+00, -4.72455591e-02,
0.00000000e+00, 7.19570322e-01, 1.31912348e+00, 1.11138665e+00,
9.64484118e-01, 1.04716621e+00, -2.71053713e-03, 0.00000000e+00,
-7.08978629e-02, -5.32239088e-01, -9.10195142e-01, -5.11791113e-01,
1.32867334e+00, -3.31959081e-02, -7.98799181e-01, -8.22120443e-02,
-4.09347820e-02, -4.02862116e-01, -1.33103689e+00, -1.08678943e-01,
1.21393727e+00, -1.25990174e+00, -7.46600463e-01, -2.05957126e-01,
-2.72569633e-02, -2.91387122e-01, -1.08064753e+00, 6.74063507e-01,
8.51068634e-01, -1.11540424e+00, -4.97094931e-01, -1.90547407e-01]))
知识点整理-准确率(Accuracy),精确率(Precision),召回率(Recall) ,f1值
-
定义
True Positive(真正,TP):将正类预测为正类数
True Negative(真负,TN):将负类预测为负类数
False Positive(假正,FP):将负类预测为正类数误报 (Type I error)
False Negative(假负,FN):将正类预测为负类数→漏报 (Type II error)
准确率(Accuracy)=(TP+TN)/(TP+TN+FP+FN)
精确率(Precision)= TP/(TP+FP)
召回率(Recall)=TP/(TP+FN)
F1=(2*P*R)/(P+R) 综合准确率和召回率,分值越高实验方法越有效
-
举例:
假设我们手上有100个正样本,50个负样本,我们要找出所有的正样本,系统查找出70个,其中只有40个是真正的正样本,计算上述各指标。 TP: 将正类预测为正类数 40 FN: 将正类预测为负类数 60 FP: 将负类预测为正类数 30 TN: 将负类预测为负类数 20 准确率(accuracy) = 预测对的/所有 = (40+20)/150 = 40% 精确率(precision) = TP/(TP+FP) = 40/70 = 57% 召回率(recall) = TP/(TP+FN) = 40/(40+60)= 40%