k近鄰算法

      網(wǎng)友投稿 637 2025-03-31

      概述

      今天介紹一下機器學(xué)習(xí)常用算法,以及常用的數(shù)據(jù)處理技巧等。我們都知道機器學(xué)習(xí)針對特定任務(wù)從經(jīng)驗中學(xué)習(xí),并且使得我們的任務(wù)效果越來越好。我們看一機器學(xué)習(xí)的workflow,如下所示:數(shù)據(jù)采集和標記->數(shù)據(jù)清洗->特征選擇->模型選擇->模型訓(xùn)練和測試->模型性能評估和優(yōu)化->模型使用即上線。 我們一般通過Python來實現(xiàn)機器學(xué)習(xí)常用算法的程序,所以基于Python語言常用的機器學(xué)習(xí)類庫及其第三方擴展庫有:IPython,Jupyter,numpy,matplotlib,scipy,scikit-learn,seaborn。 我們先安裝這些類庫即。

      pip?install?ipython,jupyter,numpy,matplotlib,scipy,scikit-learn,seaborn

      下面我們來簡單的介紹一下這幾個類庫。

      類庫了解

      ipython

      1.ipython是一種探索性編程的類庫,它可以非常方便的執(zhí)行你的python代碼。快捷鍵和魔法用法可以自己百度和google,介紹一個常用的技巧就是通過魔法函數(shù)可以直接啟用魔法命令,不用每次執(zhí)行魔法命令時鍵入%。

      %automagic?on pwd cd

      2.可視化的嵌套可以通過。

      %matplotlib?inline

      numpy

      Numpy 是Python計算機科學(xué)基礎(chǔ)庫,里面有很多的數(shù)學(xué)算法。

      import?numpy?as?np a?=?np.array([[1,2,4],[1,2,3]]) #分別是多維數(shù)據(jù)的維度,軸和數(shù)據(jù)類型(2,?3),?2,?dtype('int64') a.shape,a.ndim,a.dtype

      k近鄰算法

      numpy是共享內(nèi)存的,如果需要獨立保存則需要顯式的備份。可以通過np.may_share_memory(),判斷兩個數(shù)組是否是共享內(nèi)存。

      a?=?np.arange(10)b?=?a[2:5] np.may_share_memory(a,b) #輸出 True b?=?a[2:5].copy() np.may_share_memory(a,b) #輸出 False

      關(guān)于軸的問題,numpy的多維數(shù)組是面向軸處理的。例如:

      a?=?np.random.randint(1,5,(4,6)) print(a) #輸出 array([[2,?4,?2,?3,?4,?3], ???????[2,?2,?1,?3,?4,?2], ???????[1,?3,?1,?1,?3,?1], ???????[1,?3,?3,?2,?3,?3]]) #面向軸處理,axis=0代表按行處理,axis=1面向列處理。 print(a.sum(axis=0),a.sum(axis=1)) #輸出 (array([?6,?12,??7,??9,?14,??9]),?array([18,?14,?10,?15]))

      還有一個經(jīng)常使用的用法就是按照array的維度操作。比如:

      a?=?np.arange(12) array([?0,??1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11]) b?=?a.reshape((3,4)) array([[?0,??1,??2,??3], ????????[?4,??5,??6,??7], ????????[?8,??9,?10,?11]]) b.ravel() array([?0,??1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11])) b=a[:,np.newaxis] array([[?0], ???????[?1], ???????[?2], ???????[?3], ???????[?4], ???????[?5], ???????[?6], ???????[?7], ???????[?8], ???????[?9], ???????[10], ???????[11]])

      排序,排序不僅支持按照值排序而且還通過index返回。比如

      a=np.array([10,3,4,7,12]) a.argsort() #輸出array([1,?2,?3,?0,?4])

      我在Numpy 數(shù)據(jù)處理一文中介紹了一些常用的用法,或者參考它的官方文檔。

      pandas

      關(guān)于pandas的技巧,可以參考Pandass 數(shù)據(jù)處理

      matplotlib 和 sklearn

      官方文檔已經(jīng)非常全面了,建議參考官方文檔。

      算法

      在之前我們已經(jīng)介紹了機器學(xué)習(xí)算法理論,下面我們介紹兩個幾個重要的關(guān)鍵術(shù)語。過擬合:模型能很好的擬合訓(xùn)練數(shù)據(jù),但是對于新數(shù)據(jù)或者測試數(shù)據(jù)的預(yù)測準確性較差。欠擬合:模型不能很好的擬合訓(xùn)練樣本且對新數(shù)據(jù)或者測試數(shù)據(jù)的預(yù)測準確性較差。相對應(yīng)的我們一般稱欠擬合為高偏差,過擬合稱為高方差。我們現(xiàn)在常用的機器學(xué)習(xí)算法是通過模型算法成本來反饋(反推)模型參數(shù),使得在成本函數(shù)或者代價函數(shù)最低的情況下,尋找最優(yōu)的模型參數(shù)。比如:

      J_{test}(\theta)=\frac 1{2m}\sum_{i=0}^m(h_\theta(x^{(i)})-y^{i})^2

      我們通過模型在數(shù)據(jù)集上的最少成本來求解最優(yōu)模型參數(shù)。

      我們在采用機器學(xué)習(xí)應(yīng)用業(yè)務(wù)時,我們通常通過交叉驗證數(shù)據(jù)集來衡量模型,即:訓(xùn)練數(shù)據(jù)集:交叉驗證數(shù)據(jù)集:測試數(shù)據(jù)集=6:2:2。在模型選擇時,使用訓(xùn)練數(shù)據(jù)集來訓(xùn)練算法參數(shù),用交叉驗證集來驗證參數(shù),選擇交叉驗證集的成本J最下的算法作為數(shù)據(jù)擬合模型,最后再用測試數(shù)據(jù)集來測試選擇出來的模型準確性。但是在實踐中,大多數(shù)直接將數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,而沒有交叉驗證數(shù)據(jù)集,主要是大多數(shù)時候并不需要橫向?qū)Ρ炔煌哪P汀T诠こ躺希覀冏钪饕墓ぷ鞑皇沁x擇模型,而是獲取更多的數(shù)據(jù)、分析數(shù)據(jù)以及數(shù)據(jù)挖掘。

      學(xué)習(xí)曲線是觀察模型準確率與訓(xùn)練數(shù)據(jù)集關(guān)系。步驟: 1.將數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)集和交叉驗證數(shù)據(jù)集。 2.取訓(xùn)練數(shù)據(jù)集的20%作為訓(xùn)練樣本,訓(xùn)練出模型參數(shù)。 3.使用交叉驗證數(shù)據(jù)集來計算訓(xùn)練出來的模型的準確率。 4.以訓(xùn)練數(shù)據(jù)集的準確性,交叉驗證的準確性作為縱坐標,訓(xùn)練數(shù)據(jù)集個數(shù)作為橫坐標,在坐標軸畫出。 5.訓(xùn)練數(shù)據(jù)集增加10%,跳到第三步驟繼續(xù)執(zhí)行,知道訓(xùn)練數(shù)據(jù)集大小為100%為止。 在詳細的機器學(xué)習(xí)算法里面,我們會畫出一個學(xué)習(xí)曲線。一般我們會通過學(xué)習(xí)曲線,來判斷算法是高偏差還是高方差。對于過擬合一般采取的方法:1.獲取更多的訓(xùn)練數(shù)據(jù)。2.減少輸入的特征數(shù)。對于欠擬合一般采取的方法:1.增加有價值的特征。2.增加多項式特征。

      除了學(xué)習(xí)曲線外,我們一般還會通過查準率和召回率來評價一個算法的好壞。比如關(guān)于一個腫瘤預(yù)測的實例中: 預(yù)測數(shù)據(jù)/實際數(shù)據(jù) ? ? ?實際惡性腫瘤 ? ? ? 實際良性腫瘤 預(yù)測惡性腫瘤 ? ? ? ? ?TruePositive ? ? ?FalsePositive 預(yù)測良性腫瘤 ? ? ? ? ?FalseNegative ? ? TrueNegative

      Precision=\frac {TruePositive}{TruePositive+FalsePositive} Recall=\frac {TruePositive}{TruePositive+FalseNegative} F_1Score=2\frac{PR}{P+R}

      K-近鄰算法

      k-近鄰算法是針對未標記的樣本類別,由距離其最近的k個鄰居投票決定的。優(yōu)點:準確性高,對異常值和噪聲有較高的的容忍度。缺點:計算量較大,對內(nèi)存的需求較大。一般而言,k值越大,模型的偏差越大,對噪聲數(shù)據(jù)越不敏感,當k值很大時,可能造成欠擬合;k值越小,模型的方差越大,當k值太小時容易造成過擬合。我們通過k-近鄰算法來進行糖尿病預(yù)測。數(shù)據(jù)集為diabetes.csv,我們依次來看一下。1.加載數(shù)據(jù)

      import?pandas?as?pd data_path="diabetes.csv" data?=?pd.read_csv(data_path) data.head()

      數(shù)據(jù)的8個特征分別為

      Pregnancies:懷孕的次數(shù)

      Glucose:血漿葡糖糖濃度。

      BloodPressure:舒張壓(單位毫米)

      SkinThickness:肱三頭肌厚度(單位毫米)

      Insulin:兩個小時的血清胰島素(單位毫升)

      BMI:身體質(zhì)量指數(shù),體重除以身高的平方。

      DiabetesPedigreeFunction:糖尿病血統(tǒng)指數(shù)。

      Age 年齡

      Outcome:結(jié)果標記值,0表示沒有糖尿病,1表示有糖尿病。

      我們可以看一下實例數(shù)據(jù)。

      data.shape(768,9) ata.groupby("Outcome").size() Outcome 0????5001????268 dtype:?int64

      其中陽性有500個,陰性有268個。我們將數(shù)據(jù)集分類出來方便我們訓(xùn)練和衡量。

      #只含有特征的數(shù)據(jù)集 x=data.iloc[:,0:8]#標記數(shù)據(jù) y=data.iloc[:,8] print('shape?of?x?{};shape?of?y?{}'.format(x.shape,y.shape)) #輸出?shape?of?x?(768,?8);shape?of?y?(768,) from?sklearn.model_selection?import?train_test_split #將數(shù)據(jù)集劃分為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集,其中測試數(shù)據(jù)集為20%。 x_train,x_test,y_trian,y_test?=?train_test_split(x,y,test_size=0.2)

      2.模型選擇我們使用三種算法對數(shù)據(jù)進行擬合即普通的k-均值算法,帶權(quán)重的k-均值算法和指定半徑的k-均值算法。

      from?sklearn.neighbors?import?KNeighborsClassifier,RadiusNeighborsClassifier models=[] models.append(("KNN",KNeighborsClassifier(n_neighbors=2))) models.append(("KNN?with?weights",KNeighborsClassifier(n_neighbors=2,weights="distance"))) models.append(("Radius?Neighbors",RadiusNeighborsClassifier(n_neighbors=2,radius=500))) results=[] for?name,model?in?models: ????model.fit(x_train,y_trian) ????results.append((name,model.score(x_test,y_test))) for?i?in?range(len(results)): ????print("name:{};score:{}".format(results[i][0],results[i][1]))#輸出 name:KNN;score:0.7142857142857143 name:KNN?with?weights;score:0.6168831168831169 name:Radius?Neighbors;score:0.6948051948051948

      因為訓(xùn)練樣本和測試樣本是隨機分配的,那么如何衡量模型呢?所以我們需要多次分配訓(xùn)練數(shù)據(jù)集和交叉驗證數(shù)據(jù)集,然后對多次預(yù)測結(jié)果進行平均。

      #kfold?將數(shù)據(jù)分成10份,其中一份作為交叉驗證數(shù)據(jù)集來計算模型準確性。from?sklearn.model_selection?import?KFoldfrom?sklearn.model_selection?import?cross_val_score results=[] for?name,model?in?models: ????kfold=KFold(n_splits=10) ????cv_result=cross_val_score(model,x,y,cv=kfold) ????results.append((name,cv_result)) for?i?in?range(len(results)): ????print("name:{};score:{}".format(results[i][0],results[i][1].mean()))

      我們采用普通的k-近鄰算法。3.模型分析我們分別對訓(xùn)練集和測試集進行分析,如下:

      knn?=?KNeighborsClassifier(n_neighbors=2) knn.fit(X=x_train,y=y_trian) train_score=knn.score(x_train,y_trian) test_score=knn.score(x_test,y_test) print("train?score?{};test?score?{}".format(train_score,test_score))#輸出 train?score?0.8289902280130294;test?score?0.7142857142857143

      一是模型在訓(xùn)練樣本上表現(xiàn)不佳,這說明算法太簡單。二是在測試集的準確性欠佳。我們下面通過學(xué)習(xí)曲線來看一下:

      from?sklearn.model_selection?import?learning_curve import?numpy?as?np import?matplotlib.pyplot?as?plt def?plot_learning_curve(plt,?estimator,?title,?X,?y,?ylim=None,?cv=None,n_jobs=1,?train_sizes=np.linspace(.1,?1.0,?5)): ????plt.title(title) ????if?ylim?is?not?None: ????????plt.ylim(*ylim) ????plt.xlabel("Training?examples") ????plt.ylabel("Score") ????train_sizes,?train_scores,?test_scores?=?learning_curve( ????????estimator,?X,?y,?cv=cv,?n_jobs=n_jobs,?train_sizes=train_sizes) ????train_scores_mean?=?np.mean(train_scores,?axis=1) ????train_scores_std?=?np.std(train_scores,?axis=1) ????test_scores_mean?=?np.mean(test_scores,?axis=1) ????test_scores_std?=?np.std(test_scores,?axis=1) ????plt.grid() ????plt.fill_between(train_sizes,?train_scores_mean?-?train_scores_std, ?????????????????????train_scores_mean?+?train_scores_std,?alpha=0.1, ?????????????????????color="r") ????plt.fill_between(train_sizes,?test_scores_mean?-?test_scores_std, ?????????????????????test_scores_mean?+?test_scores_std,?alpha=0.1,?color="g") ????plt.plot(train_sizes,?train_scores_mean,?'o--',?color="r", ?????????????label="Training?score") ????plt.plot(train_sizes,?test_scores_mean,?'o-',?color="g", ?????????????label="Cross-validation?score") ????plt.legend(loc="best") ????return?plt cv=ShuffleSplit(n_splits=10,test_size=0.2,random_state=0) plt.figure(figsize=(10,6),dpi=64) plot_learning_curve(plt,knn,"cure",x,y,ylim=(0.0,1.01),cv=cv) plt.show()

      我們能看到學(xué)習(xí)曲線,和我們的之前的模型分析的結(jié)果是一致的。如下圖所示:

      后面我們會介紹如何提高該算法準確率。4.特征可視化和分析有時候我們想通過將最相關(guān)的一個或者多個特征選擇出來進行可視化分析,那么如何選擇最相關(guān)的特征呢?我們一般通過如下方法:

      from?sklearn.feature_selection?import?SelectKBest selector?=?SelectKBest(k=2) x_new=selector.fit_transform(x,y) results=[] for?name,model?in?models: ????kfold=KFold(n_splits=10) ????cv_result=cross_val_score(model,x_new,y,cv=kfold) ????results.append((name,cv_result)) for?i?in?range(len(results)): ????print("name:{};score:{}".format(results[i][0],results[i][1].mean()))#輸出 name:KNN;score:0.725205058099795 name:KNN?with?weights;score:0.6900375939849623 name:Radius?Neighbors;score:0.6510252904989747

      然后可以將這兩個特征和輸出標記投影在坐標軸上,看一下數(shù)據(jù)分布。可以看到數(shù)據(jù)分布和重疊性很大,所以選擇k-近鄰算法無法達到一個很好的預(yù)測準確性。 這里的最相關(guān)的特征選擇主要采用了統(tǒng)計學(xué)上的相關(guān)性檢驗,比如:卡方檢驗、t檢驗。

      python 機器學(xué)習(xí)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:IF函數(shù)語法格式
      下一篇:Excel表格如何設(shè)置數(shù)據(jù)排序(excel表格如何進行數(shù)據(jù)排序)
      相關(guān)文章
      国产91精品一区二区麻豆亚洲| 亚洲国产成人影院播放| 亚洲人成网站观看在线播放| 国产精品亚洲AV三区| 亚洲白色白色在线播放| 久久亚洲高清观看| 亚洲精品白浆高清久久久久久 | 国产精品亚洲一区二区三区在线观看| 亚洲中文字幕无码中文| 亚洲丰满熟女一区二区v| 亚洲videosbestsex日本| 久久精品国产亚洲av麻豆蜜芽| 亚洲av无码片在线观看| 亚洲AV无码久久久久网站蜜桃| 亚洲一区二区三区深夜天堂| 亚洲字幕AV一区二区三区四区| 亚洲一区二区三区高清不卡 | 亚洲无码视频在线| 国产精品亚洲视频| 亚洲精品无码高潮喷水在线| 亚洲人成网77777亚洲色| 亚洲AV中文无码乱人伦下载| 亚洲精品在线观看视频| 久久亚洲sm情趣捆绑调教| 亚洲国产精品成人精品小说| 亚洲人成影院在线高清| 亚洲日韩国产精品乱-久| 亚洲欧美黑人猛交群| 一区国严二区亚洲三区| 久久亚洲AV永久无码精品| 亚洲精品国产精品乱码视色| 亚洲av日韩av不卡在线观看| 亚洲黄色在线播放| 亚洲1234区乱码| 亚洲av日韩综合一区二区三区| 日韩亚洲精品福利| 亚洲人色婷婷成人网站在线观看| 亚洲自偷自偷精品| 国产精品亚洲精品| 亚洲av成人片在线观看| 国产成人精品亚洲精品|