日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五、实例:在波士顿房价数据集上用随机森林回归填补缺失值

發(fā)布時(shí)間:2024/7/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五、实例:在波士顿房价数据集上用随机森林回归填补缺失值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在波士頓房?jī)r(jià)數(shù)據(jù)集上用隨機(jī)森林回歸填補(bǔ)缺失值

點(diǎn)擊標(biāo)題即可獲取源代碼和筆記

一、引入

我們從現(xiàn)實(shí)中收集的數(shù)據(jù),幾乎不可能是完美無缺的,往往都會(huì)有一些缺失值。面對(duì)缺失值,很多人選擇的方式是直接將含有缺失值的樣本刪除,這是一種有效的方法,但是有時(shí)候填補(bǔ)缺失值會(huì)比直接丟棄樣本效果更好,即便我們其實(shí)并不知道缺失值的真實(shí)樣貌。在sklearn中,我們可以使用sklearn.impute.SimpleImputer來輕松地將均值,中值,或者其他最常用的數(shù)值填補(bǔ)到數(shù)據(jù)中。

二、目標(biāo)

在這個(gè)案例中,我們將使用均值,0,和隨機(jī)森林回歸來填補(bǔ)缺失值,并驗(yàn)證四種狀況下的擬合狀況,找出對(duì)使用的數(shù)據(jù)集來說最佳的缺失值填補(bǔ)方法。

1. 導(dǎo)入需要的庫

import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_boston from sklearn.impute import SimpleImputer from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score

2. 以波士頓數(shù)據(jù)集為例,導(dǎo)入完整的數(shù)據(jù)集并探索

dataset = load_boston() dataset.data.shape #總共506*13=6578個(gè)數(shù)據(jù) X_full, y_full = dataset.data, dataset.target n_samples = X_full.shape[0] n_features = X_full.shape[1]

3. 為完整數(shù)據(jù)集放入缺失值

#首先確定我們希望放入的缺失數(shù)據(jù)的比例,在這里我們假設(shè)是50%,那總共就要有3289個(gè)數(shù)據(jù)缺失 rng = np.random.RandomState(0) missing_rate = 0.5 n_missing_samples = int(np.floor(n_samples * n_features * missing_rate)) #np.floor向下取整,返回.0格式的浮點(diǎn)數(shù) #所有數(shù)據(jù)要隨機(jī)遍布在數(shù)據(jù)集的各行各列當(dāng)中,而一個(gè)缺失的數(shù)據(jù)會(huì)需要一個(gè)行索引和一個(gè)列索引 #如果能夠創(chuàng)造一個(gè)數(shù)組,包含3289個(gè)分布在0~506中間的行索引,和3289個(gè)分布在0~13之間的列索引,那我們就可 以利用索引來為數(shù)據(jù)中的任意3289個(gè)位置賦空值 #然后我們用0,均值和隨機(jī)森林來填寫這些缺失值,然后查看回歸的結(jié)果如何 missing_features = rng.randint(0,n_features,n_missing_samples) missing_samples = rng.randint(0,n_samples,n_missing_samples) #missing_samples = rng.choice(dataset.data.shape[0],n_missing_samples,replace=False) #我們現(xiàn)在采樣了3289個(gè)數(shù)據(jù),遠(yuǎn)遠(yuǎn)超過我們的樣本量506,所以我們使用隨機(jī)抽取的函數(shù)randint。但如果我們#需要的數(shù)據(jù)量小于我們的樣本量506,那我們可以采用np.random.choice來抽樣,choice會(huì)隨機(jī)抽取不重復(fù)的隨機(jī)數(shù),因此可以幫助我們讓數(shù)據(jù)更加分散,確保數(shù)據(jù)不會(huì)集中在一些行中 X_missing = X_full.copy() y_missing = y_full.copy() X_missing[missing_samples,missing_features] = np.nan X_missing = pd.DataFrame(X_missing) #轉(zhuǎn)換成DataFrame是為了后續(xù)方便各種操作,numpy對(duì)矩陣的運(yùn)算速度快到拯救人生,但是在索引等功能上卻不如pandas來得好用

4. 使用0和均值填補(bǔ)缺失值

#使用均值進(jìn)行填補(bǔ) from sklearn.impute import SimpleImputer imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') X_missing_mean = imp_mean.fit_transform(X_missing) #使用0進(jìn)行填補(bǔ) imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0) X_missing_0 = imp_0.fit_transform(X_missing)

5. 使用隨機(jī)森林填補(bǔ)缺失值

基本思想:

