'''
导入sklearn自带数据集:山鸢鸟数据集
数据集包括 150 条鸢尾花的四个特征 (萼片长/宽和花瓣长/宽) 和三个类别。
是从 csv 文件读取的,本工程从 Sklearn 里面的 datasets 模块中引入,代码如下:
'''
from sklearn.datasets import load_iris
iris = load_iris()
import numpy as np
import matplotlib.pyplot as plt
'''
导入需要的包机器学习中
from sklearn.cross_validation import train_test_split出错
解决方法:
from sklearn.model_selection import train_test_split
原因:
cross_validation 里面的函数都放在 model_selection 里面了
'''
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
#x = iris.data[:,] #取所有特征列;特征值矩阵;
x = iris.data[:, 2:4] #取特征的后两个;如需要画图,用这一行;
y = iris.target[:] #标签列
#print(x)
#print(y)
'''
划分测试集及训练集
test_size:float or int, default=None
测试集的大小,如果是小数的话,值在(0,1)之间,表示测试集所占有的比例;
如果是整数,表示的是测试集的具体样本数;
如果train_size也是None的话,会有一个默认值0.25
shuffle:布尔值,可选(默认值=True)默认洗牌;
'''
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=20)
'''
模型训练及预测:
其中列表左边的一列为分类的标签名,右边support列为每个标签的出现次数.
avg / total行为各列的均值(support列为总和).
precision recall f1-score三列分别为各个类别的精确度/召回率及值
计算方法:https://blog.csdn.net/akadiao/article/details/78788864
F1值是精确度和召回率的调和平均值:
2F1=1P+1R
F1=2P×RP+R
精确度和召回率都高时,F1值也会高. F1值在1时达到最佳值(完美的精确度和召回率),最差为0.在二元分类中, F1值是测试准确度的量度。
'''
'''
创建SVC模型(支持向量机)
sklearn.svm.SVC中kernel参数说明:
https://blog.csdn.net/qq_37007384/article/details/88418256
'''
clf = SVC(kernel='linear', C=0.2)#线性核,惩罚参数
clf.fit(train_x, train_y)
linearVector = clf.support_vectors_
pred_y = clf.predict(test_x)
print(classification_report(test_y, pred_y))
'''
绘制分类结果的图像:目前只能拿两个特征做分类,只用了两个特征只能画二维图像;
'''
steplength = 0.02 # 将训练出的模型用于高密度的预测,形成一条边界,就是二分类的边界线;边界的宽度;可以理解为最小误差;栅格的大小
x_min, x_max = x[:, 0].min() - 0.1, x[:, 0].max() + 0.1#x的范围:特征1的范围:4.2-8.0;
y_min, y_max = x[:, 1].min() - 0.1, x[:, 1].max() + 0.1#y的范围:特征2的范围:1.5-4.5
xmesh = np.arange(x_min, x_max, steplength)
ymesh = np.arange(y_min, y_max, steplength)
xx, yy = np.meshgrid(xmesh, ymesh)
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
#这里预测出来的Z是行向量,也需要重整理成矩阵形式
# Put the result into a color plot
Z = Z.reshape(xx.shape)
f1 = plt.figure()
plt.title('Linear Kernel boundary output')
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
# Plot also the training points
plt.scatter(x[y == 0, 0], x[y == 0, 1], marker='v', color='k', s=100, label='bad')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='o', color='g', s=100, label='good')
plt.scatter(linearVector[:, 0], linearVector[:, 1], marker='.', color='r')
plt.show()