关于metrics.classification_report报告中指标解读

函数的应用

  • 主要是对类目分类相关的业务做评测使用
  • 主要介绍一下: macro avg 和 weighted avg区别

指标解释

1. macro avg(宏平均)

  • 定义:对每个类别的指标(如精确率、召回率、F1-score)取算术平均值,不考虑类别样本数量。
  • 计算公式:
macro_avg = (指标_类别1 + 指标_类别2 + ... + 指标_类别N) / N
  • 特点:
    平等对待每个类别:无论类别样本数量多少,每个类别的权重相同。
  • 适用场景:当类别样本量相对平衡时,能更公平地反映模型在所有类别上的表现。
  • 缺点:如果类别严重不平衡(某些类别样本极少),宏平均可能被小样本类别的极端值拉高或压低。
  • 示例:
假设有 3 个类别:
类别 A:精确率 = 0.9,样本量 = 100
类别 B:精确率 = 0.5,样本量 = 10
类别 C:精确率 = 0.7,样本量 = 10
则 macro avg 精确率 = (0.9 + 0.5 + 0.7) / 30.7

2. weighted avg(加权平均)

  • 定义:根据每个类别的样本数量对指标进行加权平均,样本量越大的类别权重越高。
  • 计算公式:
weighted_avg = (指标_类别1 × 样本量_类别1 + 指标_类别2 × 样本量_类别2 + ... ) / 总样本量
  • 特点:
    样本量决定权重:大样本类别对最终结果影响更大。
  • 适用场景:当类别样本量不平衡时(例如某些类别占大多数),加权平均能反映模型在整体数据上的表现。
  • 缺点:可能掩盖小样本类别的性能问题。
  • 示例:
沿用上述示例:
类别 A:精确率 = 0.9,样本量 = 100
类别 B:精确率 = 0.5,样本量 = 10
类别 C:精确率 = 0.7,样本量 = 10
总样本量 = 120
则 weighted avg 精确率 = (0.9×100 + 0.5×10 + 0.7×10) / 1200.85.

3. 如何选择?

  • 样本平衡时:优先参考 macro avg,因为它平等反映所有类别表现。
  • 样本不平衡时:优先参考 weighted avg,因为它更关注模型在多数类上的表现。
  • 实际应用:需结合业务目标。例如:
    • 医疗诊断(罕见病检测):需关注小样本类别的召回率,此时 macro avg 更有意义。
    • 商品推荐(热门商品占多数):weighted avg 更贴近实际业务效果。

4. 示例报告解读

假设分类报告如下:

              precision  recall  f1-score  support

     class_0       0.90    0.80    0.85       100
     class_1       0.50    0.60    0.55        10
     class_2       0.70    0.70    0.70        10

    accuracy                       0.85       120
   macro avg       0.70    0.70    0.70       120
weighted avg       0.85    0.85    0.85       120

macro avg:所有类别的指标取平均,结果是 0.70。
weighted avg:大样本类别(class_0)主导结果,结果是 0.85。

5. 总结

指标 核心思想 适用场景
macro avg 平等对待每个类别 类别样本量平衡
weighted avg 根据样本量加权 类别样本量不平衡
根据数据分布和业务需求选择合适的指标!

"""用户价值分层预测全流程示例""" import pandas as pd import numpy as np from sklearn.preprocessing import OrdinalEncoder, StandardScaler from sklearn.impute import SimpleImputer from sklearn.model_selection import train_test_split from factor_analyzer import FactorAnalyzer from factor_analyzer.factor_analyzer import calculate_kmo from xgboost import XGBClassifier import lightgbm as lgb from sklearn.metrics import classification_report # ====================== # 1. 数据读取与清洗 # ====================== def load_and_clean(data_path): # 读取数据 df = pd.read_csv(data_path) # 缺失值处理 num_imputer = SimpleImputer(strategy='median') cat_imputer = SimpleImputer(strategy='most_frequent') # 数值型字段 numeric_cols = ['付费金额', '活跃时长', '广告收入', '留存'] df[numeric_cols] = num_imputer.fit_transform(df[numeric_cols]) # 分类型字段 categorical_cols = ['设备价值档位', '用户初始广告档位'] df[categorical_cols] = cat_imputer.fit_transform(df[categorical_cols]) # 异常值处理 df['活跃时长'] = np.where(df['活跃时长'] > 24, 24, df['活跃时长']) df['付费金额'] = np.where( df['付费金额'] > df['付费金额'].quantile(0.99), df['付费金额'].quantile(0.95), df['付费金额'] ) return df # ====================== # 2. 特征工程 # ====================== def feature_engineering(df): # 构造复合特征 df['ARPU密度'] = df['付费金额'] / (df['活跃天数'] + 1) df['广告展示率'] = df['广告曝光次数'] / df['短剧观看次数'] df['内容互动指数'] = np.log1p(df['收藏数'] * 1 + df['分享数'] * 2 + df['评论数'] * 3) # 分类变量编码 encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1) cat_cols = ['设备价值档位', '用户初始广告档位'] df[cat_cols] = encoder.fit_transform(df[cat_cols]) return df # ====================== # 3. 特征筛选与降维 # ====================== def feature_selection(df, target_col='付费意愿档位'): # 划分特征目标 X = df.drop(columns=[target_col]) y = df[target_col] # 计算IV值筛选 from sklearn.feature_selection import mutual_info_classif iv_values = mutual_info_classif(X, y) iv_df = pd.DataFrame({'feature': X.columns, 'iv': iv_values}) selected_features = iv_df[iv_df['iv'] > 0.02]['feature'].tolist() X_selected = X[selected_features] # 因子分析降维 kmo_all, kmo_model = calculate_kmo(X_selected) if kmo_model > 0.6: fa = FactorAnalyzer(n_factors=5, rotation='varimax') fa.fit(X_selected) factor_scores = fa.transform(X_selected) factor_cols = [f'Factor_{i}' for i in range(1, 6)] X_factors = pd.DataFrame(factor_scores, columns=factor_cols) else: X_factors = X_selected.copy() return X_factors, y # ====================== # 4. XGBoost特征筛选 # ====================== def xgb_feature_importance(X, y): # 训练XGBoost模型 model = XGBClassifier( objective='multi:softmax', eval_metric='mlogloss', use_label_encoder=False ) model.fit(X, y) # 获取特征重要性 importance = pd.DataFrame({ 'feature': X.columns, 'importance': model.feature_importances_ }).sort_values('importance', ascending=False) top10_features = importance.head(10)['feature'].tolist() return X[top10_features] # ====================== # 5. LightGBM建模预测 # ====================== def lgb_modeling(X, y): # 数据划分 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42 ) # 模型训练 model = lgb.LGBMClassifier( num_leaves=31, max_depth=5, learning_rate=0.1, n_estimators=300, class_weight='balanced' ) model.fit(X_train, y_train) # 模型评估 y_pred = model.predict(X_test) print(classification_report(y_test, y_pred)) return model # ====================== # 主流程执行 # ====================== if __name__ == "__main__": # 数据路径 DATA_PATH = "new.csv" # 执行流程 df = load_and_clean(DATA_PATH) df = feature_engineering(df) X, y = feature_selection(df) X_top10 = xgb_feature_importance(X, y) final_model = lgb_modeling(X_top10, y) # 模型保存 final_model.booster_.save_model('user_value_model.txt')详细讲解这段代码
最新发布
05-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值