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品种。
好了等学完神经网络再来用感知器模型预测一下,未完待续。。。