python get score gain_机器学习的特征重要性究竟是怎么算的

本文详细介绍了XGBoost和GBDT的特征重要性计算原理。对于XGBoost,特征重要性可以通过weight、gain、cover等方式计算,其中gain是信息增益之和除以特征出现频次。GBDT则根据节点分裂前后impurity减少量评估特征重要性,impurity计算通常基于MSE或MAE。特征重要性的最终输出经过归一化处理,转换为百分比形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近将主流模型的sklearn的代码撸了一遍,特别是计算特征重要性这块仔仔细细了解了一番;常用算法中xgboost、gbdt、randomforest、tree等都可以输出特征的重要性评分,下面着重记录xgboost和gbdt特征重要性计算过程,randomforest和gbdt差不多,就不赘述了。

1.xgboost

1.简介

xgboost是当下流行的boosting算法,基学习器可以是gbtree也可以是gbliner

当基学习器是gbtree时,可以计算特征重要性;

在基础的xgboost模块中,计算特征重要性调用get_score()

在xgboost的sklearn API中,计算特征重要性调用feature_importance_;

feature_importance_依然派生于get_score(),所以查看xgboost的get_score()源码就可知其所以然;

2.url:https://github.com/zengfanxi/xgboost/blob/master/python-package/xgboost/core.pyget_score有两个参数,fmap是一个包含特征名称映射关系的txt文档; importance_type指importance的计算类型;可取值有5个:weight:权重(某特征在整个树群节点中出现的次数,出现越多,价值就越高)

gain:(某特征在整个树群作为分裂节点的信息增益之和再除以某特征出现的频次)

total_gain(同上,代码中有介绍,这里total_gain就是gain)

cover和total_cover

cover比较复杂,python文档未做解释,其实是指某特征节点样本的二阶导数和再除以某特征出现的 我在xgboost R API文档中找到了部分解释: https://github.com/dmlc/xgboost/blob/f5659e17d5200bd7471a2e735177a81cb8d3012b/R-package/man/xgb.plot.tree.Rd

代码中频繁提到通过get_dump获取树规则,举个例子看看什么是树规则:

trees = bst.get_dump(with_stats=True)

for tree in trees:

print(tree)

# 以下输出了2次迭代的决策树规则,规则内包含量特征名、gain和cover,

# 源码就是提取上述3个变量值进行计算特征重要性

[out]:

0:[inteval<1] yes=1,no=2,missing=1,gain=923.585938,cover=7672

1:[limit<9850] yes=3,no=4,missing=3,gain=90.4335938,cover=6146.5

3:leaf=-1.86464596,cover=5525.25

4:leaf=-1.45520294,cover=621.25

2:[days<3650] yes=5,no=6,missing=5,gain=164.527832,cover=1525.5

5:leaf=-1.36227047,cover=598

6:leaf=-0.688206792,cover=927.5

0:[days<7850] yes=1,no=2,missing

### Python 机器学习实现日内回转交易策略 #### 数据准备与预处理 为了构建有效的日内回转交易模型,高质量的数据至关重要。通常会获取股票的历史价格数据作为输入特征的一部分。这些数据可以从金融API接口获得,比如Tushare、Yahoo Finance等。 ```python import tushare as ts pro = ts.pro_api('your_token') df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231') print(df.head()) ``` #### 特征工程 除了基础的价格变动外,还可以考虑加入技术指标作为额外的特征向量来增强预测能力。常见的有移动平均线(MA),相对强弱指数(RSI)以及布林带(Bollinger Bands)[^1]。 ```python def add_technical_indicators(dataframe): dataframe['MA_5'] = dataframe['close'].rolling(window=5).mean() delta = dataframe['close'].diff(1) gain = (delta.where(delta > 0, 0)).fillna(0) loss = (-delta.where(delta < 0, 0)).fillna(0) avg_gain = gain.rolling(window=14).mean() avg_loss = loss.rolling(window=14).mean() rs = avg_gain / avg_loss rsi = 100 - (100/(1 + rs)) dataframe['RSI'] = rsi add_technical_indicators(df) ``` #### 构建并训练机器学习模型 选择合适的法是成功的关键之一。对于时间序列分类问题来说,随机森林(Random Forest Classifier)和支持向量机(Support Vector Machine)都是不错的选择;而对于回归类的任务,则可以尝试XGBoost或者LSTM(Long Short-Term Memory Networks)神经网络架构[^2]。 ```python from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score features = ['open','high','low','volume','MA_5','RSI'] target = 'label' # 假设已经定义好标签列名 X_train,X_test,y_train,y_test=train_test_split( df[features], df[target], test_size=.2) model = RandomForestClassifier(n_estimators=100,max_depth=None,min_samples_split=2) model.fit(X_train.values.tolist(), y_train.tolist()) predictions=model.predict(X_test.values.tolist()) accuracy=accuracy_score(y_true=y_test.to_list(),y_pred=predictions) print(f'Model Accuracy:{accuracy:.4f}') ``` #### 执行交易决策 一旦建立了可靠的预测机制之后,就可以将其应用于实际市场环境中了。通过设定特定条件触发买卖指令,在此过程中务必考虑到滑点成本等因素的影响[^3]。 ```python class DayTradingStrategy: def __init__(self,model,data_source,interval_minutes=10): self.model = model self.data_source = data_source self.interval_minutes=interval_minutes def execute(self,current_time): recent_data=self.get_recent_data(current_time=current_time) prediction=self.make_prediction(recent_data) if(prediction==1):# Buy Signal place_buy_order() elif(prediction==-1):# Sell Signal place_sell_order() day_trading_strategy=DayTradingStrategy(model=model,data_source=df) current_datetime=datetime.now().strftime("%Y-%m-%d %H:%M:%S") day_trading_strategy.execute(current_datetime) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值