码迷,mamicode.com
首页 > 其他好文 > 详细

xgboost 特征选择,筛选特征的正要性

时间:2018-04-17 18:03:49      阅读:1386      评论:0      收藏:0      [点我收藏+]

标签:save   图片   gbdt   错误   text   dma   编译   article   计算   

import pandas as pd
import xgboost as xgb
import operator
from matplotlib import pylab as plt

def ceate_feature_map(features):
    outfile = open(‘xgb.fmap‘, ‘w‘)
    i = 0
    for feat in features:
        outfile.write(‘{0}\t{1}\tq\n‘.format(i, feat))
        i = i + 1

    outfile.close()

def get_data():
    train = pd.read_csv("../input/train.csv")

    features = list(train.columns[2:])

    y_train = train.Hazard

    for feat in train.select_dtypes(include=[‘object‘]).columns:
        m = train.groupby([feat])[‘Hazard‘].mean()
        train[feat].replace(m,inplace=True)

    x_train = train[features]

    return features, x_train, y_train

def get_data2():
    from sklearn.datasets import load_iris
    #获取数据
    iris = load_iris()
    x_train=pd.DataFrame(iris.data)
    features=["sepal_length","sepal_width","petal_length","petal_width"]
    x_train.columns=features
    y_train=pd.DataFrame(iris.target)
    return features, x_train, y_train

#features, x_train, y_train = get_data()
features, x_train, y_train = get_data2()
ceate_feature_map(features)

xgb_params = {"objective": "reg:linear", "eta": 0.01, "max_depth": 8, "seed": 42, "silent": 1}
num_rounds = 1000

dtrain = xgb.DMatrix(x_train, label=y_train)
gbdt = xgb.train(xgb_params, dtrain, num_rounds)

importance = gbdt.get_fscore(fmap=‘xgb.fmap‘)
importance = sorted(importance.items(), key=operator.itemgetter(1))

df = pd.DataFrame(importance, columns=[‘feature‘, ‘fscore‘])
df[‘fscore‘] = df[‘fscore‘] / df[‘fscore‘].sum()

plt.figure()
df.plot()
df.plot(kind=‘barh‘, x=‘feature‘, y=‘fscore‘, legend=False, figsize=(16, 10))
plt.title(‘XGBoost Feature Importance‘)
plt.xlabel(‘relative importance‘)
plt.gcf().savefig(‘feature_importance_xgb.png‘)

根据结构分数的增益情况计算出来选择哪个特征的哪个分割点,某个特征的重要性,就是它在所有树中出现的次数之和。

参考:https://blog.csdn.net/q383700092/article/details/53698760

 

 

另外:使用xgboost,遇到一个问题

技术分享图片
看到网上有一个办法:
       重新新建Python文件,把你的代码拷过去;或者重命名也可以;还不行,就把代码复制到别的地方(不能在原始文件夹内),会重新编译,就正常了
       但是我觉得本质问题不是这样解决的,但临时应急还是可以的,欢迎讨论!
 
问题根源:
初学者或者说不太了解Python才会犯这种错误,其实只需要注意一点!不要使用任何模块名作为文件名,任何类型的文件都不可以!我的错误根源是在文件夹中使用xgboost.*的文件名,当import xgboost时会首先在当前文件中查找,才会出现这样的问题。所以,再次强调:不要用任何的模块名作为文件名!
 
 

xgboost 特征选择,筛选特征的正要性

标签:save   图片   gbdt   错误   text   dma   编译   article   计算   

原文地址:https://www.cnblogs.com/Allen-rg/p/8868109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!