1.支持向量机(分类):
支持向量机分类器,便是根据训练样本的分布,搜寻所有可能的线性分类器中最佳的那个。决定分类直线位置的并不是所有的训练数据,而是其中的的两个空间间隔最小的两个不同类别的数据点。而我们把这种可以用来真正帮助决策最优线性分类模型的数据点叫做“支持向量”
2.代码:
#代码:17手写体数据读取代码样例
#从sklearn.datasets里导入手写体数字加载器
from sklearn.datasets import load_digits
#从通过数据加载器获得手写体数字的数码图像数据并存储在digits变量中
digits=load_digits()
#检视数据规模和特征维度
digits.data.shape
(1797, 64)
#代码18:手写体数据分割代码样例
#从sklearn.cross_validation中导入train_test_split用于数据分割
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)
#分别检视训练与测试数据规模
y_train.shape
(1347,)
y_test.shape
(450,)
X_train.shape
(1347, 64)
y_test.shape
(450,)
#代码19:使用支持向量机(分类)对手写体数字图像进行识别
#从sklearn。prepeocessing里导入数据标准化模块
from sklearn.preprocessing import StandardScaler
#从sklearn.svm里导入基于线性假设的支持向量机机分类器linearSVC
from sklearn.svm import LinearSVC
#从仍然需要对训练和测试的特征数据镜像标准化
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)
#代码20:支持向量机(分类)模型对手写体数码图像识别能力的评估
#使用模型自带的评估函数进行准确性测评
print('The Accuracy of Linear SVC is',lsvc.score(X_test,y_test))
The Accuracy of Linear SVC is 0.9533333333333334
#依然使用sklearn.metrics里面的classification_report模块对预测记过做更加详细的分析
from sklearn.metrics import classification_report
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
3.思路结构:
首先是下载数据,并保起来。其次利用train_test_split把数据按照要求分割成测试集和训练集,利用训练集来训练模型,然后用训练好的模型来预测。预测过后可以使用模型自带的函数进行准确性测评,为了更对预测的结果更加详细的分析可以利用classification_report()函数进行更为详细的评估。
4.train_test_split()函数:
>>> import numpy as np
>>> from sklearn.cross_validation import train_test_split #从sklearn.cross_validation模块导入train_test_split 函数,用于训练集和测试集的划分,cross_validation即交叉验证
>>> X, y = np.arange(10).reshape((5, 2)), range(5) #
>>> X
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> list(y)
[0, 1, 2, 3, 4]
>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.33, random_state=42)
...
>>> X_train
array([[4, 5],
[0, 1],
[6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
[8, 9]])
>>> y_test
[1, 4]
其中的test_size如果为小数则表示测试集所占的比重,如果为整数久代表样本的数量。x_train和x_test都是表示的数据,只不过一个是训练集的一个是测试集的,而y_test和y_test则表示的响应数据在原本的数据集中的标记。
5.classification_report():
>>> X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.33, random_state=42)
...
>>> X_train
array([[4, 5],
[0, 1],
[6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
[8, 9]])
>>> y_test
[1, 4]
输出:
precision recall f1-score support
0 0.50 1.00 0.67 1
1 0.00 0.00 0.00 1
2 1.00 0.67 0.80 3
avg / total 0.70 0.60 0.61 5
分析:
真实值y_true | 预测值y_pred |
0 | 0 |
1 | 0 |
2 | 2 |
2 | 2 |
2 | 1 |
第一行的计算:
即0的预测情况:真实值中有1个0,预测值中有2个0则TP=1/1=1(预测值为0,真实值为0),FP=1/1=1(预测值为0,真实值为1)FN=0(没有真实值为0,预测值不为0的情况)
则precision:TP/(TP+FP)=0.5 recall=1
f1-score=2*精度*召回率/(精度+召回率)=0.67
则1的预测情况和2预测的情况和0预测的情况同理。
最后一行是用support 加权平均算出来的,如0.7= (1*0.5+1*0+1*3)/(1+1+3)
引用:https://blog.csdn.net/qq_36235046/article/details/80588465