使用XGboost模塊XGBClassifier、plot_importance來做特徵重要性排序——修改f1,f2等字段

如果你還不知道如何使用XGboost模塊XGBClassifier、plot_importance來做特徵重要性排序,戳這個網址即可。

下面我們講一個全網都沒好好講的問題:如何修改f1,f2成對應的特徵名稱。(我它喵了個咪的找了起碼5天,都是回答不全或者不清楚對應數據格式,最後終於慢慢試出來了)

一、首先,plot_importance()方法是可以自定義title(默認feature importance)、xlabel(默認F score)、ylabel(默認features)和是否網格grid的,更具體的可以使用help()命令或者查看官方文檔的。

之前不知道如何改一直以爲是xgboost庫的問題,現在才發現原來有很多是pyplot子庫可以做的,而且plot_importance()方法也確實提供了這些方法,眼拙眼拙。

二、其次,解決中文、負號和自適應的顯示問題,可以用如下代碼進行設置

# 解決中文和負號顯示問題
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 使顯示圖標自適應
plt.rcParams['figure.autolayout'] = True

三、再次,看一下數據格式和讀取方式

  1. 我選擇的數據格式類似於下面這樣csv文件(無index,分類結果就是level)在這裏插入圖片描述
  2. 使用的讀取數據方式是numpy.loadtxt() (np.load_txt使用方法:戳這兒)
    這種讀取的特點是隻能讀取純數據,也就是表頭(表頭包含feature名稱和分類結果label\level)下面的所有數據。
  3. 要想得到滿意的結果,數據還需要一個轉換
# x是我的features列表
x = ['#DEPTH', 'SP', 'GR', 'LLS', 'LLD', 'BS', 'RHOB', 'CNL', 'TC', 'NPHI', 'C1', 'C3', 'CALC', 'MTSA',
     'MTSC', 'DGA', 'PERM', 'POR', 'POR2', 'PORF', 'RWA', 'PORT', 'PORW', 'CRT', 'SAND', 'SH', 'MOIS', 'CARB', 'ASHA',
     'GC', 'GP', 'WP', 'ASH1']
# 中間省略很多步...
# dtrain是我的訓練數據(自變量矩陣是X,分類結果即因變量矩陣是y,特徵字段重命名成我設置的features列表)
dtrain = xgb.DMatrix(X, label=y, feature_names=x)

四、最後,關於模型訓練

你會發現使用的方法跟使用XGboost模塊XGBClassifier、plot_importance來做特徵重要性排序這篇文章所述已經不一樣啦哈哈!
因爲我們使用的是

# 構建參數字典
param = {}
# use softmax multi-class classification
param['objective'] = 'multi:softmax'
# scale weight of positive examples
param['eta'] = 0.1
param['max_depth'] = 6
param['silent'] = 1
param['nthread'] = 4
param['num_class'] = 9

# 訓練模型的方式有點不一樣哦,這個是直接傳入打包好的訓練數據(同時含自變量、因變量矩陣)
model = xgb.train(param, dtrain)

五、大一統代碼!

from numpy import loadtxt
import xgboost as xgb
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot as plt
import matplotlib as mpl
import pandas as pd
from sklearn.feature_selection import SelectFromModel

import warnings

warnings.filterwarnings("ignore")
# 加載數據集

path = "label_csv.csv"
dataset = loadtxt(path, skiprows=1, delimiter=",") # 以','爲分割符,跳過1行(標features那一行)

x = ['#DEPTH', 'SP', 'GR', 'LLS', 'LLD', 'BS', 'RHOB', 'CNL', 'TC', 'NPHI', 'C1', 'C3', 'CALC', 'MTSA',
     'MTSC', 'DGA', 'PERM', 'POR', 'POR2', 'PORF', 'RWA', 'PORT', 'PORW', 'CRT', 'SAND', 'SH', 'MOIS', 'CARB', 'ASHA',
     'GC', 'GP', 'WP', 'ASH1']
print(len(x))

# X:自變量矩陣(特徵對應的數據) y:因變量矩陣(根據數據得出的分類結果)
X = dataset[:,0:-1]
y = dataset[:,-1]

dtrain = xgb.DMatrix(X, label=y, feature_names=x)

param = {}
# use softmax multi-class classification
param['objective'] = 'multi:softmax'
# scale weight of positive examples
param['eta'] = 0.1
param['max_depth'] = 6
param['silent'] = 1
param['nthread'] = 4
param['num_class'] = 9


model = xgb.train(param, dtrain)
# 解決中文和負號顯示問題
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 使顯示圖標自適應
plt.rcParams['figure.autolayout'] = True

plot_importance(model, title='特徵重要性排序', xlabel='得分', ylabel='特徵', grid=False)

plt.show()

# 參考文章:http://www.huaxiaozhuan.com/%E5%B7%A5%E5%85%B7/xgboost/chapters/xgboost_usage.html
# https://xbuba.com/questions/46943314

# https://blog.csdn.net/leo_xu06/article/details/52424924
# https://stackoverflow.com/questions/46943314/xgboost-plot-importance-doesnt-show-feature-names
# https://blog.csdn.net/hao5335156/article/details/81173452
# https://www.cnblogs.com/wj-1314/p/9402324.html

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章