📜  数据挖掘中的分箱(1)

📅  最后修改于: 2023-12-03 15:10:18.827000             🧑  作者: Mango

数据挖掘中的分箱(Binning)

在数据挖掘中,样本数据中的连续型变量可能会对分析和建模产生负面影响。因此,需要将连续数据离散化成类别(分箱),这样便于分析和建模。

分箱可以定义为按照某种规则将连续变量转化为离散变量的方法。在数据挖掘中,分箱可以有多种策略,例如等距分箱、等频分箱、基于聚类的分箱、卡方分箱等等。

等距分箱

等距分箱(Equi-Width Binning),也被称为等宽分箱,是按相同宽度将一个连续的变量划分为不同的类别。这种方法在数据不太离散的情况下效果比较好。

等距分箱代码示例

下面是一个Python代码示例,演示了如何使用pandas库的cut()函数将数据按照相同宽度分桶:

import pandas as pd

data = pd.read_csv("data.csv")
# 将 income 列等距分成 10 个桶
data["income_bucket"] = pd.cut(data["income"], bins=10, labels=False)
等频分箱

等频分箱(Equi-Depth Binning),又称为相同大小分箱或基于分位数的分箱,是将一个连续的变量分割成相等数量的小组。这种方法在数据中存在许多相同值时效果更佳。

等频分箱代码示例

下面是一个Python代码示例,演示了如何使用pandas库的qcut()函数将数据按照相同频度分桶:

import pandas as pd

data = pd.read_csv("data.csv")

# 将 income 列等频分成 10 个桶
data["income_bucket"] = pd.qcut(data["income"], q=10, labels=False)
基于聚类的分箱

基于聚类的分箱是将连续的变量转化为离散类别的一种经典方法。该方法使用聚类技术将大量连续数据集合为不同的组。这种方法不仅可以用于分箱目的,也可以用于异常检测和数据集的降维等方面。

卡方分箱

卡方分箱(Chi-Square Binning)是一种自适应的数据离散化分析方法。它使用卡方(χ²)统计量来测量每个划分中观察到的实际频数与预期频数之间的差异,从而确定最佳分箱策略。

卡方分箱代码示例

下面是一个Python代码示例,演示了如何使用pandas库的cut()函数将数据按照卡方分割为k个桶:

import pandas as pd
import numpy as np

data = pd.read_csv("data.csv")

# 定义卡方分箱方法
def ChiMerge(data, colname, nbins=5, confidenceVal=3.841):
    data = data.sort_values(colname)
    # 将colname列数据长度等分成nbins份
    freq_tab = pd.Series(data[colname]).value_counts(bins=nbins, sort=False)
    # 合并数量最少的相邻区间
    tmp = []
    for i in range(freq_tab.shape[0]-1):
        if freq_tab.iloc[i] == 0:
            freq_tab.iloc[i+1] = freq_tab.iloc[i+1]+0
        elif freq_tab.iloc[i+1] == 0:
            freq_tab.iloc[i] = freq_tab.iloc[i]+0
        else:
            tmp.append(freq_tab.iloc[i])
    tmp.append(freq_tab.iloc[freq_tab.shape[0]-1])
    freq_tab = pd.Series(tmp)
    freq_tab.index.name = colname  
    freq_tab = freq_tab[:,]
    freq = freq_tab.values
    # 初始化每组卡方值
    chi = np.zeros((nbins-1,))
    for i in range(len(chi)):
        #求分组后每组的实际值,期望值
        a = freq[i:i+2]
        b = np.sum(freq)/nbins
        # 计算卡方值
        chi[i] = (a[0]-b)**2/b + (a[1]-b)**2/b
    # 判断卡方值是否小于卡方分布的临界值
    while np.min(chi) < confidenceVal:
        # 找到卡方值最小的索引
        j = np.argmin(chi)
        # 合并卡方值最小的两组
        freq[j] += freq[j+1]
        freq = np.delete(freq,j+1)
        #重新计算每组卡方值
        chi = np.zeros((len(freq)-1,))
        for i in range(len(chi)):
            a = freq[i:i+2]
            b = np.sum(freq)/len(freq)
            chi[i] = (a[0]-b)**2/b + (a[1]-b)**2/b

    return freq_tab.index.categories

# 将 income 列卡方分成 10 个桶
data["income_bucket"] = pd.cut(data["income"], bins=ChiMerge(data, colname="income", nbins=10))

总结:

本文介绍了数据挖掘中的分箱方法,包括等距分箱、等频分箱、基于聚类的分箱和卡方分箱。程序员根据实际场景可以选择不同的分箱策略。在实践中,需要多尝试不同的分箱方法,找到最适合的分箱方案。