小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

kNN(上)

 印度阿三17 2019-11-09

本篇文章是機(jī)器學(xué)習(xí)小組第一周kNN學(xué)習(xí)的總結(jié),主要參考資料為:

機(jī)器學(xué)習(xí)的敲門磚:kNN算法(上)

https://mp.weixin.qq.com/s?__biz=MzUyMjI4MzE0MQ==&mid=2247484679&idx=1&sn=aec5259ee503b9b127b79e2a9661205d&chksm=f9cf74edceb8fdfb43e5dcd3279347e99fa6fb7523de2aaf301418eda6b4b14e17c24d671cd8&scene=21#wechat_redirect

機(jī)器學(xué)習(xí)的敲門磚:kNN算法(中)

https://mp.weixin.qq.com/s/vvCM0vWH5kmRfrRWxqXT8Q

?

kNN算法的應(yīng)用場(chǎng)景

kNN:k-NearestNeighbor,即尋找離樣本最近的k個(gè)鄰居。尋找這k個(gè)鄰居的目的,是認(rèn)為可以通過最相近的k個(gè)鄰居中出現(xiàn)次數(shù)最多的標(biāo)簽來作為樣本自身的標(biāo)簽。因?yàn)閗個(gè)鄰居本身存在多個(gè)分類,所以kNN不僅是一個(gè)分類算法,而且是一個(gè)天生的多分類算法。

kNN算法的原理

kNN算法的原理如下:

?

kNN算法的使用(sklearn)

 1 from sklearn import datasets
 2 from sklearn.model_selection import train_test_split, GridSearchCV
 3 from sklearn.neighbors import KNeighborsClassifier
 4 import numpy as np
 5 
 6 iris = datasets.load_iris()
 7 X = iris.data
 8 y = iris.target
 9 print(X.size, y.size)
10 
11 # random_state是一個(gè)seed;也可以設(shè)置test_size=0.3,隨機(jī)70%訓(xùn)練,30%測(cè)試
12 # 千萬注意不要寫錯(cuò)了返回值
13 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4798)
14 kNN_clf = KNeighborsClassifier(n_neighbors=3)
15 kNN_clf.fit(X_train, y_train)
16 
17 """
18 這部分的代碼主要用來做預(yù)測(cè)以及計(jì)算準(zhǔn)確率。
19 計(jì)算準(zhǔn)確率的邏輯也很簡(jiǎn)單,就是判斷預(yù)測(cè)和實(shí)際值有多少是相等的。
20 如果相等則算預(yù)測(cè)正確,否則預(yù)測(cè)失敗。
21 """
22 correct = np.count_nonzero((kNN_clf.predict(X_test) == y_test) == True)
23 print("Accuracy is:%.3f" % (correct / len(X_test)))

?

kNN算法學(xué)習(xí)收獲

  • 訓(xùn)練樣本和測(cè)試樣本數(shù)據(jù)的組織

當(dāng)我們按照一定比例將訓(xùn)練集和測(cè)試集拆分后,得到的數(shù)據(jù)集的結(jié)果有可能是順序的。在《機(jī)器學(xué)習(xí)的敲門磚:kNN算法(中)》中提到了兩種方式來打散數(shù)據(jù)集.

    • 通過numpy的concatenate函數(shù)將X,y合并為矩陣并進(jìn)行shuffle,再將shuffle后的數(shù)據(jù)按比例切分.
def train_test_split_by_concatenate(X, y, split_ratio):
    '''
    將X,y合并為矩陣并進(jìn)行shuffle,再將shuffle后的數(shù)據(jù)按比例切分為測(cè)試集和訓(xùn)練集
    :param X:特征數(shù)據(jù)
    :param y:標(biāo)簽數(shù)據(jù)
    :param split_ratio:數(shù)據(jù)切分比例
    :return:特征訓(xùn)練數(shù)據(jù)集,特征測(cè)試數(shù)據(jù)集,標(biāo)簽訓(xùn)練數(shù)據(jù)集,便簽測(cè)試數(shù)據(jù)集
    '''
    tempConcat = np.concatenate((X, y.reshape(-1, 1)), axis=1)
    np.random.shuffle(tempConcat)
    shuffle_X, shuffle_y = np.split(tempConcat, [4], axis=1)
    test_size = int(len(X) * split_ratio)
    X_train = shuffle_X[test_size:]
    y_train = shuffle_y[test_size:]
    X_test = shuffle_X[:test_size]
    y_test = shuffle_y[:test_size]
    return X_train, X_test, y_train, y_test
    • 通過numpy.random.permutation方法得到一個(gè)隨機(jī)索引的數(shù)組(< len(X)),通過對(duì)該數(shù)組按比例切分得到對(duì)應(yīng)的索引,根據(jù)索引找到X,y相應(yīng)的數(shù)據(jù).
def train_test_split_by_shuffle_index(X, y, split_ratio):
    '''
    生成一個(gè)隨機(jī)數(shù)數(shù)組(隨機(jī)數(shù)小于特征數(shù)據(jù)長(zhǎng)度),通過對(duì)該數(shù)組按比例切分得到對(duì)應(yīng)的索引,根據(jù)索引找到X,y相應(yīng)的數(shù)據(jù)
    :param X:特征數(shù)據(jù)
    :param y:標(biāo)簽數(shù)據(jù)
    :param split_ratio:數(shù)據(jù)切分比例
    :return:特征訓(xùn)練數(shù)據(jù)集,特征測(cè)試數(shù)據(jù)集,標(biāo)簽訓(xùn)練數(shù)據(jù)集,便簽測(cè)試數(shù)據(jù)集
    '''
    shuffle_index = np.random.permutation(len(X))
    test_size = int(len(X) * split_ratio)
    test_index = shuffle_index[:test_size]
    train_index = shuffle_index[test_size:]
    X_train = X[train_index]
    X_test = X[test_index]
    y_train = y[train_index]
    y_test = y[test_index]
    return X_train, X_test, y_train, y_test

數(shù)據(jù)集打散的方式可以應(yīng)用到更多的場(chǎng)景。

超參數(shù)和模型參數(shù)的理解以及GridSearch的使用

超參數(shù):類似于sklearn對(duì)kNN算法的封裝,k是算法需要傳入的參數(shù)。這種參數(shù)被稱為超參數(shù)。類似最近在學(xué)習(xí)的SparkALS,可以通過指定rank參數(shù)、maxIter參數(shù)的多個(gè)值來獲得不同的ALS模型,根據(jù)測(cè)試集在不同模型上的RMSE結(jié)果來選擇最好的模型。

sklearn中通過GridSearch來實(shí)現(xiàn)多個(gè)超參數(shù)的網(wǎng)格搜索。


from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

# 首先是一個(gè)數(shù)組;數(shù)組的每個(gè)元素是一個(gè)字典。即{"weights": ["uniform"], "n_neighbors": [i for i in range(1, 11)]} # 是一個(gè)字典 param_search = [ {"weights": ["uniform"], "n_neighbors": [i for i in range(1, 11)] }, {"weights": ["distance"], "n_neighbors": [i for i in range(1, 11)], "p": [i for i in range(1, 6)] } ]
knn_clf = KNeighborsClassifier()

grid_search = GridSearchCV(kNN_clf, param_search)
best_kNN_clf = grid_search.estimator

'''
輸出:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')
'''

?

來源:https://www./content-4-554401.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多