iris数据_机器学习之数据的可视化

72894c8e71f7e3ae1d6595eec211f2c1.png

本文是机器学习第二节:机器学习之机器学习的可视化,第一节是飘哥:机器学习的hello world

在前文中我们学习使用了决策树,作为我们的分类器,本次我们将学习如何在代码中将它可视化,从而看到他是如何在幕后工作的。分类器有很多种,你可能听到过一些比如神经网络,或是支持向量机,我们为什么首先使用决策树呢?那是因为决策树有一大特点,他们简单易读,便于理解。实际上决策树是为数不多的可解释分类器,你可以彻底理解为什么这个分类器做了这个决定,这在实战中非常有用。

我来介绍一下今天我们要用到的(https://en.wikipedia.org/wiki/Iris_flower_data_set)一个这真实的数据集,这个数据集叫做“莺尾花”:

cae4625c441ce69934a2d52c9703320c.png

“莺尾花”是一个典型的机器学习问题,在这个问题中,我们想要用不同的测量标准,例如花瓣的长度和宽度,来辨别我们有那种莺尾花,在这个数据集里,有三种不同的莺尾花:山莺尾,变色莺尾,青龙莺尾。下拉页面你会看到每种花有50个样本,一共有150个样本,注意每个样本由4个特征来描述,分别是萼片,花瓣的长和宽,就像苹果和橘子的问题一样表格的前四列是这4个特征,而表格最后一列显示标签,就是莺尾花样本的种类,我们的目标是用这个数据集来训练我们的分类器,然后我们就可以用分类器来判断任意一个新样本是什么种类的莺尾花了。

1) import dataset

2) train a classifier

3) prdict label for new flower

4) visualize the tree

