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

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

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

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

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

 

ノック86 : 分布に従ってスケーリングをやってみよう

標準化とロバストスケーリングを行います。

標準化はStandardScaler()、ロバストスケーリングはRobasutScaler()というメソッドで作成できます。

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
#ノック84
q = train_ds.quantile([1/4,3/4])
q1,q3 = q.loc[1/4],q.loc[3/4]
iqr=q3-q1
mx = q3+1.5*iqr
mn = q1-1.5*iqr

#ノック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))

import matplotlib.pyplot as plt

fig,axes = plt.subplots(ncols=4,figsize=(15,5))
axes[0].hist(train_ds.age)
axes[1].hist(train_ds.sibsp)
axes[2].hist(train_ds.parch)
axes[3].hist(train_ds.fare)
plt.show()


 

 

実行結果

スケーリング後のデータ分布

 

スケーリング前のデータは、ageは0から80でしたが、-2から3の間の分布に抑えられています。fareも500でしたが20に抑えられています。

以下は、データのスケーリング前のグラフです。

 

スケーリング前データ

 

ノック87 : スケーラーを保存しよう

作成したスケーラーを保存します。拡張子はpkl(Pikle形式という意味です)です。

ディレクトリ(フォルダのこと)を作成し、**.pklというファイル名で保存します。

 

import os
import pickle

os.makedirs('data/scalers',exist_ok=1)

with open('data/scalers/age_scaler.pkl',mode='wb') as f :
    pickle.dump(age_scaler,f)
with open('data/scalers/sibsp_scaler.pkl',mode='wb') as f :
    pickle.dump(sibsp_scaler,f)
with open('data/scalers/parch_scaler.pkl',mode='wb') as f :
    pickle.dump(parch_scaler,f)
with open('data/scalers/fare_scaler.pkl',mode='wb') as f :
    pickle.dump(fare_scaler,f)

 

 

次に作成したpickleファイルを読み込んでスケーリングを実行してみます。

with open('data/scalers/age_scaler.pkl',mode='rb') as f :
    age_sc = pickle.load(f)
test_ds_copy = test_ds.copy()
test_ds_copy['age'] = age_sc.transform(test_ds_copy['age'].values.reshape(-1,1))

print(test_ds_copy.head())

 

実行結果

     pclass     sex       age  sibsp  parch     fare embarked  class    who  adult_male deck  embark_town alive  alone
404       3  female  -0.666020      0      0   8.6625        S  Third  woman       False  NaN  Southampton    no   True
521       3    male  -0.528613      0      0   7.8958        S  Third    man        True  NaN  Southampton    no   True
130       3    male   0.227125      0      0   7.8958        C  Third    man        True  NaN    Cherbourg    no   True
14        3  female  -1.078240      0      0   7.8542        S  Third  child       False  NaN  Southampton    no   True
610       3  female   0.639346      1      5  31.2750        S  Third  woman       False  NaN  Southampton    no  False

 

age列が変換できていることが確認できました。

 

 

 

 

 

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