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()
式が間違ってるよ!とかあったらコメ下さい。