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