鸢尾花数据是一个简易有趣的数据集。这个数据集来源于科学家在一岛上找到一种花的三种不同亚类别,分别叫做setosa,versicolor,virginica。但是这三个种类并不是很好分辩,所以他们又从花萼长度,花萼宽度,花瓣长度,花瓣宽度这四个角度测量不同的种类用于定量分析。基于这四个特征,这些数据成了一个多重变量分析的数据集。下面,我们就利用sklearn试着从不同的角度去分析一下这个数据集。
第一种思路是这样:这三种不同的品种每一种想必都会有特点或者存在一定的相似性。我们不妨先把这些杂乱无章的数据分成三类,然后对应的标出他们每一类的类别。如果按照这样的想法,那么这一个问题就变成了一个聚类问题。
作为聚类问题,我们可以用k-means模型去解决。可以参考这一篇博文。网址如下:
http://blog.csdn.net/heavendai/article/details/7029465
首先大体了解一下k-means,这一种算法是非监督模型,也就是说一开始我可以不用告诉它类别,让他们自己去分类。那么怎么去分类呢?假设我们首先将它映射到欧式空间
可以直观的看出来,图中把点分成了三类。然后我们做出这样一种假设:每一类有一个中心点,这一类的绝大部分点到中心点的距离应该是小于到其他类中心点的距离的。之所以说绝大部分是因为考虑到点的特例,我们不能因为单独的几个点而否定之前的大部分。基于这一个思想我们可以确定所要优化的目标函数,我们假设分类N个数据到K个类别,则有:
其中的rnk意味着归类到k时为1,剩下为0.剩下的具体如何优化这里不在详细说了。
我们来看实现代码
<span style="font-family:Microsoft YaHei;">from sklearn.cluster import KMeans from sklearn import datasets iris = datasets.load_iris() X = iris.data y = iris.target clf=KMeans(n_clusters=3) model=clf.fit(X) predicted=model.predict(X)</span>
KMeans的参数除了聚类个数之外还有max_iter,n_init,init,precompute_distances等。具体的参数含义解释如下网址:
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans
如果想更加直观一点的话,官网有鸢尾花数据在k-means上的一个demo网址如下:
我们po出代码:
<span style="font-family:Microsoft YaHei;">print(__doc__) # Code source: Gaël Varoquaux # Modified for documentation by Jaques Grobler # License: BSD 3 clause import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn.cluster import KMeans from sklearn import datasets np.random.seed(5) centers = [[1, 1], [-1, -1], [1, -1]] iris = datasets.load_iris() X = iris.data y = iris.target estimators = {'k_means_iris_3': KMeans(n_clusters=3), 'k_means_iris_8': KMeans(n_clusters=8), 'k_means_iris_bad_init': KMeans(n_clusters=3, n_init=1, init='random')} fignum = 1 for name, est in estimators.items(): fig = plt.figure(fignum, figsize=(4, 3)) plt.clf() ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134) plt.cla() est.fit(X) labels = est.labels_ ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float)) ax.w_xaxis.set_ticklabels([]) ax.w_yaxis.set_ticklabels([]) ax.w_zaxis.set_ticklabels([]) ax.set_xlabel('Petal width') ax.set_ylabel('Sepal length') ax.set_zlabel('Petal length') fignum = fignum + 1 # Plot the ground truth fig = plt.figure(fignum, figsize=(4, 3)) plt.clf() ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134) plt.cla() for name, label in [('Setosa', 0), ('Versicolour', 1), ('Virginica', 2)]: ax.text3D(X[y == label, 3].mean(), X[y == label, 0].mean() + 1.5, X[y == label, 2].mean(), name, horizontalalignment='center', bbox=dict(alpha=.5, edgecolor='w', facecolor='w')) # Reorder the labels to have colors matching the cluster results y = np.choose(y, [1, 2, 0]).astype(np.float) ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y) ax.w_xaxis.set_ticklabels([]) ax.w_yaxis.set_ticklabels([]) ax.w_zaxis.set_ticklabels([]) ax.set_xlabel('Petal width') ax.set_ylabel('Sepal length') ax.set_zlabel('Petal length') plt.show()</span>这个代码用了很多matplotlib的函数,将不同品种花聚类之后又标定了出来,而且图是3D的可以用鼠标从不同角度观察,效果很炫酷。展示几个效果~
除了聚类的思想之外已知了它的类别和数据,我们也可以把它当做一个监督学习的模型来做。这样的话研究的问题就成了一个分类问题。分类问题的模型很多LR,SVM,DT都可以解决。这里用决策树做一个简单的样例。
实现之前简单的了解一下这个模型。可以参考以前的博客
http://blog.csdn.net/leo_is_ant/article/details/43565505
首先决策树是一种树形结构,其中每一个内部节点表示一个属性上的测试,每一个分支代表一个测试输出,每一个叶子节点代表一个类别。这种结构构建在已知各种情况发生概率的基础上,所以我们在构建决策树的时候先要选择能最大程度分离各个属性的特征(即信息增益最大的特征),然后根据分类的情况决定是否再用剩下的数据集和特征集构建子树。
我们再看一下实现的代码:
<span style="font-family:Microsoft YaHei;">from sklearn.datasets import load_iris from sklearn.cross_validation import cross_val_score from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(random_state=0) iris = load_iris() model=clf.fit(iris.data, iris.target) predicted=model.predict(iris.data) score=cross_val_score(clf, iris.data, iris.target, cv=10)</span>这里面,用了决策树的分类器,去做分类。这里注意,因为是监督问题,所以fit方法用时需要 iris.target 这一个变量哟~
最后注意一下cross_val_score这一个方法,是一个交叉验证的手段,原理是将数据分成了cv份,一份来训练剩下的来预测,最终得到的评分能够避免过拟合。
最后给出决策树分类器的参数网址:
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.tree
Python scikit-learn 学习笔记—鸢尾花模型
原文:http://blog.csdn.net/leo_is_ant/article/details/45397363