機器學習與python實踐(一)k臨近(knn)

2021-07-31 20:49:26 字數 3482 閱讀 3922

機器學習與python實踐(一)k臨近(knn)

knn演算法分析

k最鄰近分類演算法是最簡單的機器學習演算法,它採用測量不同特徵值之間的距離進行分類,想法很簡單:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本的大多數屬於某個類,則這個樣本也屬於這個類。

knn演算法中所選擇的鄰近都是已經分好類的物件,該方法在定類決策上只依賴最鄰近的乙個或幾個樣本的類別來決定待分類樣本的類別,不是靠判別類域的方法來確定,對於類域交叉重合較多的分類樣本集這個方法更為合適。

不足之處:樣本不平衡時,乙個類樣本容量很大,其他樣本容量很小,導致輸入新樣本時,該樣本鄰近中大樣本占多數,因此可以採取權值的方法(和樣本距離小的鄰近權值大)來改進。計算量大時另乙個問題,對每個待分類的文字都要計算他到全體樣本的距離,才能得出k個最鄰近點。解決方法是事先對以知樣本剪輯,去掉對分類作用不大的樣本,適用於容量大的樣本。

總的來說,我們已經存在乙個帶有標籤的資料庫,然後輸入沒有標籤的新資料,將新資料每個特徵與樣本集中資料對應的特徵比較,提取樣本集中特徵最相似的分類標籤,一般只選擇樣本資料庫中前k個最相似的資料,最後選擇k個最相似資料中出現次數最多的分類。描述如下:

1)計算已知類別資料集中的點與當前點之間的距離;

2)按照距離遞增次序排序;

3)選取與當前距離最小的k個點;

4)確定k個點所在類別的出現概率;

5)返回前k個點出現頻率最高的類別最為當前點的**分類。

如何選擇合適的演算法

考慮兩個問題:一目的是什麼,需要完成何種任務,是**概率還是對物件分組;二需要分析或蒐集的資料是什麼。

目的:如果是**目標變數的值,選擇監督學習演算法,否則選擇非監督。確定選擇監督演算法後,如果是離散目標變數,選擇分類器演算法;如果是連續型數值,選擇回歸演算法。

如果不是**值。選擇無監督。進一步分析是否需要將資料劃分為離散的組,是則使用聚類演算法;如還需要估計資料與每個分組的相似度,則需要使用密度估計演算法。

我們需要充分了解資料,對實際資料了解的越充分,越容易建立符合實際需求的程式。主要了解資料:離散還是連續,特徵值是否存在缺失,是什麼原因造成缺失,是否存在異常值,某個特徵發生的頻率如何等等。

在選擇演算法需要嘗試不同演算法的執行結果,反覆試錯迭代。機器學習開發過程:

1、蒐集資料2、準備輸入資料3、分析輸入資料4、訓練演算法5、測試演算法6、使用演算法。

k-近 鄰 算 法 (knn)

它的工作原理是:存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料 與所屬分類的對應關係。輸人沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的 特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們 只選擇樣本資料集中前k個最相似的資料,這就是&-近鄰演算法中&的出處,通常k是不大於20的整數。 最後,選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。

python實現

import pandas as pd

df = pd.read_csv('.csv')#讀取資料

df.head()#顯示前五列資料

df.info()#顯示資料相關變數資訊

df.describe()#顯示各種統計資料

#資料視覺化

import matplotlib.pyplot as plt

import seaborn as sns

plt.figure()#新建視窗

sns.countplot(x='variable', hue='target',data=df,palette='rdbu')#計量圖

plt.xticks([0,1],['no','yes'])#x 軸刻度

plt.show()#顯示

#訓練演算法

from sklearn.neighbors import kneighborsclassifier

#選擇特徵和目標變數

y = df['target'].values

x = df.drop('target',axis=1).values#刪除目標變數列

#建乙個knn分類器 k=6

knn = kneighborsclassifier(n_neighbors=6)

#fit

knn.fit(x,y)

#predict

y_pred = knn.predict(x)

new_prediction = knn.predict(x_nem)

print('prediction:{}'.format(new_prediction))

#測量訓練效率

#選取訓練集和測試集

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=42,stratify=y)#from sklearn.model_selection import train_test_split

knn.score(x_test,y_test)

#取不同k值的效率圖:

# setup arrays to store train and test accuracies

neighbors = np.arange(1, 9)

train_accuracy = np.empty(len(neighbors))

test_accuracy = np.empty(len(neighbors))

# loop over different values of k

for i, k in enumerate(neighbors):

# setup a k-nn classifier with k neighbors: knn

knn = kneighborsclassifier(n_neighbors=k)

# fit the classifier to the training data

knn.fit(x_train,y_train)

#compute accuracy on the training set

train_accuracy[i] = knn.score(x_train, y_train)

#compute accuracy on the testing set

test_accuracy[i] = knn.score(x_test, y_test)

# generate plot

plt.title('k-nn: varying number of neighbors')

plt.plot(neighbors, test_accuracy, label = 'testing accuracy')

plt.plot(neighbors, train_accuracy, label = 'training accuracy')

plt.legend()

plt.xlabel('number of neighbors')

plt.ylabel('accuracy')

plt.show()

機器學習與python實戰(一) k近鄰

knn k nearest neighbor 演算法是乙個簡單而經典的機器學習分類演算法,通過度量 待分類資料 和 類別已知的樣本 的距離對樣本進行分類。from numpy import import operator 產生資料集 defcreatedataset groups array 1.0...

K近鄰 Python 機器學習

from numpy import 科學計算包 import operator 運算子模組 defcreatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 建立資料集 labels a a b b 建立標籤 return group,labels inx,...

Python機器學習及實踐第一講 機器學習綜述

我們可以總結機器學習有以下特點 1.許多機器學習系統所解決都是無法直接使用固定規則或者流程 完成的問題,通常這類問題對於人來說十分簡單。比如電腦程式裡的計算方法都有著清晰固定的計算流程,不屬於具備智慧型的系統。但是如果要求一台機器去辨別一張 中的人或物體,機器就很難做到,但對人來說是一件很容易的任務...