学习如何使用已有的数据集是有用的,所以让我们来练习把莺尾花导入到scikit-learn中,来看看它的代码什么样,scikit为我们提供了一系列的样本数据集(https://scikit-learn.org/stable/datasets/),包括莺尾花,还有一些导入用的工具,

我们可以用以下代码来导入莺尾花数据集

from sklearn.datasets import load_iris

iris=load_iris()

print(iris.feature_names)

print(iris.target_names)

数据集包括维基百科的两张表格,还有一些元数据,元数据包括特征的名字,还有不同种类的花的名字,而上述的种类和特征存放在数据变量中。

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

['setosa' 'versicolor' 'virginica']

举个例子如果我输出第一个条目,你会看到这朵花的尺寸,

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

['setosa' 'versicolor' 'virginica']

[5.1 3.5 1.4 0.2]

上面的数字索引到特征名,所以第一个值指花萼长度,第二个是花萼的宽度,以此类推。目标变量中包括标签,类似这些数字索引到目标名

from sklearn.datasets import load_iris
iris=load_iris()
print(iris.feature_names)
print(iris.target_names)
print(iris.data[0])
print(iris.target[0])

现在输出第一个样本,标签0代表莺尾,

['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

['setosa' 'versicolor' 'virginica']

[5.1 3.5 1.4 0.2]

0

如果你看一下维基百科的表格,你会发现我们刚刚输出了第一行,

304d52f0128ea2f2732905568d4caf4c.png

现在数据和目标变量有150个条目,你可以选择进行迭代,来输出整个数据集,代码如下:

from sklearn.datasets import load_iris
iris=load_iris()
print(iris.feature_names)
print(iris.target_names)
print(iris.data[0])
print(iris.target[0])
for i in range(len(iris.target)):
    print("example %d: label %s, feature %s" % (i,iris.target[i],iris.data[i]))

现在我们学习了如何使用数据集,现在就可以开始训练分类器了,在这之前,我们先要把数据分组,我将把一些样本拿出来作为备用,我把这些样本称之为测试数据,其余的数据成为训练数据,稍后我们会用这些机器从未见过的测试数据,来测试完成训练的分类起有多准确,测试是机器学习实战当中,一个非常重要的部分。

现在我将从每一种花中拿掉一个样本,正好数据集的编号方式是第一朵山莺尾样本的索引是0,第一朵变色莺尾样本的索引是50,第一朵青龙莺尾的样本索引是100。

然后我将创造两个新的变量集,一个做训练用,另外一个测试用。训练集中有大部分数据,测试集中只有我们刚才移除的是三个不同莺尾花的首项

import  numpy as np
from sklearn.datasets import load_iris
iris=load_iris()
test_idx=[0,50,100]
 
#训练数据
train_target = np.delete(iris.target,test_idx)
train_data=np.delete(iris.data,test_idx,axis=0)
 
#测试数据
test_target=iris.target[test_idx]
test_data=iris.data[test_idx]

就像之前一样,我们可以创建一个决策树分类器,然后用训练集中的数据训练它

import  numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
 
iris=load_iris()
test_idx=[0,50,100]
 
#训练数据
train_target = np.delete(iris.target,test_idx)
train_data=np.delete(iris.data,test_idx,axis=0)
 
#测试数据
test_target=iris.target[test_idx]
test_data=iris.data[test_idx]
 
clf=tree.DecisionTreeClassifier()
clf.fit(train_data,train_target)

在我们将它可视化之前,可以先用决策树来将测试数据做一个分类,已知每一种花有一个样本,那么我们可以输出所有可能的标签。

import  numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
 
iris=load_iris()
test_idx=[0,50,100]
 
#训练数据
train_target = np.delete(iris.target,test_idx)
train_data=np.delete(iris.data,test_idx,axis=0)
 
#测试数据
test_target=iris.target[test_idx]
test_data=iris.data[test_idx]
 
clf=tree.DecisionTreeClassifier()
clf.fit(train_data,train_target)
 
print(test_target)

现在来看看决策树是如何判断的,我们想他听过测试样本的特征,就能得到标签

import  numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
 
iris=load_iris()
test_idx=[0,50,100]
 
#训练数据
train_target = np.delete(iris.target,test_idx)
train_data=np.delete(iris.data,test_idx,axis=0)
 
#测试数据
test_target=iris.target[test_idx]
test_data=iris.data[test_idx]
 
clf=tree.DecisionTreeClassifier()
clf.fit(train_data,train_target)
 
print(test_target)
 
print(clf.predict(test_data))

你看到运行结果中决策树的判断标签与测试数据相符,这代表决策树做出了正确的判断,这是一个非常简单的测试,之后我们会详细解析其中的步骤。

现在我们将这颗决策树可视化,来看看分类器是如何工作的,添加如下代码:

import  numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
 
iris=load_iris()
test_idx=[0,50,100]
 
#训练数据
train_target = np.delete(iris.target,test_idx)
train_data=np.delete(iris.data,test_idx,axis=0)
 
#测试数据
test_target=iris.target[test_idx]
test_data=iris.data[test_idx]
 
clf=tree.DecisionTreeClassifier()
clf.fit(train_data,train_target)
 
print(test_target)
 
print(clf.predict(test_data))
 
 
from sklearn.externals.six import StringIO
import pydotplus
dot_data = StringIO()
tree.export_graphviz(clf,
        out_file=dot_data,
        feature_names=iris.feature_names,
        class_names=iris.target_names,
        filled=True, rounded=True,
        impurity=False)
 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("/Users/poptest/iris.pdf")

(说明:由于python是高版本,所以这里需要用pydotplus,我所用的环境是mac 10.14.3 ,所以要安装graphviz库,用brew命令安装,执行该命令前需要先要安装Homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于linux下的apt-get、yum神器;Homebre可以在Mac上安装一些OS X没有的UNIX工具,Homebrew将这些工具统统安装到了 /usr/local/Cellar 目录中,并在 /usr/local/bin 中创建符号链接。打开终端输入:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装homebrew工具,安装成功后,执行命令:brew install graphviz )

以上代码是用于可视化,它不是机器学习中的概念,上面代码生成了一个简单易读的pdf,打开pdf,我们就可以看到这棵决策树了。

65b7a054e2c00bd1d04fe3264fafe1b9.png

用它来分类数据的话,你需要从上往下看,每个节点代表一个特征,并向其提出一个是或者不是的问题,比如第一个节点提问花朵宽度是否小于2.45厘米,如果答案是就向左走,不是向右走。

我们总结一下,决策树提出的每一个问题,必须针对某一个特征,那就意味着你选的特征越可靠,决策树的准确性越高。

第一节文章请看:飘哥:机器学习的hello world

˙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值