机器学习接口和代码之 KNN
生活随笔
收集整理的這篇文章主要介紹了
机器学习接口和代码之 KNN
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
官網地址: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()?
總結
以上是生活随笔為你收集整理的机器学习接口和代码之 KNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【疫情防控毕业设计源码】精品微信小程序社
- 下一篇: 为机器学习占地14