任何回歸都是從特征矩陣中學(xué)習(xí),然后求解連續(xù)型標(biāo)簽y的過程,之所以能夠?qū)崿F(xiàn)這個(gè)過程,是因?yàn)榛貧w算法認(rèn)為,特征矩陣和標(biāo)簽之前存在著某種聯(lián)系。實(shí)際上,標(biāo)簽和特征是可以相互轉(zhuǎn)換的,比如說,在一個(gè)“用地區(qū),環(huán)境,附近學(xué)校數(shù)量”預(yù)測(cè)“房?jī)r(jià)”的問題中,我們既可以用“地區(qū)”,“環(huán)境”,“附近學(xué)校數(shù)量”的數(shù)據(jù)來預(yù)測(cè)“房?jī)r(jià)”,也可以反過來,用“環(huán)境”,“附近學(xué)校數(shù)量”和“房?jī)r(jià)”來預(yù)測(cè)“地區(qū)”。而回歸填補(bǔ)缺失值,正是利用了這種思想。

對(duì)于一個(gè)有n個(gè)特征的數(shù)據(jù)來說,其中特征T有缺失值,我們就把特征T當(dāng)作標(biāo)簽,其他的n-1個(gè)特征和原本的標(biāo)簽組成新的特征矩陣。那對(duì)于T來說,它沒有缺失的部分,就是我們的Y_test,這部分?jǐn)?shù)據(jù)既有標(biāo)簽也有特征,而它缺失的部分,只有特征沒有標(biāo)簽,就是我們需要預(yù)測(cè)的部分。

1.特征T不缺失的值對(duì)應(yīng)的其他n-1個(gè)特征 + 本來的標(biāo)簽:X_train
2.特征T不缺失的值:Y_train
3.特征T缺失的值對(duì)應(yīng)的其他n-1個(gè)特征 + 本來的標(biāo)簽:X_test
4.特征T缺失的值:未知,我們需要預(yù)測(cè)的Y_test

這種做法,對(duì)于某一個(gè)特征大量缺失,其他特征卻很完整的情況,非常適用。

那如果數(shù)據(jù)中除了特征T之外,其他特征也有缺失值怎么辦?
答案是遍歷所有的特征,從缺失最少的開始進(jìn)行填補(bǔ)(因?yàn)樘钛a(bǔ)缺失最少的特征所需要的準(zhǔn)確信息最少)。填補(bǔ)一個(gè)特征時(shí),先將其他特征的缺失值用0代替,每完成一次回歸預(yù)測(cè),就將預(yù)測(cè)值放到原本的特征矩陣中,再繼續(xù)填補(bǔ)下一個(gè)特征。每一次填補(bǔ)完畢,有缺失值的特征會(huì)減少一個(gè),所以每次循環(huán)后,需要用0來填補(bǔ)的特征就越來越少。當(dāng)進(jìn)行到最后一個(gè)特征時(shí)(這個(gè)特征應(yīng)該是所有特征中缺失值最多的),已經(jīng)沒有任何的其他特征需要用0來進(jìn)行填補(bǔ)了,而我們已經(jīng)使用回歸為其他特征填補(bǔ)了大量有效信息,可以用來填補(bǔ)缺失最多的特征。遍歷所有的特征后,數(shù)據(jù)就完整,不再有缺失值了。

X_missing_reg = X_missing.copy() sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values for i in sortindex:#構(gòu)建我們的新特征矩陣和新標(biāo)簽df = X_missing_regfillc = df.iloc[:,i]df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)#在新特征矩陣中,對(duì)含有缺失值的列,進(jìn)行0的填補(bǔ)df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)#找出我們的訓(xùn)練集和測(cè)試集Ytrain = fillc[fillc.notnull()]Ytest = fillc[fillc.isnull()]Xtrain = df_0[Ytrain.index,:]Xtest = df_0[Ytest.index,:]#用隨機(jī)森林回歸來填補(bǔ)缺失值rfc = RandomForestRegressor(n_estimators=100)rfc = rfc.fit(Xtrain, Ytrain)Ypredict = rfc.predict(Xtest)#將填補(bǔ)好的特征返回到我們的原始的特征矩陣中X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

6. 對(duì)填補(bǔ)好的數(shù)據(jù)進(jìn)行建模

#對(duì)所有數(shù)據(jù)進(jìn)行建模,取得MSE結(jié)果 X = [X_full,X_missing_mean,X_missing_0,X_missing_reg] mse = [] std = [] for x in X:estimator = RandomForestRegressor(random_state=0, n_estimators=100)scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error', cv=5).mean()mse.append(scores * -1)

7. 用所得結(jié)果畫出條形圖

x_labels = ['Full data','Zero Imputation','Mean Imputation','Regressor Imputation'] colors = ['r', 'g', 'b', 'orange'] plt.figure(figsize=(12, 6)) ax = plt.subplot(111) for i in np.arange(len(mse)):ax.barh(i, mse[i],color=colors[i], alpha=0.6, align='center') ax.set_title('Imputation Techniques with Boston Data') ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1) ax.set_yticks(np.arange(len(mse))) ax.set_xlabel('MSE') ax.set_yticklabels(x_labels) plt.show()

總結(jié)

以上是生活随笔為你收集整理的五、实例:在波士顿房价数据集上用随机森林回归填补缺失值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。