ython 実践 データ加工/可視化 100本ノック」を購入したので、
一通りやっているところです。今日はノック89を行います。
資料は以下から入手できます。
Python実践 データ加工/可視化 100本ノック|サポート|秀和システム
ノック89 : 学習時のサンプル比率を調整しよう
あるデータの件数が1000件、別のデータの件数が100件だった場合に100件のデータの特長が埋もれてしまう可能性があります。
こういったデータの不均衡を調整する方法として、アンダーサンプリングとオーバーサンプリングという2つの手法を実行していきます。
まずデータ件数を確認します。
from sklearn.model_selection import train_test_split
import pandas as pd
label = dataset.pop('survived')
train_ds,test_ds,train_label,test_label=train_test_split(
dataset,label,random_state=2021,stratify=label)
one_hot_encoded = pd.get_dummies(train_ds)
one_hot_encoded = pd.get_dummies(one_hot_encoded,columns=['pclass'])
train_ds = one_hot_encoded
#ノック86
from sklearn.preprocessing import RobustScaler,StandardScaler
age_scaler = StandardScaler()
sibsp_scaler = RobustScaler()
parch_scaler = RobustScaler()
fare_scaler = RobustScaler()
train_ds['age'] = age_scaler .fit_transform(train_ds['age'] .values.reshape(-1,1))
train_ds['sibsp'] = sibsp_scaler.fit_transform(train_ds['sibsp'].values.reshape(-1,1))
train_ds['parch'] = parch_scaler.fit_transform(train_ds['parch'].values.reshape(-1,1))
train_ds['fare'] = fare_scaler .fit_transform(train_ds['fare'] .values.reshape(-1,1))
#ノック88
from sklearn.impute import SimpleImputer
age_imputer = SimpleImputer(strategy='median')
train_ds['age'] = age_imputer.fit_transform(train_ds['age'].values.reshape(-1,1))
#89
実行結果
0 412
1 256
Name: survived, dtype: int64
これに対してアンダーサンプリングを実行します。
from imblearn.under_sampling import RandomUnderSampler
under_sampler = RandomUnderSampler(random_state=2020)
under_sampled_train_ds,under_sampled_train_label=under_sampler.fit_resample(train_ds,train_label)
print(under_sampled_train_ds.shape)
実行結果
(512, 27)
1 256
0 256
Name: survived, dtype: int64
0の数が1の数のほうに合わせられていることがわかります。
オーバーサンプリングを実行してい見ます。
from imblearn.over_sampling import RandomOverSampler
over_sampler = RandomOverSampler(random_state=2020)
over_sampled_train_ds,over_sampled_train_label = over_sampler.fit_resample(train_ds,train_label)
print(over_sampled_train_ds.shape)
実行結果
(824, 27)
1 412
0 412
Name: survived, dtype: int64
データが412に増えていることがわかります。