Python實現K近鄰算法

K近鄰算法大概是最簡單使用的一種分類算法,本次主要是應用Python的Scikit-learn庫中的KNeigborsClassifier類和Pandas的Dataframe進行快速實現KN近鄰算法。

數據使用的是《Python數據挖掘入門與實踐》一書中用到的電離層(Ionosphere)數據,本次代碼并無創(chuàng)新,只是在相比作者代碼,數據導入部分相對簡單。

數據導入

import pandas as pd
import numpy as np

# 讀取數據,字段名分別用x0-x34代表,且不以第一列為索引
data = pd.read_csv('ionosphere_data.txt',header=None,names=['x'+str(i) for i in range(35)],index_col=False)

# 將最后一列的列名改為‘y’
data = data.rename(columns={'x34':'y'})
data.round(3).head()
數據展示.png

y列數據轉化

因變量y包含兩個值分別為‘b’和‘g’,即bad和good,將其轉化為可用來進行數據分析的數值型變量0和1

y_dict = {
    'g':1,
    'b':0,
}
data.y = data.y.map(y_dict)

轉化后的數據.png

將自變量數據和因變量數據分割

X_data = data.iloc[:,:-1]
y_data = data.iloc[:,-1]

進行K近鄰算法訓練

from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import cross_val_score
# 創(chuàng)建接收交叉檢驗結果均值列表
avg_scores = []
# 創(chuàng)建接收交叉檢驗結果的列表
all_scores = []
# 創(chuàng)建一個1-20的列表
para_values = list(range(1,21))
# 遍歷傳參交叉檢驗
for n_neighbors in para_values:
    # 創(chuàng)建K近鄰估計對象
    estimator = KNeighborsClassifier(n_neighbors=n_neighbors)
    # 采用交叉檢驗進行多次估計,返回準確率列表
    scores = cross_val_score(estimator, X_data, y_data, scoring='accuracy')
    # 將準確率列表均值存入avg_scores
    avg_scores.append(np.mean(scores))
    # 將返回準確率存入all_scores
    all_scores.append(scores)

# 遍歷展示每次的準確率均值
for i in avg_scores:
    print('%.3f' % i)
準確率.png

由此看設置不同的近鄰數量的K近鄰訓練后的交叉檢驗準確率基本在80%左右

圖表展示

%matplotlib inline
from matplotlib import pyplot as plt
plt.plot(para_values,avg_scores,'--o')
線性圖.png
for parameter, scores in zip(para_values, all_scores):
    n_scores = len(scores)
#     print(parameter,n_scores,scores)
    plt.plot([parameter] * 3, scores, '-o')
點線圖.png
plt.plot(para_values, all_scores, 'bx')
散點圖.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容