sklearn 中指标计算公式

TP:正例预测正确的个数
FP:负例预测错误的个数
TN:负例预测正确的个数
FN:正例预测错误的个数

 

1.  accuracy_score(y_true,y_pred)

准确率(accuracy)是所有预测对的right/all

例子:


>>>y_pred = [0, 2, 1, 3]
>>>y_true = [0, 1, 2, 3]
>>>accuracy_score(y_true, y_pred)
0.5

2. 

precision_score(y_true,y_pred,average='macro')

recall_score(y_true,y_pred,average='macro')

f1 _score(y_true,y_pred,average='macro')

精确率(precision) 描述的是在所有预测出来的正例中有多少是真的正例。

召回率(recall) ,描述的是所有正例我能发现多少。

F1值——精确率和召回率的调和均值,只有当精确率和召回率都很高时,F1值才会高。

分别计算各个类别的TP,FP,FN,Precision ,Recall和F1-score 然后求平均,即macro precision_score, macro recall_score和macro F1-score。

例子:

实际数据:1, 2, 3, 4, 5, 6, 7, 8, 9 

真实类别:A, A, A, A, B, B, B, C, C
预测类别:A, A, B, C, B, B, C, B, C

1) acc: (2+2+1)/10=0.5
2) macro precison,recall F1-score
则各个类别的真假阳阴性:

        A      B      C     总计

TP   2      2      1       5
FP   0      2      2       4
FN   2      1      1       4 

 

A类别的精确率   : PA = 2/(2+0)= 1
A类别的召回率   : RA = 2/(2+2)= 0.5
A类别的F1-score  : FA = 2*(1*0.5)/(1+0.5) = 0.667

B类别的精确率   : PB = 2/(2+2)= 0.5
B类别的召回率   : RB = 2/(2+1)= 0.667
B类别的F1-score  : FB = 2*(0.5*0.667)/(0.5+0.667) = 0.572

C类别的精确率  : PC = 1/(1+2)= 0.333
C类别的召回率   : RC = 1/(1+1)= 0.5
C类别的F1-score  : FC = 2*(0.333*0.5)/(0.333+0.5) = 0.39976

macro precison-score = (1+0.5+0.333)/3 = 0.611
macro recall-score = (0.5+0.667+0.5)/3 = 0.556
macro F1-score = (0.667+0.572+0.39976)/3 = 0.5462

 

### XGBoost 中指标权重的作用与设置 XGBoost 是一种高效的梯度提升算法,在处理分类和回归问题时具有显著优势。为了优化模型性能,可以通过调整 **指标权重** 来实现更精确的目标函数优化。 #### 指标权重的概念 在机器学习中,“指标权重”通常指的是目标函数中的加权部分,用于平衡不同样本或类别的重要性。对于不平衡数据集而言,合理分配权重能够帮助模型更好地关注少数类别的预测效果。XGBoost 提供了多种方式来设定这些权重: 1. **`scale_pos_weight` 参数** 对于二分类问题,当正负样本数量不均衡时,可通过 `scale_pos_weight` 调整正类相对于负类的权重[^2]。其计算公式如下: \[ scale\_pos\_weight = \frac{\text{sum of negative instances}}{\text{sum of positive instances}} \] 如果正类样本较少,则增大该值;反之亦然。此参数仅适用于二分类任务。 2. **样本权重 (`sample_weights`)** 使用 `DMatrix` 创建数据结构时,可传入一个权重向量作为第三个参数。这个权重向量允许为每个样本单独指定重要性[^3]: ```python import xgboost as xgb sample_weights = [...] # 自定义权重列表 dtrain = xgboost.DMatrix(X_train, label=y_train, weight=sample_weights) ``` 此方法适合解决多分类或多标签问题下的样本分布失衡情况。 3. **类别权重 (通过自定义损失函数)** 当标准内置功能无法满足需求时,还可以编写自己的目标函数并加入相应的惩罚机制。例如,在某些特定领域应用里可能希望对误判不同类型给予不同程度罚款: ```python def custom_objective(y_true, y_pred): error_cost_matrix = np.array([[0., 5.], [1., 0.]]) # 定义代价矩阵 grad = [] hess = [] for t,p in zip(y_true,y_pred): cost_diff = p*(error_cost_matrix[1][int(t)] - error_cost_matrix[0][int(t)]) g = sigmoid(-cost_diff)*sigmoid_derivative(cost_diff)*(error_cost_matrix[1][int(t)]-error_cost_matrix[0][int(t)])*p*(1-p) h = (-sigmoid_derivative(-cost_diff)**2 + sigmoid_second_derivative(-cost_diff))*\ ((error_cost_matrix[1][int(t)]-error_cost_matrix[0][int(t)])**2 * p *(1-p)) + \ sigmoid(-cost_diff)*sigmoid_derivative(cost_diff)*(error_cost_matrix[1][int(t)]-error_cost_matrix[0][int(t)])*(-2*p+1) grad.append(g) hess.append(h) return np.array(grad),np.array(hess) model.set_params(objective=custom_objective) ``` #### 影响分析 适当调节上述提到的各种形式的“指标权重”,会对最终训练出来的模型产生深远的影响: - 更好地应对类别不平衡现象; - 让模型更加注重那些被赋予更高优先级的任务或者事件; - 可能提高整体评估指标的表现比如AUC ROC曲线下面包围面积等等。 但是需要注意的是,过度依赖人为干预可能会引入新的偏差风险,所以建议结合交叉验证手段反复试验找到最佳组合方案。 ```python import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split import xgboost as xgb # Generate synthetic dataset with class imbalance X, y = make_classification(n_samples=1000, n_features=20, weights=[0.95], flip_y=0, random_state=42) X_train, X_val, y_train, y_val = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42) dtrain = xgb.DMatrix(X_train, label=y_train) dval = xgb.DMatrix(X_val, label=y_val) params = { 'objective': 'binary:logistic', 'eval_metric': ['auc'], 'scale_pos_weight': sum(y == 0)/sum(y == 1), } bst = xgb.train(params=params, dtrain=dtrain, num_boost_round=100, evals=[(dval,'validation')]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值