決策樹信息熵(entropy),基尼系數(gini)


總是很容易忘記一些專業術語的公式,可以先理解再去記住

1.信息熵(entropy)

 

 反正就是先計算每一類別的占比,然后再乘法,最后再將每一類加起來

def entropy(sr):
    """計算信息熵,以一個明細的觀測點序列為輸入  \n

    參數:
    ----------
    sr: series, 一列明細數據,非統計好的各類別占比  \n

    返回值:
    ----------
    entr: float, 變量的熵"""
    p = sr.distribution()
    e = p.binPct * np.log(p.binPct)
    return -e.sum()

其中distribution()的功能就是計算一個series各類的占比

def distribution(self, sort='index'):
    """計算單個變量的分布, 返回的數據框有兩列:cnt(個數)、binPct(占比) \n

    參數:
    ----------
    sort: str, 'index' 表示按變量值的順序排序,其他任意值表示變量值的個數占比排序"""
    a = self.value_counts()
    b = a / a.sum()
    df = pd.DataFrame({'cnt': a, 'binPct': b})
    if sort == 'index':
        df = df.sort_index()
    return df.reindex(columns=['cnt', 'binPct'])

2.基尼系數(GINI)

 

 具體公式如上,也是要先計算每一類別的分布

def gini_impurity(sr):
    """計算基尼不純度, 以一列明細觀測為輸入。  \n

    參數:
    ----------
    sr: series, 一列明細數據  \n

    返回值:
    ----------
    impurity: float, 變量的基尼不純度"""
    p = sr.distribution()
    impurity = 1 - (p.binPct * p.binPct).sum()
    return impurity

3.信息增益

 

 

 

 反正首先計算lable列的信息熵,然后再根據特征a的取值去分組,然后再計算組內label的信息熵,最后那原始的信息熵-sum(每組信息熵*組內占比)

def gain_entropy(sr, by):
    """計算隨機變量的條件熵、gain.  \n

    參數:
    ----------
    sr: series, 一列明細數據,非統計好的各類別占比  \n
    by: series, 與 sr 等長,條件明細數據。將按 by 取不同的值分組,計算各組內 sr 的熵,再加權求和  \n

    返回值:
    ----------
    gain_entr: float, 變量的熵增益"""

    entr = entropy(sr)

    d = by.distribution().binPct
    cond_entr = pd.Series(index=d.index)
    for i in d.index:
        ei = entropy(sr[by == i])
        cond_entr[i] = ei
    cond_entr = (cond_entr * d).sum()

    return entr - cond_entr

第一個參數是label列,第二個參數是特征列

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM