Python 実践 データ加工/可視化 100本ノック に挑戦 ノック89

ython 実践 データ加工/可視化 100本ノック」を購入したので、

一通りやっているところです。今日はノック89を行います。

資料は以下から入手できます。

Python実践 データ加工/可視化 100本ノック|サポート|秀和システム

 

ノック89 : 学習時のサンプル比率を調整しよう

あるデータの件数が1000件、別のデータの件数が100件だった場合に100件のデータの特長が埋もれてしまう可能性があります。

こういったデータの不均衡を調整する方法として、アンダーサンプリングとオーバーサンプリングという2つの手法を実行していきます。

 

まずデータ件数を確認します。

import seaborn as sns
from sklearn.model_selection import train_test_split
import pandas as pd

dataset = sns.load_dataset('titanic')
label = dataset.pop('survived')

train_ds,test_ds,train_label,test_label=train_test_split(
    dataset,label,random_state=2021,stratify=label)

train_ds.drop(columns=['embark_town','alive'],inplace=True)

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
print(train_label.value_counts())

 

実行結果

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)
print(under_sampled_train_label.value_counts())

 

実行結果

(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)
print(over_sampled_train_label.value_counts())

 

実行結果

(824, 27)
1    412
0    412
Name: survived, dtype: int64

 

データが412に増えていることがわかります。

 

/* -----codeの行番号----- */