file-type

Python实现IV值计算与分箱变量重要性评估

版权申诉
115KB | 更新于2024-09-14 | 179 浏览量 | 6 评论 | 4 下载量 举报 收藏
download 限时特惠:#14.90
Python计算IV值是一种统计方法,用于评估变量在预测目标变量上的重要性,特别是在分类问题中,IV(Information Value)衡量的是一个二元变量通过改变分类状态对目标变量的不确定性减少程度。在处理分箱后的数据时,IV可以帮助我们确定哪些变量对于预测结果的影响更大。 在这个示例中,`CalcIV` 函数接收两个参数,`Xvar` 是一个离散变量,`Yvar` 是目标二元变量(0代表好,1代表坏)。函数首先计算 `Yvar` 中0和1的总数,然后创建两个数组 `N_0_group` 和 `N_1_group` 来分别存储 `Xvar` 在每一种取值下,对应 `Yvar` 为0和1的观测次数。接着,通过一个`for`循环遍历 `Xvar` 的唯一取值,统计每个值对应的 `Yvar` 类别分布,并计算IV值。 IV值的计算公式是基于信息增益(Information Gain)的概念,使用了加权的对数概率差,即: \[ IV = \sum_{g \in G} \frac{N_g}{N} \left( \frac{N_{g0}}{N_0} - \frac{N_{g1}}{N_1} \right) \log \left( \frac{\frac{N_{g0}}{N_0}}{\frac{N_{g1}}{N_1}} \right) \] 其中 \( N_g \) 是组 \( g \) 的样本数量,\( N \) 是总样本数,\( N_{g0} \) 和 \( N_{g1} \) 分别是组 \( g \) 内目标变量为0和1的样本数。 `caliv_batch` 函数则是一个批量计算IV值的版本,它接受一个数据框 `df`(分箱后的数据集),`Kvar` 作为主键,`Yvar` 为二元目标变量。它首先从数据框中移除 `Kvar` 和 `Yvar`,然后对剩下的变量列逐一调用 `CalcIV` 函数,将结果存储在一个字典 `ivlist` 中,最后将这些IV值转换成一个DataFrame `iv_df`,方便后续分析和可视化。 此外,示例还提到了Python基础操作,如切片和迭代。在实际应用中,对列表的操作效率至关重要,尤其是当处理大型数据集时。例如,通过切片可以快速获取列表的一部分元素,避免了逐个索引访问的低效。这里展示了如何用简洁的方式获取列表的前N个元素,这是高效编程的基础技能。 总结来说,这个Python示例提供了计算IV值的方法,适用于评估分箱数据中变量的预测能力,并且强调了基本的列表操作技巧,这些对于理解和实施机器学习项目中的特征选择和数据预处理至关重要。

相关推荐

filetype

"""用户价值分层预测全流程示例""" 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')详细讲解这段代码

资源评论
用户头像
书看不完了
2025.08.18
简洁易懂的Python代码示例,用于计算变量的重要性指标IV值。
用户头像
我要WhatYouNeed
2025.06.12
使用Python进行数据分箱和变量重要性评估的有效教程。
用户头像
王佛伟
2025.06.02
文章详细介绍了IV值的概念及其在Python中的计算方式。
用户头像
乔木Leo
2025.04.20
适合初学者,通过实例快速掌握IV值的计算方法。
用户头像
代码深渊漫步者
2025.04.03
代码示例清晰,有助于理解如何在Python中实现IV值计算。
用户头像
晕过前方
2025.03.13
通过实例讲解了IV值计算过程,适合数据分析初学者学习。🍜
weixin_38632488
  • 粉丝: 11
上传资源 快速赚钱