一、什麼是卡方分箱
卡方分箱(Chi-Square Binning),又稱卡方分割,是一種將連續變數離散化的方法。它通過計算變數的卡方統計量來確定最優劃分點,將變數劃分為多個區間進行分析。
換句話說,卡方分箱是將連續變數(如年齡、收入等)按照分割點分成不同區間(如年齡層、收入層等)的方法,使各個區間的變數分布差異最大化,從而提升變數的預測能力。
二、卡方分箱的步驟
卡方分箱的步驟如下:
1、將連續變數按照分割方式劃分為k個區間(或分段)。
2、計算每個區間內的數據個數,以及每個區間內目標變數的個數。
3、計算每個區間內目標變數的期望值,期望值為該區間內目標變數的總數除以總樣本數。
4、計算卡方值,卡方值用于衡量觀測值與期望值的偏離程度,卡方值越大,偏離程度越大。
5、計算相鄰區間的卡方值,以及相鄰區間合併後的總卡方值。
6、將相鄰的卡方值最小的區間進行合併,得到新的k-1個區間。
7、重複步驟2至步驟6,直到滿足某個終止條件(如卡方值小於某個閾值、區間數達到預設值等)。
8、根據分割點將連續變數離散化為k-1個區間。
三、代碼示例
import numpy as np import pandas as pd from scipy.stats import chi2_contingency def chi_merge(df, col, target_col, bin_num=5, confidence_level=3.84): """ 進行卡方分箱的函數 :param df: 數據集 :param col: 需要分箱的列名 :param target_col: 目標列名 :param bin_num: 分箱數目,默認為5 :param confidence_level: 置信度水平,默認為0.95 :return: 分箱結果,包括區間、實際樣本數、目標樣本數、期望樣本數、卡方值、p值、是否需要合併 """ bins = pd.qcut(df[col], q=bin_num, duplicates='drop') summary = df.groupby(bins).agg({ col: ['min', 'max', 'count'], target_col: ['sum', 'mean'] }) summary.columns = ['_'.join(col).strip() for col in summary.columns.values] intervals = [(summary[col]['min'], summary[col]['max']) for col in summary.columns.values if col.endswith('count')] while True: p_values = [] for i in range(len(intervals) - 1): obs = np.array([[summary.loc[intervals[i], target_col_sum], summary.loc[intervals[i], col_count] - summary.loc[intervals[i], target_col_sum]], [summary.loc[intervals[i + 1], target_col_sum], summary.loc[intervals[i + 1], col_count] - summary.loc[intervals[i + 1], target_col_sum]]]) _, p_value, _, _ = chi2_contingency(obs, correction=False) p_values.append(p_value) if np.min(p_values) > confidence_level: break index = p_values.index(np.min(p_values)) intervals[index] = (intervals[index][0], intervals[index + 1][1]) intervals.pop(index + 1) result = pd.DataFrame({ '區間': intervals, '實際樣本數': [summary.loc[intv, col_count] for intv in intervals], '目標樣本數': [summary.loc[intv, target_col_sum] for intv in intervals] }) n = df[target_col].sum() b = len(intervals) - 1 k = 2 alpha = 1 - confidence_level chi_value = chi2.isf(alpha, df=k-1) while True: exp_values = np.zeros(b) for i in range(b): exp_values[i] = (summary.loc[intervals[i], col_count] + summary.loc[intervals[i+1], col_count]) * result['目標樣本數'].sum() / n obs_values = result['目標樣本數'].values chi_square = ((obs_values - exp_values)**2 / exp_values).sum() if chi_square < chi_value: break min_index = np.argmin(exp_values) intervals = sorted(intervals) intervals[min_index] = (intervals[min_index][0], intervals[min_index+1][1]) intervals.pop(min_index+1) result['需要合併'][min_index] = True b -= 1 result['期望樣本數'] = exp_values result['卡方值'] = (obs_values - exp_values)**2 / exp_values result['p值'] = [chi2.sf(chi, df=1) for chi in result['卡方值']] result['需要合併'] = False return result
四、卡方分箱的優缺點
卡方分箱的優點:
1、卡方分箱可將連續變數離散化,消除線性關係對模型的影響。
2、卡方分箱是一種無監督學習方法,不需要事先了解目標變數的分布。
3、卡方分箱能夠將數據降維,降低模型計算複雜度。
卡方分箱的缺點:
1、卡方分箱生成的區間數目較少,可能對於數據的分布不夠精細。
2、卡方分箱會丟失變數之間的線性關係,有些情況下線性關係對預測是有幫助的。
3、卡方分箱不擅長處理極端值和缺失值,可能需要特殊處理。
五、卡方分箱的應用場景
卡方分箱可以應用於任何需要將連續變數離散化的場景,尤其適用於以下幾種情況:
1、前處理:在建立模型之前,需要對特徵進行處理,將連續變數離散化。
2、解決非線性關係:在特徵和目標變數之間存在非線性關係時,可以使用卡方分箱解決。
3、計算信息增益:在進行決策樹等模型中,需要計算各個特徵的信息增益,卡方分箱可以將連續變數離散化,便於計算信息增益。
六、總結
卡方分箱是一種將連續變數離散化的方法,它通過計算變數的卡方統計量來確定最優劃分點,將變數劃分為多個區間進行分析。卡方分箱可以應用於任何需要將連續變數離散化的場景,並且適用於解決非線性關係、計算信息增益等問題。
原創文章,作者:AXWQB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/368528.html