【Python】pandas连续变量分箱


路过了学校花店

荒野到海边

有一种浪漫的爱

是浪费时间

徘徊到繁华世界

才发现你背影

平凡得特别

绕过了城外边界

还是没告别

爱错过了太久

反而错得完美无缺

幸福兜了一个圈

🎵 林宥嘉《兜圈》


Python 复制代码
import pandas as pd
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

# 示例数据
data = {
    'feature1': np.random.rand(1000),
    'feature2': np.random.rand(1000),
    'feature3': np.random.rand(1000),
    'target': np.random.randint(0, 2, 1000)
}
df = pd.DataFrame(data)

# 自动选择最佳分箱数量的函数
def find_best_bins(df, feature, target, max_bins=10):
    best_bins = 2
    best_score = -np.inf
    
    for bins in range(2, max_bins + 1):
        df['bin'] = pd.cut(df[feature], bins=bins, labels=False)
        model = LogisticRegression()
        
        # 使用分箱后的特征进行交叉验证评分
        scores = cross_val_score(model, df[['bin']], df[target], scoring='roc_auc', cv=5)
        mean_score = scores.mean()
        
        if mean_score > best_score:
            best_score = mean_score
            best_bins = bins
    
    return best_bins

# 计算 WoE 和 IV 的函数
def calculate_woe_iv(df, feature, target, bins):
    epsilon = 1e-6  # 平滑处理,避免除零
    df['bin'] = pd.cut(df[feature], bins=bins)
    
    # 计算每个箱的总数、正样本数和负样本数
    binned = df.groupby('bin')[target].agg(['count', 'sum'])
    binned.columns = ['total', 'positive']
    binned['negative'] = binned['total'] - binned['positive']
    
     # 计算每个箱或类别的正负样本比例
    binned['positive_ratio'] = (binned['positive'] + epsilon) / (binned['positive'].sum() + epsilon)
    binned['negative_ratio'] = (binned['negative'] + epsilon) / (binned['negative'].sum() + epsilon)
    
    # 计算 WoE 和 IV
    binned['woe'] = np.log(binned['positive_ratio'] / binned['negative_ratio'])
    binned['iv'] = (binned['positive_ratio'] - binned['negative_ratio']) * binned['woe']
    
    # 计算总 IV
    iv = binned['iv'].sum()
    
    return iv

# 对 DataFrame 中每个特征列进行分箱,并选择最佳分箱数量
def binning_dataframe(df, target, max_bins=10):
    binned_df = df.copy()
    bin_info = {}
    iv_info = {}
    
    for feature in df.columns:
        if feature != target:
            best_bins = find_best_bins(df, feature, target, max_bins)
            bin_info[feature] = best_bins
            binned_df[feature] = pd.cut(df[feature], bins=best_bins, labels=False)
            
            # 计算 IV 值
            iv = calculate_woe_iv(df, feature, target, best_bins)
            iv_info[feature] = iv
    
    return binned_df, bin_info, iv_info

# 进行分箱并选择最佳分箱数量
binned_df, bin_info, iv_info = binning_dataframe(df, 'target', max_bins=10)

print("分箱信息:")
print(bin_info)
print("\nIV 信息:")
print(iv_info)
print("\n分箱后的 DataFrame:")
print(binned_df.head())
相关推荐
Python图像识别30 分钟前
71_基于深度学习的布料瑕疵检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
QX_hao1 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白1 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
千码君20162 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
淮北4942 小时前
windows安装minicoda
windows·python·conda
Evand J3 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
爱喝白开水a4 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway4 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康4 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼4 小时前
JavaWeb_p165部门管理
java·开发语言·前端