您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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。 這是前幾行的外觀:
默認(rèn)情況下,數(shù)據(jù)集缺失值非常低-單個(gè)屬性中只有五個(gè):
讓我們改變一下。 您通常不會(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ù)組的樣子:
您的數(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ù)有所不同:
這就是我們從歸因開始的全部前置工作。 讓我們?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)在檢查缺失值:
盡管如此,仍然存在一個(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ù)組如下所示:
以視覺方式表示:
關(guān)于Python中怎么利用KNN算法處理缺失數(shù)據(jù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(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)容。