案例1:红酒分类
上面我们采用make_blobs模拟数据来介绍K邻近算法,下面我们通过sklearn数据集来看一下K邻近算法的表现。
# 红酒案例 # 导入sklearn数据集 from sklearn import datasets def Sklean_wine(): #导入红酒数据集 wine_dataset = datasets.load_wine() print('红酒数据集中的键:{}'.format(wine_dataset.keys()))
输出:
红酒数据集中的键:dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])
- 数据:data
- 目标分类:target
- 设计:frame
- 目标分类名称:target_names
- 数据描述:DESCR
- 特征变量名称:feature_names
print('红酒数据概况:{}'.format(wine_dataset['data'].shape))
输出:
红酒数据概况:(178, 13)
说明红酒数据中有178个样本,13个特征变量。下面代码可以显示更详细的数据信息。
print('红酒数据:{}:\n'.format(wine_dataset['data']))
输出:
红酒数据: [[1.423e+01 1.710e+00 2.430e+00 ... 1.040e+00 3.920e+00 1.065e+03] [1.320e+01 1.780e+00 2.140e+00 ... 1.050e+00 3.400e+00 1.050e+03] [1.316e+01 2.360e+00 2.670e+00 ... 1.030e+00 3.170e+00 1.185e+03] ... [1.327e+01 4.280e+00 2.260e+00 ... 5.900e-01 1.560e+00 8.350e+02] [1.317e+01 2.590e+00 2.370e+00 ... 6.000e-01 1.620e+00 8.400e+02] [1.413e+01 4.100e+00 2.740e+00 ... 6.100e-01 1.600e+00 5.600e+02]]
print('红酒数据描述:{}'.format(wine_dataset['DESCR']))
输出:
红酒数据描述:.. _wine_dataset: Wine recognition dataset ------------------------ **Data Set Characteristics:** :Number of Instances: 178 (50 in each of three classes) :Number of Attributes: 13 numeric, predictive attributes and the class :Attribute Information(属性信息): - Alcohol - Malic acid - Ash - Alcalinity of ash - Magnesium - Total phenols - Flavanoids - Nonflavanoid phenols - Proanthocyanins - Color intensity - Hue - OD280/OD315 of diluted wines - Proline - class: - class_0 - class_1 - class_2 …
#将数据分为训练集和测试集 X = wine_dataset['data'] y = wine_dataset['target'] #测试集占30% X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=0,test_size=0.3) # 打印X_train,X_test,y_train,y_test的形态 print("X_train,的形态:{}".format(X_train.shape)) print("X_test的形态:{}".format(X_test.shape)) print("y_train的形态:{}".format(y_train.shape)) print("y_test的形态:{}".format(y_test.shape))
输出:
X_train,的形态:(124, 13) X_test的形态:(54, 13) y_train的形态:(124,) y_test的形态:(54,)
从输出可以看出,训练集的数量124(124/178=70%),测试集的数量54 (54/178=30%)。
#导入KNN算法 knn = KNeighborsClassifier(n_neighbors=1) knn.fit(X_train,y_train) print('测试数据的得分:{}:\n'.format(knn.score(X_test,y_test)))
输出
测试数据的得分:0.7592592592592593:
#输出计算值 print(knn.predict(X_test)) #输出实际标签 print(y_test)
输出
[0 1 1 0 1 1 0 2 1 1 0 1 0 2 1 1 0 0 1 0 1 0 1 1 0 1 1 1 2 2 0 0 1 0 0 0 2 1 1 1 2 0 1 1 1 2 2 2 2 0 2 1 0 2] [0 2 1 0 1 1 0 2 1 1 2 2 0 1 2 1 0 0 1 0 1 0 0 1 1 1 1 1 1 2 0 0 1 0 0 0 2 1 1 2 0 0 1 1 1 0 2 1 2 0 2 2 0 2]
- 数据得分为0.76,从输出结果也可以看出,有13个数据错误(54-13)/54=0.76。准确率才0.76,K邻近算法拟合度在红酒分类中表现不是太好。
不管如何,假设我们现在有一瓶酒,它的参数如下:
- Alcohol(酒精): 25.5
- Malic acid(苹果酸):3.14
- Ash(灰) : 3.22
- Alcalinity of ash(灰分的碱性) : 18.5
- Magnesium(镁) : 95.8
- Total phenols(总酚): 0.97
- Flavanoids(黄酮类化合物) :2.52
- Nonflavanoid phenols(非薰衣草酚类) :0.67
- Proanthocyanins(原花青素) :1.52
- Color intensity (彩色亮度): 7.3
- Hue(色彩) : 0.98
- OD280/OD315 of diluted wines(稀释葡萄酒的OD280/OD315) : 2.96
- Proline(脯氨酸) : 990
我们通过下面的程序进行判断。
X_new = np.array([[25.5,3.14,3.22,18.5,95.8, 0.97, 2.52, 0.67, 1.52, 7.3, 0.98, 2.96, 990]]) prediction = knn.predict(X_new) print('预测的红酒为:{}:\n'.format(wine_dataset['target_names'][prediction]))
输出
预测的红酒为:['class_0']:
案例2:鸢尾花分类
由于代码与红酒相似,我们直接上代码。
def Sklean_iris(): # 加载数据其中的鸢尾花数据 iris_dataset = datasets.load_iris() print('鸢尾花数据集中的键:{}'.format(iris_dataset.keys())) print('鸢尾花数据概况:{}'.format(iris_dataset['data'].shape)) print('鸢尾花数据:{}:\n'.format(iris_dataset['data'])) print('鸢尾花数据描述:{}'.format(iris_dataset['DESCR'])) #将数据分为训练集和测试集 X = iris_dataset['data'] y = iris_dataset['target'] #测试集占30% X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=0,test_size=0.3) # 打印X_train,X_test,y_train,y_test的形态 print("X_train,的形态:{}".format(X_train.shape)) print("X_test的形态:{}".format(X_test.shape)) print("y_train的形态:{}".format(y_train.shape)) print("y_test的形态:{}".format(y_test.shape)) # 定义模型算法为K近邻分类器 knn = KNeighborsClassifier() # 用fit完成训练 knn.fit(X_train,y_train) print('测试数据的得分:{}:\n'.format(knn.score(X_test,y_test))) # 将测试数据集x_test运用到训练完成后的knn模型中去 print(knn.predict(X_test)) # 输出测试集中的真实结果 print(y_test)
输出:
鸢尾花数据集中的键:dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename']) 鸢尾花数据概况:(150, 4) 鸢尾花数据: [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] … 鸢尾花数据集中的键:dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename']) 鸢尾花数据概况:(150, 4) 鸢尾花数据: [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] … 鸢尾花数据描述:.. _iris_dataset: Iris plants dataset -------------------- **Data Set Characteristics:** :Number of Instances: 150 (50 in each of three classes) :Number of Attributes: 4 numeric, predictive attributes and the class :Attribute Information: - sepal length in cm - sepal width in cm - petal length in cm - petal width in cm - class: - Iris-Setosa - Iris-Versicolour - Iris-Virginica X_train,的形态:(105, 4) X_test的形态:(45, 4) y_train的形态:(105,) y_test的形态:(45,) 测试数据的得分:0.9777777777777777: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2 1 1 2 0 2 0 0] [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 1 1 1 2 0 2 0 0]
运用K邻近算法对鸢尾花分类的准确度为0.98,非常好。
同样我们假设现在有一颗鸢尾花,它的数据为:
- sepal length in cm:4.5
- sepal width in cm :3.6
- petal length in cm :1.3
- petal width in cm :0.3
通过代码
X_new = np.array([[4.5,3.6,1.3,0.3]]) prediction = knn.predict(X_new) print('预测的鸢尾花为:{}:\n'.format(iris_dataset['target_names'][prediction]))
输出
预测的鸢尾花为:['setosa']:
Sklean数据
上面介绍了Sklean的鸢尾花和红酒数据,Sklean.datasets还提供了其他静态数据和动态数据。
静态数据
数据集 |
函数 |
介绍 |
鸢尾花数据集 |
load_iris() |
用于分类任务的数据集 |
手写数字数据集 |
load_digits() |
用于分类任务或者降维任务的数据集 |
乳腺癌数据集 |
load_barest_cancer() |
简单经典的用于二分类任务的数据集 |
糖尿病数据集 |
load_diabetes() |
经典的用于回归认为的数据集 |
波士顿房价数据集 |
load_boston() |
经典的用于回归任务的数据集 |
体能训练数据集 |
load_linnerud() |
经典的用于多变量回归任务的数据集 |
红酒数据集 |
load_wine() |
经典的用于多变量回归任务的数据集 |
两个月亮集 |
make_moons() |
二分类数据集,像两个月亮一样(太极) |
动态数据
函数 |
介绍 |
fetch_olivetti_faces() |
脸部图片数据集 |
fetch_20newsgroups() |
用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。返回一个可以被文本特征提取器。向量化后的数据fetch_20newsgroups_vectorized(),返回一个已提取特征的文本序列,即不需要使用特征提取器 |
fetch_lfw_people() |
打好标签的人脸数据集 |
fetch_lfw_pairs() |
该任务称为人脸验证:给定一对两张图片,二分类器必须预测这两个图片是否来自同一个人 |
fetch_covtype() |
森林植被类型,总计581012个样本,每个样本由54个维度表示(12个属性,其中2个分别是onehot4维和onehot40维),以及target表示植被类型1-7,所有属性值均为number,详情可调用fetch_covtype()['DESCR']了解每个属性的具体含义 |
fetch_rcv1() |
路透社新闻语料数据集 |
fetch_kddcup99() |
KDD竞赛在1999年举行时采用的数据集,KDD99数据集仍然是网络入侵检测领域的事实Benckmark,为基于计算智能的网络入侵检测研究奠定基础,包含41项特征 |
fetch_california_housing() |
加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target,所有属性值均为number,详情可调用fetch_california_housing()['DESCR']了解每个属性的具体含义 |
fetch_species_distributions() |
物种分布数据集 |
Sklearn 交叉验证
人工智能分为训练集和测试集,训练集和测试集选择不当往往会造成过拟合或者欠拟合。我们可以通过交叉验证来解决这个问题。
我们把所有的样本数据分为n等份,第1次用第1个作为测试样本数据,第2…n个作为训练样本数据;第2次用第2个作为测试样本数据,第1、3…n个作为训练样本数据;….; 第n次用第n个作为测试样本数据,第1…n-1个作为训练样本数据。
#交叉验证法 from sklearn import svm from sklearn.model_selection import cross_val_score def Sklean_iris_cross_validation(): iris_dataset = datasets.load_iris() X,y = datasets.load_iris(return_X_y=True) print(X.shape,X.shape) X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.4, random_state=0) print("X_train,的形态:{}".format(X_train.shape)) print("X_test的形态:{}".format(X_test.shape)) print("y_train的形态:{}".format(y_train.shape)) print("y_test的形态:{}".format(y_test.shape)) clf = svm.SVC(kernel='linear',C=1).fit(X_train,y_train) print('交叉验证法前测试数据的得分:{}:\n'.format(clf.score(X_test,y_test))) clf = svm.SVC(kernel='linear',C=1) scores = cross_val_score(clf,X,y,cv=5)#实现交叉验证,cv=5:分5组 print('交叉验证法后测试数据的得分:{}:\n'.format(scores))
输出
(150, 4) (150, 4) X_train,的形态:(90, 4) X_test的形态:(60, 4) y_train的形态:(90,) y_test的形态:(60,) 交叉验证法前测试数据的得分:0.9666666666666667: 交叉验证法后测试数据的得分:[0.96666667 1. 0.96666667 0.96666667 1. ]:
- 可以看出使用交叉验证法后,有些情形下的得分竟然高达1.即100%正确,我们用交叉后的对上面鸢尾花的数据进行再次鉴别。特征数据为[4.5,3.6,1.3,0.3]
X_new = np.array([[4.5,3.6,1.3,0.3]])
clf.fit(X_train,y_train) prediction = clf.predict(X_new) print('预测的鸢尾花为:{}:\n'.format(iris_dataset['target_names'][prediction]))
输出
预测的鸢尾花为:['setosa']:
与上面一样,输出结果仍旧为setosa
过拟合和欠拟合
这里介绍一下过拟合和欠拟合。所谓欠拟合即不管在训练集还是在测试集上表现都不佳,欠拟合是由于训练不够造成的;所谓过拟合即不管在训练集还是在测试集上表现很高,但是在测试集上表现不佳,过拟合是由于训练过度造成的。
—————————————————————————————————
软件安全测试
https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486
接口自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486
DevOps 和Jenkins之DevOps
https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486
DevOps与Jenkins 2.0之Jenkins
https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486
Selenium自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486
性能测试第1季:性能测试基础知识
https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486
性能测试第2季:LoadRunner12使用
https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486
性能测试第3季:JMeter工具使用
https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486
性能测试第4季:监控与调优
https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486
Django入门
https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486
啄木鸟顾老师漫谈软件测试
https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486