LoginSignup
0
1

More than 5 years have passed since last update.

【自分用】Gini不純度計算関数

Last updated at Posted at 2018-10-23

pythonの練習用に試しに作ってみた。

参考にしたのは「はじパタ」ここ

1列目に「分割したい指標」
2列目に「True/False」
の形をしたdataFrameと、行数を入れる事で計算してくれる。

※検算はしていない

qiita.py

def giniImpurity(df, row_num):
    '''
    Input: A Nx2 dimensional dataframe, row_number (= threshhold value)
    Output: Gini Coefficient
    '''
    # 事前準備
    col_name = df.columns
    N = len(df)

    # スレッシュホールドで2分割
    g1 = df.iloc[:row_num, :]
    g2 = df.iloc[row_num:, :]

    leng1 = len(g1)
    leng2 = len(g2)

    # Gini係数の計算
    if len(g1) == 0:
        g1 = 0
    else:
        g1Y = len(g1.loc[g1[col_name[1]]==True])
        g1N = len(g1.loc[g1[col_name[1]]==False])
        g1 = 1 - ((g1Y/len(g1))**2 + (g1N/len(g1))**2)  # g1[0] = False

    if len(g2) == 0:
        g2 = 0
    else:
        g2Y = len(g2.loc[g2[col_name[1]]==True])
        g2N = len(g2.loc[g2[col_name[1]]==False])
        g2 = 1 - ((g2Y/len(g2))**2 + (g2N/len(g2))**2)  # g1[0] = False

    if g1 == 0:
        GiniImpurity = (leng2/N)*g2
    elif g2 == 0:
        GiniImpurity = (leng1/N)*g1
    else:
        GiniImpurity = (leng1/N)*g1 + (leng2/N)*g2

    return GiniImpurity

使い方

全ての値(=分割点)をfor-loopで計算してリストGIに格納する。
事前にdfをソートしておくことと、インデックスをリセットしておくことが必要。

qiita.py
df.reset_index(drop=True, inplace=True)
df.sort_values(df.columns[0], inplace=True)

GI = []
for i in range(len(df)):
    gi = giniImpurity(df, i)
    GI.append(gi)

GI = pd.DataFrame(GI)
GI.columns = ['GiniImpurity']

df = pd.concat([df, GI], axis=1)
df.head()

式が間違ってるよ!とかあったらコメ下さい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1