耿宇

导航

scikit-learn库学习以及鸢尾花案例实现机器学习

首先简单介绍鸢尾花问题

鸢尾花有三个品种分别是setosa,versicolor和virginica;我们通过向计算机输入大量的鸢尾花的data数据以及相应的标签(种类),通过算法让机器学会识别鸢尾花的种类,最后输入一个新的数据,让计算机去预测该数据对应的标签。

该问题解决方法有很多,如神经网络中的感知器方法,以及最为简单的k临接算法等等,通过这个例子可以学习一下python中的scikit-learn库,我用最为简单的k临接算法解决了问题,以后有时间补充一下感知器方法。

 

配置问题:

需要安装numpy,scikit-learn库。(建议使用anaconda)

 

模块导入:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

其中scikit-learn导入时对应sklearn;

而datasets是scikilt-learn库中的一个大的样本库,提供很多样本,包含本次鸢尾花样本;

train_test_split用于将数据划分为训练数据和测试数据,为什么要划分可以参考我的机器学习概论

kNeighborsclassifier是k临接算法,k临接算法没有显示的训练过程,在测试时,计算测试样本和所有训练样本的距离,根据最近的K个训练样本的类别,通过多数投票的方式进行预测。

 

建立样本数据:

iris=datasets.load_iris() #鸢尾花的样本数据
print(iris.keys())
iris_X=iris.data
iris_y=iris.target

打印结果:

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

其中样本数据中列名很多,主要介绍下以下三个:

data:指的是样本数据,数据的属性叫特征,本案例中有4个特征分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度。

target:指的是样本标签(种类),本案例共有3种标签,即花有3个品种。

targetname:指的是花的标签名。

 

数据预处理:

X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.33,random_state=0)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

 

其中数据要划分为训练数据和测试数据,我使用sklearn库中的train_test_split类将样本中的数据和标签划分为百分之66的训练数据和百分之33的测试数据,random_state=0表示随机选取。

X_train表示训练数据,

X_test表示测试数据,

y_train表示训练数据对应的标签(种类)

y_test表示测试数据对应的标签(种类)

打印结果如下

(100, 4)
(100,)
(50, 4)
(50,)

训练数据有100个,每个数据都有4个特征;

而训练数据的标签页对应100个,即100*1,在numpy中(100,)即表示(100,1);不写成后者原因是后者表示是二维的含义,而其实就是行向量即一维的概念。

测试打印结果类似不再赘述。

 

机器学习:

knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)

使用knn算法(k临近)让计算机自学习训练数据以及对应的标签。

n_neighbors是邻居的数量,可以用交叉验证法找到最佳k值,默认为5,等下面测试完成后再进行修改。

 

回归测试:

print(knn.predict(X_test))#机器预测测试数据标签结果
print(y_test)#实际测试数据标签结果
print(knn.score(X_test,y_test))#正确率

直接给出结果:

[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 1 2 2 2 2]
[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 1 2 2 2 2]
0.98

仔细比较一下发现有一个预测结果和实际结果不同,正确率为百分之98。表示模型可信度高可用使用。

反回机器学习部分,我将n_neighbor数量变化后,正确率发生了变化,可根据实际模型,不断测试n_neighbor值,当正确率最大时选用该n_neighbor值。

 

新数据输入,预测标签:

X_new=np.array([[5,2.9,1,0.2]])#shape必须是x*4
print(knn.predict(X_new))
print(iris['target_names'][knn.predict(X_new)])

其中该新数据必须是x*4的,即新数据的个数可以任意,但每个数据都要有4个特指值。

最后打印新数据的标签如下:

[0]
['setosa']

0表示第1个标签对应setosa品种。

 

好了等学完神经网络再来用感知器模型预测一下,未完待续。。。

 

posted on 2020-10-13 21:21  耿宇  阅读(532)  评论(0编辑  收藏  举报