<jupyter_start><jupyter_text>6.3 クラスの分布が偏っている場合分類ラベルの分布が偏っている場合の対処法 アンダーサンプリング例えば異常検知など正例が異常に少ない場合、負例の一部のみを使用してモデルを学習させる方法。  また、異なる負例を取り出して学習させた複数のモデルを平均する手法 (バギング) も有効。  [`imbalanced-learn`](https://imbalanced-learn.org/stable/) というライブラリを使える。(参考: [LightGBMでdownsampling+bagging](https://upura.hatenablog.com/entry/2019/01/12/193000))kaggle の [TalkingData AdTracking Fraud Detection Challenge](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection) というコンペでは、1 億件以上のデータのうち正例は 0.2 % 程度であり、1 位の解法はほとんどの負例を捨てて精度を出していた。<jupyter_code># ---------------------------------
# データ等の準備
# ----------------------------------
import numpy as np
import pandas as pd

# train_x は学習データ、train_y は目的変数、test_x はテストデータ
train = pd.read_csv('../input/sample-data/train_preprocessed_onehot.csv')
train_x = train.drop(['target'], axis=1)
train_y = train['target']
test_x = pd.read_csv('../input/sample-data/test_preprocessed_onehot.csv')

# downsampling
# 正例の数と負例の数を揃える
from imblearn.under_sampling import RandomUnderSampler

sampler = RandomUnderSampler(random_state=42)
x_resampled, y_resampled = sampler.fit_resample(train_x, train_y)
print(len(train[train['target']==1])*2, len(x_resampled))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17535153019023986, 'fraction_numerical': 0.0206782464846981, 'mean_word_length': 5.4361702127659575, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '353010', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 643, 'n_tokens_neox': 606, 'n_words': 56, 'path': 'ch06/06-03.ipynb', 'repo_name': 'aiskay/kaggle-book', 'size': '1209'}