KNN 算法实现 Iris 数据集分类
文章目錄
- 1 scikit-learn介紹
- 2 scikit-learn常用模塊
- 2.1 數據集模塊
- 2.2 數據預處理模塊
- 2.3 特征提取與選擇模塊
- 3 K鄰近算法(K-Nearest Neighbor, KNN)介紹
- 4 KNN算法實現Iris數據集的分類
1 scikit-learn介紹
scikit-learn與機器學習的關系:
- Scikit-learn是基于Python語言的第三方機器學習庫。它包含了幾乎所有主流機器學習算法的實現,并提供一致的調用接口。
- Scikit-learn基于 NumPy 和 SciPy 等科學計算庫,支持支持向量機、隨機森林、梯度提升樹、K 均值、聚類等機器學習算法。
scikit-learn功能:
- Scikit-learn (簡記sklearn)是當今非常流行的機器學習工具,也是最有名的Python機器學習庫。
- Scikit-learn主要功能包括分類、回歸、聚類、數據降維、模型選擇和數據預處理六大部分。
2 scikit-learn常用模塊
2.1 數據集模塊
如果要使用Scikit-learn庫中提供的數據集,要通過from sklearn import dataset導入數據集模塊。
- loaders 可用來加載小的標準數據集,如dataset.load_iris
- fetchers 可用來下載并加載大的真實數據集,如dataset.fetch_olivetti_faces
loaders和fetchers的所有函數都返回一個字典一樣的對象,里面至少包含兩項:shape為n_samples*n_features的數組,對應的字典key是data以及長度為n_samples的numpy數組,包含了目標值,對應的字典key是target。通過將return_X_y參數設置為True,幾乎所有這些函數都可以將輸出約束為只包含特征和標簽的元組。
- generation functions 可以用來生成受控的合成數據集(synthetic datasets),這些函數返回一個元組(X,y),該元組由shape為n_samples*n_features的numpy數組X和長度為n_samples的包含目標y的數組組成。
2.2 數據預處理模塊
Scikit-learn的sklearn.preprocessing模塊中提供了數據標準化、規范化、二值化、分類特征編碼、推斷缺失數據等數據預處理方法,通過from sklearn import preprocessing導入。
2.3 特征提取與選擇模塊
特征提取是數據預處理任務中重要的一個環節。特征提取對最終結果的影響要高過數據處理算法本身,通過from sklearn import feature_extraction (特征提取)和from sklearn import feature_selection (特征選擇)導入。
3 K鄰近算法(K-Nearest Neighbor, KNN)介紹
基本思想:給定一個訓練數據集,對新輸入的樣本,在訓練數據集中找到與該樣本最鄰近的k個實例(也就是所謂的k個鄰居),這k個實例中的多數屬于某個類別,就把輸入樣本劃分到該類別中。k近鄰算法通常又可以分為分類算法和回歸算法。
- 分類算法中采用多數表決法,就是選擇k個樣本中出現最多的類別標記作為預測結果。
- 回歸算法中采用平均法,將k個樣本實際輸出標記的平均值或加權平均值作為預測結果。
優點:準確性高,對異常值和噪聲有較高的容忍度。同時應用廣泛,不論是分類還是回歸都可以使用。
缺點:KNN是一種懶惰學習方法,在訓練得是很好不是真正在學些什么,只是一字不差地存儲訓練數據。計算量較大,對內存要求也比較大。因為,每次對一個未標記樣本進行分類時,都需要全部計算一遍距離。當數據樣本分布不平衡時,對稀有類別的預測準確率較低。
4 KNN算法實現Iris數據集的分類
import matplotlib.pyplot as plt import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split#return_X_y = True為了返回的數據是元組而不是字典 X, y = load_iris(return_X_y = True) #將數據集進行劃分,訓練集占7份,測試集占3份 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.3, train_size = 0.7, stratify = y, random_state = 42) scores = [] #使用不同的鄰居數進行訓練測試 for n in range(1, 6) :knn = KNeighborsClassifier(n_neighbors = n)#訓練knn.fit(train_X, train_y)#預測pred = knn.predict(test_X)#準確率并保留3位小數score = round(knn.score(test_X, test_y), 3)scores.append(score)print(scores) plt.figure() plt.plot(range(1, 6), scores, 'o--', color = 'blue') plt.xlabel('$n\_neighbors$', fontsize = 14) plt.ylabel('$precision$', fontsize = 14) for x, y in zip(range(1, 6), scores) :plt.text(x - 0.18, y - 0.1, f'${y}$', fontsize = 14) plt.title(f'$precision\ of\ different\ neighors$', fontsize = 14) plt.xticks(np.arange(1, 6)) plt.yticks(np.linspace(0, 1, 5)) plt.show() plt.savefig('figure.png')從結果上我們能看出,n_neighbors 也就鄰居的數量的選取的不同會影響最終的正確率,但他們之間不是簡單的線性關系,n_neighbors 過大或過小都會增大噪聲對模型的影響,可能會出現過度擬合的情況。常見做法是,n_neighbors 一般取奇數,盡量避免可能投票表決相等的情況。如上面的簡單例子,模型在 n_neighbors 為1、3、51、3、51、3、5條件下表現得相對好一些。
總結
以上是生活随笔為你收集整理的KNN 算法实现 Iris 数据集分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D 渲染管线全流程解析
- 下一篇: 年终奖