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

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

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

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

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

 

実行環境はWindows10、Vscode+anaconda3.8.5です。

 

ノック81 : 機械学習で予測するデータを設定しよう

機械学習をおこなう入力データを読み込みます。

seabornライブラリを使用します。

seabornはMatplotlibの機能をより美しく、より簡単に実現するための

可視化用のライブラリです。

タイタニックのデータが用意されているのでこのデータをまずは読み込みます。

 

import seaborn as sns

dataset = sns.load_dataset('titanic')
print(dataset)

 

実行結果

  survived  pclass     sex   age  sibsp  ...  adult_male  deck  embark_town alive  alone
0           0       3    male  22.0      1  ...        True   NaN  Southampton    no  False      
1           1       1  female  38.0      1  ...       False     C    Cherbourg   yes  False      
2           1       3  female  26.0      0  ...       False   NaN  Southampton   yes   True      
3           1       1  female  35.0      1  ...       False     C  Southampton   yes  False      
4           0       3    male  35.0      0  ...        True   NaN  Southampton    no   True      
..        ...     ...     ...   ...    ...  ...         ...   ...          ...   ...    ...      
886         0       2    male  27.0      0  ...        True   NaN  Southampton    no   True      
887         1       1  female  19.0      0  ...       False     B  Southampton   yes   True      
888         0       3  female   NaN      1  ...       False   NaN  Southampton    no  False      
889         1       1    male  26.0      0  ...        True     C    Cherbourg   yes   True      
890         0       3    male  32.0      0  ...        True   NaN   Queenstown    no   True      

[891 rows x 15 columns]

 

891個のデータがあり、データの特長となる項目が15個あることがわかります。

一列データを抽出する場合はpopを使用します。

survivedが1が生き残ったことを表しています。

label = dataset.pop('survived')
print(label)

 

実行結果

0      0
1      1
2      1
3      1
4      0
      ..
886    0
887    1
888    0
889    1
890    0
Name: survived, Length: 891, dtype: int64

 

データはデータフレーム型なので、Survived=1の数をデータからカウントしてみます。

 

su1 = (dataset[dataset['survived'] ==1])
su2 = (dataset['survived'] ==1)

 

su1にはsuvived=1であるdatasetの情報が代入されます。

su2にはsurvived=1だるdatasetのsurvivedの列の情報が代入されます。

 

print(su1)

 

実行結果

     survived  pclass     sex   age  sibsp  ...  adult_male  deck  embark_town alive  alone
1           1       1  female  38.0      1  ...       False     C    Cherbourg   yes  False      
2           1       3  female  26.0      0  ...       False   NaN  Southampton   yes   True      
3           1       1  female  35.0      1  ...       False     C  Southampton   yes  False      
8           1       3  female  27.0      0  ...       False   NaN  Southampton   yes  False      
9           1       2  female  14.0      1  ...       False   NaN    Cherbourg   yes  False      
..        ...     ...     ...   ...    ...  ...         ...   ...          ...   ...    ...      
875         1       3  female  15.0      0  ...       False   NaN    Cherbourg   yes   True      
879         1       1  female  56.0      0  ...       False     C    Cherbourg   yes  False      
880         1       2  female  25.0      0  ...       False   NaN  Southampton   yes  False      
887         1       1  female  19.0      0  ...       False     B  Southampton   yes   True      
889         1       1    male  26.0      0  ...        True     C    Cherbourg   yes   True      

[342 rows x 15 columns]

 

surveved=1(342個)のdatasetの情報が表示されます。

 

print(su2)
print('survived num= ',su2.sum())

 

実行結果

0      False
1       True
2       True
3       True
4      False
       ...
886    False
887     True
888    False
889     True
890    False
Name: survived, Length: 891, dtype: bool
survived num=  342

 

survived=1に対してTrueを返してきます。

Trueの数をsum()でカウントしています。 342個であることがわかります。

 

ノック82 : TrainデータとTestデータに分割しよう

機械学習を行うトレーニング用のデータと、トレーニングしたデータをもとにどれくらいの精度か確認するテスト用のデータを作成します。

今回はシンプルに元データを2分割してそれぞれをTrainデータ、Testデータとしています。

レーニングデータとテストデータの分割にはsklearnのtrain_test_splitを使用します。train_test_splitの引数は以下の通りです。

 

sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

 

arrays:第1引数には入力データを指定します。このデータをトレーニング用のデータとテスト用のデータに分割します。

test_size:テスト用のデータのサイズをしていします。デフォルトは25%です。

train_size:トレーニング用のデータサイズを指定します。デフォルトは75%です。

random_state:トレーニング用のデータとテスト用のデータを分割する際に、データをランダムに抽出します。値を設定することでランダム性に規則性をもたせることができます。random_state=2020とすると、ランダムにデータを振り分けるが、毎回その結果がおなじとなります。random_state=3と任意の別の値を設定すると、データは2020を指定した場合と異なる振り分けになりますが、3を指定し続ける限り振り分けられたデータの中身は同じとなります。

shuffle:Falseに指定するとランダムにデータを振り分けるのではなく上から順番にデータを取得して振り分けます。

stratiry:均等に分割させたいデータ(多くの場合は正解ラベル)を指定すると、そのデータの値の比率が一致するように分割されます。戻り値はトレーニング用のデータ、テスト用のデータとなります。

 

from sklearn.model_selection import train_test_split

label = dataset.pop('survived')
train_ds,test_ds,train_label,test_label=train_test_split(
    dataset,label,random_state=2021,stratify=label)

 

ここではarraysを2つ指定しているので、戻り値も4つとなっています。

test_size、train_sizeは省略していますが、test_size=0.25と記述しても同じ結果となります。

datasetを分割した戻り値はtrain_ds test_ds  です。

labelを分割した戻り値はtrain_label test_label です。

 

print(dataset.shape)
print(train_ds.shape)

 

実行結果

(891, 14)
(668, 14)

 

891個のデータに対して、891x0.75≒668個がトレーニング用に振り分けられています。(14は列の数(説明変数の数)です。survivedをpopしたので15から14になっています。)

 

 

print(label.shape)
print(train_label.shape,test_label.shape)

 

実行結果

(891,)
(668,) (223,)

labelのデータも同様に75:25に分割されていることがわかります。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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