官網地址:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors?
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)參數:n_neighbors : int,optional(default = 5)默認情況下kneighbors查詢使用的鄰居數。就是k-NN的k的值,選取最近的k個點。weights : str或callable,可選(默認=‘uniform’)默認是uniform,參數可以是uniform、distance,也可以是用戶自己定義的函數。uniform是均等的權重,就說所有的鄰近點的權重都是相等的。distance是不均等的權重,距離近的點比距離遠的點的影響大。用戶自定義的函數,接收距離的數組,返回一組維數相同的權重。algorithm : {‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可選快速k近鄰搜索算法,默認參數為auto,可以理解為算法自己決定合適的搜索算法。除此之外,用戶也可以自己指定搜索算法ball_tree、kd_tree、brute方法進行搜索,brute是蠻力搜索,也就是線性掃描,當訓練集很大時,計算非常耗時。kd_tree,構造kd樹存儲數據以便對其進行快速檢索的樹形數據結構,kd樹也就是數據結構中的二叉樹。以中值切分構造的樹,每個結點是一個超矩形,在維數小于20時效率高。ball tree是為了克服kd樹高緯失效而發明的,其構造過程是以質心C和半徑r分割樣本空間,每個節點是一個超球體。leaf_size : int,optional(默認值= 30)默認是30,這個是構造的kd樹和ball樹的大小。這個值的設置會影響樹構建的速度和搜索速度,同樣也影響著存儲樹所需的內存大小。需要根據問題的性質選擇最優的大小。p : 整數,可選(默認= 2)距離度量公式。這個參數默認為2,也就是默認使用歐式距離公式進行距離度量。也可以設置為1,使用曼哈頓距離公式進行距離度量。metric : 字符串或可調用,默認為’minkowski’用于距離度量,默認度量是minkowski,也就是p=2的歐氏距離(歐幾里德度量)。聯合 上述P 使用metric_params : dict,optional(默認=None)距離公式的其他關鍵參數,這個可以不管,使用默認的None即可。n_jobs : int或None,可選(默認=None)并行處理設置。默認為1,臨近點搜索并行工作數。如果為-1,那么CPU的所有cores都用于并行工作。
方法名及含義
- fit(X, y)使用X作為訓練數據,y作為目標值(類似于標簽)來擬合模型。
- get_params([deep])獲取估值器的參數。
- kneighbors([X, n_neighbors, return_distance])查找一個或幾個點的K個鄰居。
- kneighbors_graph([X, n_neighbors, mode])計算在X數組中每個點的k鄰居的(權重)圖。
- predict(X)給提供的數據預測對應的標簽。
- predict_proba(X)返回測試數據X的概率估值。
- score(X, y[, sample_weight])返回給定測試數據和標簽的平均準確值。
- set_params(**params)設置估值器的參數。
示例一:鳶尾花數據分類
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import warningsimport sklearn
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier#KNN
from sklearn.preprocessing import label_binarize
from sklearn import metrics## 設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False## 數據加載
path = "datas/iris.data"
names = ['sepal length', 'sepal width', 'petal length', 'petal width', 'cla']
df = pd.read_csv(path, header=None, names=names)
print(df['cla'].value_counts())
print(df.head())def parseRecord(record):r = zip(names,record)for name,v in r:if name == 'cla':if v == 'Iris-setosa':record['cla'] = 1elif v == 'Iris-versicolor':record['cla'] = 2elif v == 'Iris-virginica':record['cla'] = 3else:record['cla'] = np.nanreturn record### 1. 數據轉換為數字以及分割
## 數據轉換
datas = df.apply(lambda r: parseRecord(r), axis=1)
## 異常數據刪除
datas = datas.dropna(how='any')
## 數據分割
print(datas)
print(datas.shape)
X = datas[names[0:-2]]
Y = datas[names[-1]]
## 數據抽樣(訓練數據和測試數據分割)
X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.4, random_state=0)print ("原始數據條數:%d;訓練數據條數:%d;特征個數:%d;測試樣本條數:%d" % (len(X), len(X_train), X_train.shape[1], X_test.shape[0]))##### KNN算法實現
# a. 模型構建
# 模型中介紹的K值:n_neighbors
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, Y_train)# b. 模型效果輸出
## 將正確的數據轉換為矩陣形式
y_test_hot = label_binarize(Y_test,classes=(1,2,3))
## 得到預測屬于某個類別的概率值
knn_y_score = knn.predict_proba(X_test)
## 計算roc的值
knn_fpr, knn_tpr, knn_threasholds = metrics.roc_curve(y_test_hot.ravel(),knn_y_score.ravel())
## 計算auc的值
knn_auc = metrics.auc(knn_fpr, knn_tpr)
print ("KNN算法R值:", knn.score(X_train, Y_train))
print ("KNN算法AUC值:", knn_auc)# c. 模型預測
knn_y_predict = knn.predict(X_test)## 畫圖2:預測結果畫圖
x_test_len = range(len(X_test))
plt.figure(figsize=(12, 9), facecolor='w')
plt.ylim(0.5,3.5)
plt.plot(x_test_len, Y_test, 'ro',markersize = 6, zorder=3, label=u'真實值')
plt.plot(x_test_len, knn_y_predict, 'yo', markersize = 16, zorder=1, label=u'KNN算法預測值,$R^2$=%.3f' % knn.score(X_test, Y_test))
plt.legend(loc = 'lower right')
plt.xlabel(u'數據編號', fontsize=18)
plt.ylabel(u'種類', fontsize=18)
plt.title(u'鳶尾花數據分類', fontsize=20)
plt.show()
?