Scikit-Learn實戰KNN

Scikit-Learn總結

Scikit-Learn(基於Python的工具包)javascript

1.是一個基於Numpy,Scipy,Matplotlib的開源機器學習工具包。css

2.該包於2007年發起,基本功能包涵了6個方面:分類、迴歸、聚類、數據降維、模型選擇、預處理html

包括了大量經常使用的算法::SVM,邏輯迴歸,樸素貝葉斯,k-meanshtml5

3.網站爲:http://scikit-learn.org鳶尾花數據集是由傑出的統計學家java

R.A.Fisher在20世紀30年代中期創建的,它被公認爲用於數據挖掘的最著名的數據集。它包含3種植物種python

類(Iris setosa、Iris versicolor和Iris virginica),每種各有50個樣本。jquery

表1-4摘錄了這個數據集。linux

它由4個屬性組成:sepal length(花萼長度)、sepal width(花萼寬度)、petal length(花瓣長度)和petal width(花瓣寬度)(單位是cm)。android

與前面數據集不一樣的是,鳶尾花的全部屬性都是數值屬性。css3

scikit-learn數據集:

[n_sample,n_feature]二維數據
分別表示樣本數量和樣本的特徵數量
1.讀取數據使用datasets.load_+tab鍵可查看

2.數據被存儲在.data成員內是一個n_sample*n_feature的數組

3.在監督問題下一個或多個因變量被存儲在.target中。

 

0.安裝好Anaconda

1)Anaconda

       這是一個很是齊全的python發行版本,最新的版本提供了多達195個流行的python包,包含了咱們經常使用的numpy、scipy等等科學計算的包。有了它,媽媽不再用擔憂我焦頭爛額地安裝一個又一個依賴包了。Anaconda在手,輕鬆我有!下載地址以下:http://www.continuum.io/downloads

2)Anaconda快捷鍵

Alt+Enter 運行當前行並插入新行
Shift+Enter 運行當前行並選擇下一行
Ctrl+Enter 只運行當前行

1.Scikit-Learn基本知識的瞭解

官方網站:http://scikit-learn.org/stable/

    對Python語言有所瞭解的科研人員可能都知道SciPy——一個開源的基於Python的科學計算工具包。基於SciPy,目前開發者們針對不一樣的應用領域已經發展出了爲數衆多的分支版本,它們被統一稱爲Scikits,即SciPy工具包的意思。而在這些分支版本中,最有名,也是專門面向機器學習的一個就是Scikit-learn。

    Scikit-learn項目最先由數據科學家 David Cournapeau 在 2007 年發起,須要NumPy和SciPy等其餘包的支持,是Python語言中專門針對機器學習應用而發展起來的一款開源框架。

2.Scikit-learn的六大功能

Scikit-learn的基本功能主要被分爲六大部分:分類,迴歸,聚類,數據降維,模型選擇和數據預處理。

分類是指識別給定對象的所屬類別,屬於監督學習的範疇,最多見的應用場景包括垃圾郵件檢測和圖像識別等。目前Scikit-learn已經實現的算法包括:支持向量機(SVM),最近鄰,邏輯迴歸,隨機森林,決策樹以及多層感知器(MLP)神經網絡等等。

須要指出的是,因爲Scikit-learn自己不支持深度學習,也不支持GPU加速,所以這裏對於MLP的實現並不適合於處理大規模問題。有相關需求的讀者能夠查看一樣對Python有良好支持的Keras和Theano等框架。

迴歸是指預測與給定對象相關聯的連續值屬性,最多見的應用場景包括預測藥物反應和預測股票價格等。目前Scikit-learn已經實現的算法包括:支持向量迴歸(SVR),脊迴歸,Lasso迴歸,彈性網絡(Elastic Net),最小角迴歸(LARS ),貝葉斯迴歸,以及各類不一樣的魯棒迴歸算法等。能夠看到,這裏實現的迴歸算法幾乎涵蓋了全部開發者的需求範圍,並且更重要的是,Scikit-learn還針對每種算法都提供了簡單明瞭的用例參考。

聚類是指自動識別具備類似屬性的給定對象,並將其分組爲集合,屬於無監督學習的範疇,最多見的應用場景包括顧客細分和試驗結果分組。目前Scikit-learn已經實現的算法包括:K-均值聚類,譜聚類,均值偏移,分層聚類,DBSCAN聚類等。

數據降維是指使用主成分分析(PCA)、非負矩陣分解(NMF)或特徵選擇等降維技術來減小要考慮的隨機變量的個數,其主要應用場景包括可視化處理和效率提高。

模型選擇是指對於給定參數和模型的比較、驗證和選擇,其主要目的是經過參數調整來提高精度。目前Scikit-learn實現的模塊包括:格點搜索,交叉驗證和各類針對預測偏差評估的度量函數。

數據預處理是指數據的特徵提取和歸一化,是機器學習過程當中的第一個也是最重要的一個環節。這裏歸一化是指將輸入數據轉換爲具備零均值和單位權方差的新變量,但由於大多數時候都作不到精確等於零,所以會設置一個可接受的範圍,通常都要求落在0-1之間。而特徵提取是指將文本或圖像數據轉換爲可用於機器學習的數字變量。

須要特別注意的是,這裏的特徵提取與上文在數據降維中提到的特徵選擇很是不一樣。特徵選擇是指經過去除不變、協變或其餘統計上不重要的特徵量來改進機器學習的一種方法。

    總結來講,Scikit-learn實現了一整套用於數據降維,模型選擇,特徵提取和歸一化的完整算法/模塊,雖然缺乏按步驟操做的參考教程,但Scikit-learn針對每一個算法和模塊都提供了豐富的參考樣例和詳細的說明文檔。

    整體上來講,做爲專門面向機器學習的Python開源框架,Scikit-learn能夠在必定範圍內爲開發者提供很是好的幫助。它內部實現了各類各樣成熟的算法,容易安裝和使用,樣例豐富,並且教程和文檔也很是詳細。

    另外一方面,Scikit-learn也有缺點。例如它不支持深度學習和強化學習,這在今天已是應用很是普遍的技術,例如準確的圖像分類和可靠的實時語音識別和語義理解等。此外,它也不支持圖模型和序列預測,不支持Python以外的語言,不支持PyPy,也不支持GPU加速。

3.Scikit-Learn實戰KNNDemo

In [1]:
import numpy as np
In [61]:
import matplotlib.pyplot as plt
In [3]:
from matplotlib.colors import ListedColormap
In [6]:
from sklearn import neighbors,datasets
In [7]:
iris=datasets.load_iris()
In [10]:
print(iris.data[0:5])#打印數據的前五行
 
[[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
In [12]:
print(iris.target)
 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
In [16]:
#設置iris數據集的前兩個屬性做爲一個變量x
In [18]:
X=iris.data[:,:2]
In [21]:
print(X[0:5])
 
[[ 5.1  3.5]
 [ 4.9  3. ]
 [ 4.7  3.2]
 [ 4.6  3.1]
 [ 5.   3.6]]
In [23]:
#取出類別標籤所在的列存儲在變量y中
In [24]:
Y=iris.target
In [ ]:
#訓練knn分類器,設置最近鄰的個數爲15,權重參數爲uniform(最近鄰的全部點都具有相同的權重)
In [26]:
clf=neighbors.KNeighborsClassifier(n_neighbors=15,weights='uniform').fit(X,Y)
In [27]:
print(clf)
 
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=15, p=2,
           weights='uniform')
In [28]:
#繪圖
In [29]:
h=0.02
In [30]:
#設置網格縱橫座標的最小值和最大值,限定範圍
In [39]:
x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
In [32]:
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
In [33]:
#使用np.arrange(x_min,x_max,h)生成起始值爲x_min,終止值爲x_max,步長爲0.02的等差數列。
In [34]:
#使用meshgrid(np.arrange(x_min,x_max,h),np.arrange(y_min,y_max,h))生成兩個矩陣分別進行行填充和列填充
In [40]:
xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))
In [41]:
#使用ravel()將這兩個矩陣變爲按順序輸出的一維數組,np.c_()將兩組的一維數組,兩兩組隊,造成網格中的點#
In [42]:
#使用clf.predict()預測這些點的所屬類別
In [43]:
Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
In [44]:
xx
Out[44]:
array([[ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88],
       [ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88],
       [ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88],
       ..., 
       [ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88],
       [ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88],
       [ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88]])
In [45]:
yy
Out[45]:
array([[ 1.  ,  1.  ,  1.  , ...,  1.  ,  1.  ,  1.  ],
       [ 1.02,  1.02,  1.02, ...,  1.02,  1.02,  1.02],
       [ 1.04,  1.04,  1.04, ...,  1.04,  1.04,  1.04],
       ..., 
       [ 5.34,  5.34,  5.34, ...,  5.34,  5.34,  5.34],
       [ 5.36,  5.36,  5.36, ...,  5.36,  5.36,  5.36],
       [ 5.38,  5.38,  5.38, ...,  5.38,  5.38,  5.38]])
In [47]:
xx.ravel()
Out[47]:
array([ 3.3 ,  3.32,  3.34, ...,  8.84,  8.86,  8.88])
In [48]:
yy.ravel()
Out[48]:
array([ 1.  ,  1.  ,  1.  , ...,  5.38,  5.38,  5.38])
In [49]:
np.c_[xx.ravel(),yy.ravel()]
Out[49]:
array([[ 3.3 ,  1.  ],
       [ 3.32,  1.  ],
       [ 3.34,  1.  ],
       ..., 
       [ 8.84,  5.38],
       [ 8.86,  5.38],
       [ 8.88,  5.38]])
In [50]:
Z
Out[50]:
array([0, 0, 0, ..., 2, 2, 2])
In [51]:
#填充顏色繪圖
In [122]:
camp_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
In [68]:
camp_bold=ListedColormap(['#FF0000','#00FF00','#0000FF'])
In [129]:
Z=Z.reshape(xx.shape)
In [130]:
plt.pcolormesh(xx,yy,Z,cmap=camp_light)#根據預測結果爲網格填充
Out[130]:
<matplotlib.collections.QuadMesh at 0xa1846d8>
In [131]:
plt.scatter(X[:,0],X[:,1],c=Y,cmap=camp_bold,marker='o')#根據原始類別爲全部的點填充顏色
Out[131]:
<matplotlib.collections.PathCollection at 0xa184f60>
In [70]:
plt.xlim(xx.min(),xx.max())
Out[70]:
(3.2999999999999998, 8.8800000000000061)
In [78]:
plt.ylim(yy.min(),yy.max())
Out[78]:
(1.0, 5.3800000000000043)
In [82]:
#plt.title("3-Class classfication(k= % i,weights='distance')" % k_neighbors)
In [132]:
plt.show()
 
In [135]:
correct=0.0
In [136]:
Z1=clf.predict(np.c_[xx.ravel(),yy.ravel()])
In [137]:
for i in range(len(iris.data)):
    if Z1[i]== iris.target[i]: 
        correct+=1
In [138]:
correct/len(iris.data)  #正確率
Out[138]:
0.4666666666666667
相關文章
相關標籤/搜索