Python scikit-learn 學習筆記—鳶尾花模型
鳶尾花資料是一個簡易有趣的資料集。這個資料集來源於科學家在一島上找到一種花的三種不同亞類別,分別叫做setosa,versicolor,virginica。但是這三個種類並不是很好分辯,所以他們又從花萼長度,花萼寬度,花瓣長度,花瓣寬度這四個角度測量不同的種類用於定量分析。基於這四個特徵,這些資料成了一個多重變數分析的資料集。下面,我們就利用sklearn試著從不同的角度去分析一下這個資料集。
第一種思路是這樣:這三種不同的品種每一種想必都會有特點或者存在一定的相似性。我們不妨先把這些雜亂無章的資料分成三類,然後對應的標出他們每一類的類別。如果按照這樣的想法,那麼這一個問題就變成了一個聚類問題。
作為聚類問題,我們可以用k-means模型去解決。可以參考這一篇博文。網址如下:
首先大體瞭解一下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,因為已知三類我們讓其中的clusters中心點為3就可以了。
KMeans的引數除了聚類個數之外還有max_iter,n_init,init,precompute_distances等。具體的引數含義解釋如下網址:
如果想更加直觀一點的話,官網有鳶尾花資料在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都可以解決。這裡用決策樹做一個簡單的樣例。
實現之前簡單的瞭解一下這個模型。可以參考以前的部落格
首先決策樹是一種樹形結構,其中每一個內部節點表示一個屬性上的測試,每一個分支代表一個測試輸出,每一個葉子節點代表一個類別。這種結構構建在已知各種情況發生概率的基礎上,所以我們在構建決策樹的時候先要選擇能最大程度分離各個屬性的特徵(即資訊增益最大的特徵),然後根據分類的情況決定是否再用剩下的資料集和特徵集構建子樹。
我們再看一下實現的程式碼:
<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份,一份來訓練剩下的來預測,最終得到的評分能夠避免過擬合。
最後給出決策樹分類器的引數網址: