【Python】基于python的回歸隨機(jī)森林(RandomForestRegression)2:計(jì)算各特征指標(biāo)的權(quán)重(IncMSE)(附代碼)

本篇簡介不多,就一行。

IncMSE 是 increase in MSE。就是對每一個(gè)自變量(特征)隨機(jī)賦值,如果該自變量(特征)重要的話,預(yù)測的誤差會(huì)增大。


數(shù)據(jù)

我存為.xlsx格式,可以直接讀取。

一行是一個(gè)樣本,前17個(gè)為特征(自變量),最后一個(gè)是目標(biāo)變量(因變量)。

我們進(jìn)行回歸預(yù)測通常就是通過一個(gè)樣本的特征來預(yù)測目標(biāo)變量。

這個(gè)數(shù)據(jù)是我之前寫論文的時(shí)候用的,事先進(jìn)行歸一化處理。得分是該樣本城市的人口增長。



代碼的基本思想與上一篇文章一樣。

————————————————————————————————

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import math

import xlrd

import xlwt

import random

import copy

###########1.讀取數(shù)據(jù)部分##########

#載入數(shù)據(jù)并且打亂數(shù)據(jù)集

def load_data(StartPo,EndPo,TestProportion,FeatureNum,Shuffle,FilePath): ? ? ? ?

? ? #load_data(樣本起始行數(shù),結(jié)束行數(shù),測試集占總樣本集比重,特征數(shù),是否打亂樣本集) ? ? #如果Testproportion為0或1就訓(xùn)練集=測試集

? ? #打開excel文件

? ? workbook = xlrd.open_workbook(str((str(FilePath)))) ? ? ? #excel路徑

? ? sheet = workbook.sheet_by_name('Sheet1') ? ? ? ? ? ? #sheet表

? ? Sample = []#總樣本集

? ? train = []#訓(xùn)練集

? ? test = []#測試集

? ? TestSetSphere = (EndPo-StartPo+1)*TestProportion ?#測試集數(shù)目

? ? TestSetSphere = int(TestSetSphere)#測試集數(shù)目

? ? #獲取全部樣本集并打亂順序

? ? for loadi in range(StartPo-1,EndPo):

? ? ? ? RowSample = sheet.row_values(loadi)

? ? ? ? Sample.append(RowSample)

? ? if Shuffle == 1: ?#是否打亂樣本集

? ? ? ? random.shuffle(Sample) ?#如果shuffle=1,打亂樣本集

? ? #如果Testproportion為0就訓(xùn)練集=測試集

? ? if TestProportion == 0 or TestProportion == 1:

? ? ? ? TrainSet = np.array(Sample) ? ? ? ? ?#變換為array

? ? ? ? TestSet = np.array(Sample)

? ? else:

? ? ? ? #設(shè)置訓(xùn)練集

? ? ? ? for loadtraina in Sample[:(EndPo-TestSetSphere)]:

? ? ? ? ? ? GetTrainValue = loadtraina

? ? ? ? ? ? train.append(GetTrainValue)

? ? ? ? #設(shè)置測試集

? ? ? ? for loadtesta in range(-TestSetSphere-1,-1):

? ? ? ? ? ? GetTestValue = Sample[loadtesta]

? ? ? ? ? ? test.append(GetTestValue)

? ? ? ? #變換樣本集

? ? ? ? TrainSet = np.array(train) ? ? ? ? ? ? ? ? ?#變換為array

? ? ? ? TestSet = np.array(test) ? ? ? ?

? ?#分割特征與目標(biāo)變量

? ? x1 , y1 = TrainSet[:,:FeatureNum] , TrainSet[:,-1]

? ? x2 , y2 = TestSet[:,:FeatureNum] , TestSet[:,-1]

? ? return x1 , y1 , x2 , y2

###########2.回歸部分##########

def regression_method(model):

? ? model.fit(x_train,y_train)

? ? score = model.score(x_test, y_test)

? ? result = model.predict(x_test)

? ? ResidualSquare = (result - y_test)**2 ? ? #計(jì)算殘差平方

? ? RSS = sum(ResidualSquare) ? #計(jì)算殘差平方和

? ? MSE = np.mean(ResidualSquare) ? ? ? #計(jì)算均方差

? ? num_regress = len(result) ? #回歸樣本個(gè)數(shù)

? ? print(f'n={num_regress}')

? ? print(f'R^2={score}')

? ? print(f'MSE={MSE}')

? ? print(f'RSS={RSS}')

? ? return MSE

##########3.計(jì)算MSE########

def IncMSE(MSE,x_test, y_test,FeatureNum,Set_Times,model): ? ?#獲取MSE,x測試集,y測試集,特征數(shù),隨機(jī)求IncMSE次數(shù),模型(隨機(jī)森林)

? ? x_MSE = copy.deepcopy(x_test) ? ? ?#深拷貝不破壞原列表

? ? y_MSE = copy.deepcopy(y_test)

? ? TestNum = len(y_MSE)

? ? #########多次生成隨機(jī)數(shù),多次計(jì)算IncMSE(由于隨機(jī)有不確定性,所以要多次隨機(jī))

? ? IncMSE_Set = []

? ? IncMSE_Times = 1

? ? while IncMSE_Times <= Set_Times: ? ? #多次生成隨機(jī)數(shù),多次計(jì)算IncMSE(由于隨機(jī)有不確定性,所以要多次隨機(jī))

? ? ? ? IncMSE_x = []

? ? ? ? for i in range(0,FeatureNum):

? ? ? ? ? ? MSE_Replace = np.random.random(TestNum)

? ? ? ? ? ? x_MSE[:,i] = MSE_Replace ? ? ? ? ? #替換第i個(gè)特征

? ? ? ? ? ? MSE_Score = model.score(x_MSE,y_MSE)

? ? ? ? ? ? MSE_Result = model.predict(x_MSE)

? ? ? ? ? ? MSE_ResidualSquare = (MSE_Result - y_MSE)**2 ? #計(jì)算殘差平方

? ? ? ? ? ? MSE_RSS = sum(MSE_ResidualSquare) ? #計(jì)算殘差平方和

? ? ? ? ? ? MSE_MSE = np.mean(MSE_ResidualSquare) ? #計(jì)算均方差

? ? ? ? ? ? IncMSE = MSE_MSE - MSE

? ? ? ? ? ? IncMSE_x.append(IncMSE)

? ? ? ? ? ? x_MSE = copy.deepcopy(x_test) ? #復(fù)原原特征,深拷貝不破壞原列表 ? ? ? ? ? ?

? ? ? ? IncMSE_Set.append(IncMSE_x) ? ? ? ? ?#多次計(jì)算IncMSE后的數(shù)據(jù)

? ? ? ? IncMSE_Times += 1

? ? IncMSE_SetArray = np.array(IncMSE_Set) ? ?#變換為array

? ? ########計(jì)算每個(gè)特征的IncMSE平均數(shù)########

? ? X_IncMSE_Average = []

? ? for j in range(0,FeatureNum):

? ? ? ? X_IncMSE_Set = IncMSE_SetArray[:,j]

? ? ? ? X_IncMSE = np.mean(X_IncMSE_Set) ? ? ? #求多次IncMSE的平均值(由于隨機(jī)有不確定性,所以要多次隨機(jī))

? ? ? ? X_IncMSE_Average.append(X_IncMSE)

? ? X_IncMSE_Average_Sum = sum(X_IncMSE_Average)

? ? ########計(jì)算每個(gè)特征的IncMSE平均數(shù)的百分比########

? ? print('IncMSE:')

? ? for k in range(0,FeatureNum):

? ? ? ? X_Percent = X_IncMSE_Average[k]/X_IncMSE_Average_Sum ? ? ? #計(jì)算每個(gè)特征IncMSE的百分比

? ? ? ? print(f' ? ?x{k+1} = {X_IncMSE_Average[k]} ? {X_Percent*100}%') ? ? ? ?#輸出各特征的IncMSE的平均數(shù)與其百分比

###########4.預(yù)設(shè)回歸方法##########

####隨機(jī)森林回歸####

from sklearn import ensemble

model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=800) ? #esitimators決策樹數(shù)量

########5.設(shè)置參數(shù)與執(zhí)行部分#############

#設(shè)置數(shù)據(jù)參數(shù)部分

x_train , y_train , x_test , y_test = load_data(2,121,1,17,0,'C:\Code\MachineLearning\極差標(biāo)準(zhǔn)化數(shù)據(jù)集.xlsx') ? #行數(shù)以excel里為準(zhǔn)

#起始行數(shù)2,結(jié)束行數(shù)121,訓(xùn)練集=測試集,特征數(shù)量17,不打亂樣本集

MSE = regression_method(model_RandomForestRegressor) ? ? ? ?#括號(hào)內(nèi)填上方法,并獲取MSE

print('————————————————————————————————————————————————————————————')

IncMSE(MSE,x_test,y_test,17,1000,model_RandomForestRegressor)

#特征數(shù)17,x測試集,y測試集,隨機(jī)求IncMSE次數(shù)30次(輸出結(jié)果為其平均值),模型隨機(jī)森林 ? ? #隨機(jī)次數(shù)越多IncMSE越準(zhǔn)確

——————————————————————————————————————

由于是同一組數(shù)據(jù)集,因此在第五部分里load_data()的設(shè)置和前一篇文章一樣(前一篇文章的鏈接貼在該文章末尾)。

使用時(shí),一般情況下只需填寫第五部分即可,隨機(jī)IncMSE次數(shù)越多,得到的IncMSE越準(zhǔn)確,當(dāng)然運(yùn)行時(shí)間也越久,在這里我節(jié)省時(shí)間只進(jìn)行了50次。

值得注意的是,這里的起始和結(jié)束行數(shù)我設(shè)置成了以excel表里為準(zhǔn)。


#設(shè)置數(shù)據(jù)參數(shù)部分

x_train , y_train , x_test , y_test = load_data(2,121,1,17,0,'C:\Code\MachineLearning\極差標(biāo)準(zhǔn)化數(shù)據(jù)集.xlsx') ? #行數(shù)以excel里為準(zhǔn)

#起始行數(shù)2,結(jié)束行數(shù)121,訓(xùn)練集=測試集,特征數(shù)量17,不打亂樣本集

MSE = regression_method(model_RandomForestRegressor) ? ? ? ?#括號(hào)內(nèi)填上方法,并獲取MSE

print('————————————————————————————————————————————————————————————')

IncMSE(MSE,x_test,y_test,17,50,model_RandomForestRegressor)

#特征數(shù)17,x測試集,y測試集,隨機(jī)求IncMSE次數(shù)30次(輸出結(jié)果為其平均值),模型隨機(jī)森林 ? ? #隨機(jī)次數(shù)越多IncMSE越準(zhǔn)確





本文的代碼不出圖,但是會(huì)出幾個(gè)參數(shù)。

其中包括回歸里的幾個(gè)基本參數(shù),如R方、MSE、RSS。

還會(huì)求出每個(gè)特征的IncMSE值與占比,以此來衡量各特征的重要性。

比如如圖得出第17個(gè)自變量(特征)的IncMSE最高,第10個(gè)自變量(特征)次之,對照數(shù)據(jù)可以看出固定資產(chǎn)投資和失業(yè)率對人口增長的影響最大。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容