溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

發(fā)布時(shí)間:2021-07-05 18:00:32 來源:億速云 閱讀:338 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Python中怎么利用KNN算法處理缺失數(shù)據(jù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

KNN代表" K最近鄰居",這是一種簡(jiǎn)單算法,可根據(jù)定義的最接近鄰居數(shù)進(jìn)行預(yù)測(cè)。 它計(jì)算從您要分類的實(shí)例到訓(xùn)練集中其他所有實(shí)例的距離。

正如標(biāo)題所示,我們不會(huì)將算法用于分類目的,而是填充缺失值。 本文將使用房屋價(jià)格數(shù)據(jù)集,這是一個(gè)簡(jiǎn)單而著名的數(shù)據(jù)集,僅包含500多個(gè)條目。

這篇文章的結(jié)構(gòu)如下:

  • 數(shù)據(jù)集加載和探索

  • KNN歸因

  • 歸因優(yōu)化

  •  結(jié)論

數(shù)據(jù)集加載和探索

如前所述,首先下載房屋數(shù)據(jù)集。 另外,請(qǐng)確保同時(shí)導(dǎo)入了Numpy和Pandas。 這是前幾行的外觀:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

默認(rèn)情況下,數(shù)據(jù)集缺失值非常低-單個(gè)屬性中只有五個(gè):

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

讓我們改變一下。 您通常不會(huì)這樣做,但是我們需要更多缺少的值。 首先,我們創(chuàng)建兩個(gè)隨機(jī)數(shù)數(shù)組,其范圍從1到數(shù)據(jù)集的長(zhǎng)度。  第一個(gè)數(shù)組包含35個(gè)元素,第二個(gè)數(shù)組包含20個(gè)(任意選擇):

i1 = np.random.choice(a=df.index, size=35)  i2 = np.random.choice(a=df.index, size=20)

這是第一個(gè)數(shù)組的樣子:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

您的數(shù)組將有所不同,因?yàn)殡S機(jī)化過程是隨機(jī)的。 接下來,我們將用NAN替換特定索引處的現(xiàn)有值。 這是如何做:

df.loc[i1, 'INDUS'] = np.nan  df.loc[i2, 'TAX'] = np.nan

現(xiàn)在,讓我們?cè)俅螜z查缺失值-這次,計(jì)數(shù)有所不同:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

這就是我們從歸因開始的全部前置工作。 讓我們?cè)谙乱徊糠种羞M(jìn)行操作。

KNN歸因

整個(gè)插補(bǔ)可歸結(jié)為4行代碼-其中之一是庫(kù)導(dǎo)入。  我們需要sklearn.impute中的KNNImputer,然后以一種著名的Scikit-Learn方式創(chuàng)建它的實(shí)例。 該類需要一個(gè)強(qiáng)制性參數(shù)–  n_neighbors。 它告訴冒充參數(shù)K的大小是多少。

首先,讓我們選擇3的任意數(shù)字。稍后我們將優(yōu)化此參數(shù),但是3足以啟動(dòng)。  接下來,我們可以在計(jì)算機(jī)上調(diào)用fit_transform方法以估算缺失的數(shù)據(jù)。

最后,我們將結(jié)果數(shù)組轉(zhuǎn)換為pandas.DataFrame對(duì)象,以便于解釋。 這是代碼:

from sklearn.impute import KNNImputer  imputer = KNNImputer(n_neighbors=3) imputed = imputer.fit_transform(df) df_imputed = pd.DataFrame(imputed, columns=df.columns)

非常簡(jiǎn)單。 讓我們現(xiàn)在檢查缺失值:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

盡管如此,仍然存在一個(gè)問題-我們?nèi)绾螢镵選擇正確的值?

歸因優(yōu)化

該住房數(shù)據(jù)集旨在通過回歸算法進(jìn)行預(yù)測(cè)建模,因?yàn)槟繕?biāo)變量是連續(xù)的(MEDV)。  這意味著我們可以訓(xùn)練許多預(yù)測(cè)模型,其中使用不同的K值估算缺失值,并查看哪個(gè)模型表現(xiàn)最佳。

但首先是導(dǎo)入。 我們需要Scikit-Learn提供的一些功能-將數(shù)據(jù)集分為訓(xùn)練和測(cè)試子集,訓(xùn)練模型并進(jìn)行驗(yàn)證。 我們選擇了"隨機(jī)森林"算法進(jìn)行訓(xùn)練。  RMSE用于驗(yàn)證:

from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error  rmse = lambda y, yhat: np.sqrt(mean_squared_error(y, yhat))

以下是執(zhí)行優(yōu)化的必要步驟:

迭代K的可能范圍-1到20之間的所有奇數(shù)都可以

  • 使用當(dāng)前的K值執(zhí)行插補(bǔ)

  • 將數(shù)據(jù)集分為訓(xùn)練和測(cè)試子集

  • 擬合隨機(jī)森林模型

  • 預(yù)測(cè)測(cè)試集

  • 使用RMSE進(jìn)行評(píng)估

聽起來很多,但可以歸結(jié)為大約15行代碼。 這是代碼段:

def optimize_k(data, target):     errors = []     for k in range(1, 20, 2):         imputer = KNNImputer(n_neighbors=k)         imputed = imputer.fit_transform(data)         df_imputed = pd.DataFrame(imputed, columns=df.columns)                  X = df_imputed.drop(target, axis=1)         y = df_imputed[target]         X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)          model = RandomForestRegressor()         model.fit(X_train, y_train)         preds = model.predict(X_test)         error = rmse(y_test, preds)         errors.append({'K': k, 'RMSE': error})              return errors

現(xiàn)在,我們可以使用修改后的數(shù)據(jù)集(在3列中缺少值)調(diào)用optimize_k函數(shù),并傳入目標(biāo)變量(MEDV):

k_errors = optimize_k(data=df, target='MEDV')

就是這樣! k_errors數(shù)組如下所示:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

以視覺方式表示:

Python中怎么利用KNN算法處理缺失數(shù)據(jù)

關(guān)于Python中怎么利用KNN算法處理缺失數(shù)據(jù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI