隨機森林回歸器學習


  關於回歸器的相關介紹可以看前面回歸決策樹的文章,由於隨機森林回歸器是基於回歸決策樹的,所以基本的概念是相同的,比如衡量標准,其他的基本屬性參數等等......

  這里主要是對隨機森林回歸器的一個簡單運用,調用一個完整的boston房價數據集,人為的使數據集變為缺失數據集,分別采用均值法、補0法、隨機森林回歸填充法三種方式來對缺失數據進行填補,最后采用隨機森林回歸器分別對不同的填充數據進行預測,得到三種方式的預測結果。

  對於均值填充和0填充容易理解,主要是隨機森林填充缺失數據是什么意思?

  任何回歸都是從特征矩陣中學習,然后求解連續型標簽y的過程,之所以能夠實現這個過程,是因為回歸算法認為,特征矩陣和標簽之前存在着某種聯系。實際上,標簽和特征是可以相互轉換的,比如說,在一個“用地區,環境,附近學校數 量”預測“房價”的問題中,我們既可以用“地區”,“環境”,“附近學校數量”的數據來預測“房價”,也可以反過來, 用“環境”,“附近學校數量”和“房價”來預測“地區”。而回歸填補缺失值,正是利用了這種思想。也就是某種特征與標簽互換了角色,實現特征的求值。這比直接使用均值或者0填充更有說服力。

  對於一個有n個特征的數據來說,其中特征T有缺失值,我們就把特征T當作標簽,其他的n-1個特征和原本的標簽組成新的特征矩陣。那對於T來說,它沒有缺失的部分,就是我們的Y_test,這部分數據既有標簽也有特征,而它缺失的部 分,只有特征沒有標簽,就是我們需要預測的部分。

  特征T不缺失的值對應的其他n-1個特征 + 本來的標簽:X_train

  特征T不缺失的值:Y_train

  特征T缺失的值對應的其他n-1個特征 + 本來的標簽:X_test

  特征T缺失的值:未知,我們需要預測的Y_test、

  理解了上面測試集,訓練集,測試標簽,訓練標簽的划分,就知道隨機森林回歸法的原理

 

新的問題是:那如果數據中除了特征T之外,其他特征也有缺失值怎么辦?

  答案是遍歷所有的特征,從缺失少的開始進行填補(因為填補缺失少的特征所需要的准確信息少)。 填補一個特征時,先將其他特征的缺失值用0代替,每完成一次回歸預測,就將預測值放到原本的特征矩陣中,再繼續填 補下一個特征。每一次填補完畢,有缺失值的特征會減少一個,所以每次循環后,需要用0來填補的特征就越來越少。當 進行到后一個特征時(這個特征應該是所有特征中缺失值多的),已經沒有任何的其他特征需要用0來進行填補了, 而我們已經使用回歸為其他特征填補了大量有效信息,可以用來填補缺失多的特征。 遍歷所有的特征后,數據就完整,不再有缺失值了。

實現過程:

X_missing_reg = X_missing.copy()

#找出數據集中,缺失值從小到大排列的特征們的順序,並且有了這些的索引
sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values#np.argsort()返回的是從小到大排序的順序所對應的索引
 
for i in sortindex:
    
    #構建我們的新特征矩陣(沒有被選中去填充的特征 + 原始的標簽)和新標簽(被選中去填充的特征)
    df = X_missing_reg
    fillc = df.iloc[:,i]#新標簽
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)#新特征矩陣
    
    #在新特征矩陣中,對含有缺失值的列,進行0的填補
    df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)
                        
    #找出我們的訓練集和測試集
    Ytrain = fillc[fillc.notnull()]# Ytrain是被選中要填充的特征中(現在是我們的標簽),存在的那些值:非空值
    Ytest = fillc[fillc.isnull()]#Ytest 是被選中要填充的特征中(現在是我們的標簽),不存在的那些值:空值。注意我們需要的不是Ytest的值,需要的是Ytest所帶的索引
    Xtrain = df_0[Ytrain.index,:]#在新特征矩陣上,被選出來的要填充的特征的非空值所對應的記錄
    Xtest = df_0[Ytest.index,:]#在新特征矩陣上,被選出來的要填充的特征的空值所對應的記錄
    
    #用隨機森林回歸來填補缺失值
    rfc = RandomForestRegressor(n_estimators=100)#實例化
    rfc = rfc.fit(Xtrain, Ytrain)#導入訓練集進行訓練
    Ypredict = rfc.predict(Xtest)#用predict接口將Xtest導入,得到我們的預測結果(回歸結果),就是我們要用來填補空值的這些值
    
    #將填補好的特征返回到我們的原始的特征矩陣中
    X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

 

主要流程介紹:

  首先導入數據集,查看數據集長什么樣

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


dataset = load_boston()
dataset#是一個字典

dataset.data.shape#總共506*13=6578個數據

  接下來人為制作缺失數據集,本身boston數據集是完整的,這里是為了比較不同填補方式的優劣性

X_full, y_full = dataset.data, dataset.target
n_samples = X_full.shape[0]#506
n_features = X_full.shape[1]#13

rng = np.random.RandomState(0)#設置一個隨機數生成種子
missing_rate = 0.5
n_missing_samples = int(np.floor(n_samples * n_features * missing_rate))#3289

missing_features = rng.randint(0,n_features,n_missing_samples)
#randint(下限,上限,n)指在下限和上限之間取出n個整數
missing_samples = rng.randint(0,n_samples,n_missing_samples)
#產生3289個在0-506之間的行索引

X_missing = X_full.copy() #定義缺失數據
y_missing = y_full.copy()#定義缺失標簽
X_missing[missing_samples,missing_features] = np.nan 
#人為制作缺失數據集,在某行某列填NAN
X_missing = pd.DataFrame(X_missing)#轉化為表格,便於后續索引操作

 可以查看缺失后的數據長什么樣:有50%的數據隨機被NAN填充了

 

 接着分別采用三種填充方式進行數據補全:

#使用均值進行填補
from sklearn.impute import SimpleImputer#一個用於填補缺失數據集的類
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
#實例化,用 均值 的方式填補表格中的 NAN
X_missing_mean = imp_mean.fit_transform(X_missing)
#對X_missing數據表格運用imp_mean 實現均值填補

 可以看到原來的NAN全部被均值填充了

#使用0進行填補
imp_0 = SimpleImputer(missing_values=np.nan strategy="constant",fill_value=0)#constant指的是常數
X_missing_0 = imp_0.fit_transform(X_missing)

這里的 NAN全部被0填充了。

再采用最開始隨機森林回歸的方式填充,查看效果:

X_missing_reg = X_missing.copy()

#找出數據集中,缺失值從小到大排列的特征們的順序,並且有了這些的索引
sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values#np.argsort()返回的是從小到大排序的順序所對應的索引
 
for i in sortindex:
    
    #構建我們的新特征矩陣(沒有被選中去填充的特征 + 原始的標簽)和新標簽(被選中去填充的特征)
    df = X_missing_reg
    fillc = df.iloc[:,i]#新標簽
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)#新特征矩陣
    
    #在新特征矩陣中,對含有缺失值的列,進行0的填補
    df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)
                        
    #找出我們的訓練集和測試集
    Ytrain = fillc[fillc.notnull()]# Ytrain是被選中要填充的特征中(現在是我們的標簽),存在的那些值:非空值
    Ytest = fillc[fillc.isnull()]#Ytest 是被選中要填充的特征中(現在是我們的標簽),不存在的那些值:空值。注意我們需要的不是Ytest的值,需要的是Ytest所帶的索引
    Xtrain = df_0[Ytrain.index,:]#在新特征矩陣上,被選出來的要填充的特征的非空值所對應的記錄
    Xtest = df_0[Ytest.index,:]#在新特征矩陣上,被選出來的要填充的特征的空值所對應的記錄
    
    #用隨機森林回歸來填補缺失值
    rfc = RandomForestRegressor(n_estimators=100)#實例化
    rfc = rfc.fit(Xtrain, Ytrain)#導入訓練集進行訓練
    Ypredict = rfc.predict(Xtest)#用predict接口將Xtest導入,得到我們的預測結果(回歸結果),就是我們要用來填補空值的這些值
    
    #將填補好的特征返回到我們的原始的特征矩陣中
    X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

#檢驗是否有空值
X_missing_reg.isnull().sum()
View Code

 

 

對三種填充的數據分別進行隨機森林回歸訓練分析:

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)

[*zip(['Full data','Zero Imputation','Mean Imputation','Regressor Imputation'],mse)]    

 

 看到以均方根誤差作為評分的結果,采用隨機森林回歸填充的數據集在預測結果上居然比原始數據集的得分都要高,而且效果明顯優於均值填充和0填充,所以在缺失數據集的填充上,隨機森林回歸填充可以多多考慮。

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM