pandas アンダーサンプリング

pandas アンダーサンプリング

アンダーサンプリング

データを二値判別するときなど学習データに偏りがある場合。
例えば以下の表のようなデータから「神」と「モンスター」を判別したい場合。
正例(神)と不例(モンスター)の不均衡を均すためにアンダーサンプリングを行うことがある。

TypeNameLevelATKDEF
モンスター岩石の巨兵413002000
モンスタークリボー1300200
ラーの翼神竜1000
モンスター炎の剣士518001600
モンスターマンモスの墓場31200800
モンスター時の魔術師2500400
オベリスクの巨神兵1040004000
モンスター逆転の女神618002000

本当はラーの攻守は「?」

関数を作った

これ↓

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
import numpy as np

# under_sampling(data, column_name, low_data_name, ratio)
# data 対象のデータフレーム
# column_name 対象の列の名前
# low_data_name 対象の正例の名前
# ratio 正例に対する負例の割合(デフォルト= 1)
def under_sampling(data, column_name, low_data_name, ratio=1):
# column_name が low_data_nameの行を取得
low_data = data[data[column_name] == low_data_name]

# それ以外データの行インデックス取得
high_data_index = data[data[column_name] != low_data_name].index

# それ以外データの行インデックスから、(low_dataと同じ数 * ratio )個の行インデックスをランダム取得
new_high_data_index = np.random.choice(high_data_index, len(low_data) * ratio, replace=False)

# 抽出した行インデックスのデータを取得
high_data = data.loc[new_high_data_index]

# データを融合
merged_data = pd.concat([high_data, low_data], ignore_index=True)
return merged_data

さっきの表のデータフレームを準備。

1
2
3
4
5
6
7
df = pd.DataFrame(
{'Type': ['モンスター', 'モンスター', '神', 'モンスター', 'モンスター', 'モンスター', '神', 'モンスター'],
'Name': ['岩石の巨兵', 'クリボー', 'ラーの翼神竜', '炎の剣士', 'マンモスの墓場', '時の魔術師','オベリスクの巨神兵', '逆転の女神'],
'Level': [4, 1, 10, 5, 3, 2, 10, 6 ],
'ATK': [1300, 300, 0, 1800, 1200, 500, 4000, 1800],
'DEF': [2000, 200, 0, 1600, 800, 400, 4000, 2000]}
)

使う。

1
2
df = under_sampling(df, "Type", "神", 1)
print(df)

こうなる。



完成。

こんなものを作らずとも「imbalanced-learn」ってのがあるらしい。
また車輪を作ってしまった。

https://imbalanced-learn.readthedocs.io/en/stable/

タグ ,

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×