机器学习接口和代码之 KNN
生活随笔
收集整理的這篇文章主要介紹了
机器学习接口和代码之 KNN
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
官網(wǎng)地址: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)參數(shù):n_neighbors : int,optional(default = 5)默認(rèn)情況下kneighbors查詢使用的鄰居數(shù)。就是k-NN的k的值,選取最近的k個(gè)點(diǎn)。weights : str或callable,可選(默認(rèn)=‘uniform’)默認(rèn)是uniform,參數(shù)可以是uniform、distance,也可以是用戶自己定義的函數(shù)。uniform是均等的權(quán)重,就說所有的鄰近點(diǎn)的權(quán)重都是相等的。distance是不均等的權(quán)重,距離近的點(diǎn)比距離遠(yuǎn)的點(diǎn)的影響大。用戶自定義的函數(shù),接收距離的數(shù)組,返回一組維數(shù)相同的權(quán)重。algorithm : {‘a(chǎn)uto’,‘ball_tree’,‘kd_tree’,‘brute’},可選快速k近鄰搜索算法,默認(rèn)參數(shù)為auto,可以理解為算法自己決定合適的搜索算法。除此之外,用戶也可以自己指定搜索算法ball_tree、kd_tree、brute方法進(jìn)行搜索,brute是蠻力搜索,也就是線性掃描,當(dāng)訓(xùn)練集很大時(shí),計(jì)算非常耗時(shí)。kd_tree,構(gòu)造kd樹存儲(chǔ)數(shù)據(jù)以便對(duì)其進(jìn)行快速檢索的樹形數(shù)據(jù)結(jié)構(gòu),kd樹也就是數(shù)據(jù)結(jié)構(gòu)中的二叉樹。以中值切分構(gòu)造的樹,每個(gè)結(jié)點(diǎn)是一個(gè)超矩形,在維數(shù)小于20時(shí)效率高。ball tree是為了克服kd樹高緯失效而發(fā)明的,其構(gòu)造過程是以質(zhì)心C和半徑r分割樣本空間,每個(gè)節(jié)點(diǎn)是一個(gè)超球體。leaf_size : int,optional(默認(rèn)值= 30)默認(rèn)是30,這個(gè)是構(gòu)造的kd樹和ball樹的大小。這個(gè)值的設(shè)置會(huì)影響樹構(gòu)建的速度和搜索速度,同樣也影響著存儲(chǔ)樹所需的內(nèi)存大小。需要根據(jù)問題的性質(zhì)選擇最優(yōu)的大小。p : 整數(shù),可選(默認(rèn)= 2)距離度量公式。這個(gè)參數(shù)默認(rèn)為2,也就是默認(rèn)使用歐式距離公式進(jìn)行距離度量。也可以設(shè)置為1,使用曼哈頓距離公式進(jìn)行距離度量。metric : 字符串或可調(diào)用,默認(rèn)為’minkowski’用于距離度量,默認(rèn)度量是minkowski,也就是p=2的歐氏距離(歐幾里德度量)。聯(lián)合 上述P 使用metric_params : dict,optional(默認(rèn)=None)距離公式的其他關(guān)鍵參數(shù),這個(gè)可以不管,使用默認(rèn)的None即可。n_jobs : int或None,可選(默認(rèn)=None)并行處理設(shè)置。默認(rèn)為1,臨近點(diǎn)搜索并行工作數(shù)。如果為-1,那么CPU的所有cores都用于并行工作。方法名及含義
- fit(X, y)使用X作為訓(xùn)練數(shù)據(jù),y作為目標(biāo)值(類似于標(biāo)簽)來擬合模型。
- get_params([deep])獲取估值器的參數(shù)。
- kneighbors([X, n_neighbors, return_distance])查找一個(gè)或幾個(gè)點(diǎn)的K個(gè)鄰居。
- kneighbors_graph([X, n_neighbors, mode])計(jì)算在X數(shù)組中每個(gè)點(diǎn)的k鄰居的(權(quán)重)圖。
- predict(X)給提供的數(shù)據(jù)預(yù)測(cè)對(duì)應(yīng)的標(biāo)簽。
- predict_proba(X)返回測(cè)試數(shù)據(jù)X的概率估值。
- score(X, y[, sample_weight])返回給定測(cè)試數(shù)據(jù)和標(biāo)簽的平均準(zhǔn)確值。
- set_params(**params)設(shè)置估值器的參數(shù)。
示例一:鳶尾花數(shù)據(jù)分類
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## 設(shè)置字符集,防止中文亂碼 mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False## 數(shù)據(jù)加載 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. 數(shù)據(jù)轉(zhuǎn)換為數(shù)字以及分割 ## 數(shù)據(jù)轉(zhuǎn)換 datas = df.apply(lambda r: parseRecord(r), axis=1) ## 異常數(shù)據(jù)刪除 datas = datas.dropna(how='any') ## 數(shù)據(jù)分割 print(datas) print(datas.shape) X = datas[names[0:-2]] Y = datas[names[-1]] ## 數(shù)據(jù)抽樣(訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)分割) X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.4, random_state=0)print ("原始數(shù)據(jù)條數(shù):%d;訓(xùn)練數(shù)據(jù)條數(shù):%d;特征個(gè)數(shù):%d;測(cè)試樣本條數(shù):%d" % (len(X), len(X_train), X_train.shape[1], X_test.shape[0]))##### KNN算法實(shí)現(xiàn) # a. 模型構(gòu)建 # 模型中介紹的K值:n_neighbors knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, Y_train)# b. 模型效果輸出 ## 將正確的數(shù)據(jù)轉(zhuǎn)換為矩陣形式 y_test_hot = label_binarize(Y_test,classes=(1,2,3)) ## 得到預(yù)測(cè)屬于某個(gè)類別的概率值 knn_y_score = knn.predict_proba(X_test) ## 計(jì)算roc的值 knn_fpr, knn_tpr, knn_threasholds = metrics.roc_curve(y_test_hot.ravel(),knn_y_score.ravel()) ## 計(jì)算auc的值 knn_auc = metrics.auc(knn_fpr, knn_tpr) print ("KNN算法R值:", knn.score(X_train, Y_train)) print ("KNN算法AUC值:", knn_auc)# c. 模型預(yù)測(cè) knn_y_predict = knn.predict(X_test)## 畫圖2:預(yù)測(cè)結(jié)果畫圖 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'真實(shí)值') plt.plot(x_test_len, knn_y_predict, 'yo', markersize = 16, zorder=1, label=u'KNN算法預(yù)測(cè)值,$R^2$=%.3f' % knn.score(X_test, Y_test)) plt.legend(loc = 'lower right') plt.xlabel(u'數(shù)據(jù)編號(hào)', fontsize=18) plt.ylabel(u'種類', fontsize=18) plt.title(u'鳶尾花數(shù)據(jù)分類', fontsize=20) plt.show()?
總結(jié)
以上是生活随笔為你收集整理的机器学习接口和代码之 KNN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【疫情防控毕业设计源码】精品微信小程序社
- 下一篇: MySQL数据库基础理论