標籤:machine learning sklearn python 機器學習
鳶尾花資料是一個簡易有趣的資料集。這個資料集來源於科學家在一島上找到一種花的三種不同亞類別,分別叫做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 KMeansfrom sklearn import datasetsiris = datasets.load_iris()X = iris.datay = iris.targetclf=KMeans(n_clusters=3)model=clf.fit(X)predicted=model.predict(X)</span>
這裡調用了聚類器KMeans,因為已知三類我們讓其中的clusters中心點為3就可以了。
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 clauseimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom sklearn.cluster import KMeansfrom sklearn import datasetsnp.random.seed(5)centers = [[1, 1], [-1, -1], [1, -1]]iris = datasets.load_iris()X = iris.datay = iris.targetestimators = {'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 = 1for 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 truthfig = 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 resultsy = 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_irisfrom sklearn.cross_validation import cross_val_scorefrom sklearn.tree import DecisionTreeClassifierclf = 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 學習筆記—鳶尾花模型