Machine-learning-with-python-understanding-data-with-statistics

提供:Dev Guides
移動先:案内検索

ML-統計を使用したデータの理解

前書き

機械学習プロジェクトでの作業中、通常、 _ mathematics_ および data と呼ばれる2つの最も重要な部分を無視します。 MLはデータ駆動型のアプローチであり、MLモデルが提供するデータと同じくらい良い結果か悪い結果しか生成しないためです。

前の章では、CSVデータをMLプロジェクトにアップロードする方法について説明しましたが、アップロードする前にデータを理解しておくとよいでしょう。 統計と視覚化の2つの方法でデータを理解できます。

この章では、Pythonのレシピに従うことで、MLデータと統計を理解します。

生データを見る

最初のレシピは、生データを見るためのものです。 生データを見ることで得られる洞察は、MLプロジェクトのデータの処理だけでなく、前処理を改善する可能性を高めるため、生データを見ることが重要です。

以下は、Pima Indians糖尿病データセットでPandas DataFrameのhead()関数を使用して実装されたPythonスクリプトで、最初の50行を見て理解を深めます-

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
print(data.head(50))

出力

preg plas  pres skin test   mass pedi   age      class
0     6    148  72   35     0    33.6   0.627    50     1
1     1     85  66   29     0    26.6   0.351    31     0
2     8    183  64    0     0    23.3   0.672    32     1
3     1     89  66   23    94    28.1   0.167    21     0
4     0    137  40   35   168    43.1   2.288    33     1
5     5    116  74    0     0    25.6   0.201    30     0
6     3     78  50   32    88    31.0   0.248    26     1
7    10    115   0    0     0    35.3   0.134    29     0
8     2    197  70   45   543    30.5   0.158    53     1
9     8    125  96    0     0     0.0   0.232    54     1
10    4    110  92    0     0    37.6   0.191    30     0
11   10    168  74    0     0    38.0   0.537    34     1
12   10    139  80    0     0    27.1   1.441    57     0
13    1    189  60   23   846    30.1   0.398    59     1
14    5    166  72   19   175    25.8   0.587    51     1
15    7    100   0    0     0    30.0   0.484    32     1
16    0    118  84   47   230    45.8   0.551    31     1
17    7    107  74    0     0    29.6   0.254    31     1
18    1    103  30   38    83    43.3   0.183    33     0
19    1    115  70   30    96    34.6   0.529    32     1
20    3    126  88   41   235    39.3   0.704    27     0
21    8     99  84    0     0    35.4   0.388    50     0
22    7    196  90    0     0    39.8   0.451    41     1
23    9    119  80   35     0    29.0   0.263    29     1
24   11    143  94   33   146    36.6   0.254    51     1
25   10    125  70   26   115    31.1   0.205    41     1
26    7    147  76    0     0    39.4   0.257    43     1
27    1     97  66   15   140    23.2   0.487    22     0
28   13    145  82   19   110    22.2   0.245    57     0
29    5    117  92    0     0    34.1   0.337    38     0
30    5    109  75   26     0    36.0   0.546    60     0
31    3    158  76   36   245    31.6   0.851    28     1
32    3     88  58   11    54    24.8   0.267    22     0
33    6     92  92    0     0    19.9   0.188    28     0
34   10    122  78   31     0    27.6   0.512    45     0
35    4    103  60   33   192    24.0   0.966    33     0
36   11    138  76    0     0    33.2   0.420    35     0
37    9    102  76   37     0    32.9   0.665    46     1
38    2     90  68   42     0    38.2   0.503    27     1
39    4    111  72   47   207    37.1   1.390    56     1
40    3    180  64   25    70    34.0   0.271    26     0
41    7    133  84    0     0    40.2   0.696    37     0
42    7    106  92   18     0    22.7   0.235    48     0
43    9    171 110   24   240    45.4   0.721    54     1
44    7    159  64    0     0    27.4   0.294    40     0
45    0    180  66   39     0    42.0   1.893    25     1
46    1    146  56    0     0    29.7   0.564    29     0
47    2     71  70   27     0    28.0   0.586    22     0
48    7    103  66   32     0    39.1   0.344    31     1
49    7    105   0    0     0    0.0    0.305    24     0

上記の出力から、最初の列が行番号を示していることがわかります。これは特定の観測を参照するのに非常に役立ちます。

データの次元の確認

MLプロジェクトで使用している行と列のデータ量を知ることは常に良い習慣です。 背後にある理由は-

  • 行と列が多すぎる場合、アルゴリズムの実行とモデルのトレーニングに時間がかかると仮定します。
  • 行と列が少なすぎると、モデルを適切にトレーニングするのに十分なデータがないと仮定します。

以下は、Pandas Data Frameのshapeプロパティを印刷することによって実装されたPythonスクリプトです。 その中の行と列の総数を取得するために、虹彩データセットに実装します。

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)

出力

(150, 4)

出力から、使用するアヤメのデータセットが150行4列であることが簡単にわかります。

各属性のデータ型の取得

各属性のデータ型を知ることは、別の良い習慣です。 その理由は、要件に従って、あるデータ型を別のデータ型に変換する必要がある場合があるためです。 たとえば、カテゴリ値または順序値を表すために、文字列を浮動小数点または整数に変換する必要がある場合があります。 生データを見ると、属性のデータ型について知ることができますが、別の方法は、Pandas DataFrameの_dtypes_プロパティを使用することです _dtypes_プロパティの助けを借りて、各属性のデータ型を分類できます。 それは、次のPythonスクリプトの助けを借りて理解することができます-

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)

出力

sepal_length   float64
sepal_width    float64
petal_length   float64
petal_width    float64
dtype: object

上記の出力から、各属性のデータ型を簡単に取得できます。

データの統計的要約

形状を取得するためのPythonレシピについて説明しました。 データの行と列の数ですが、そのデータの形状から概要を確認する必要がある場合が多くあります。 それは、Pandas DataFrameの_describe()_関数の助けを借りて行うことができます。これは、各データ属性のすべての次の8つの統計プロパティを提供します-

  • カウント
  • Mean
  • 標準偏差
  • 最小値
  • 最大値
  • 25%
  • 中央値、つまり 50%
  • 75%

from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
print(data.shape)
print(data.describe())

出力

(768, 9)
       preg     plas     pres    skin     test     mass     pedi     age      class
count  768.00   768.00   768.00  768.00   768.00   768.00   768.00   768.00   768.00
mean     3.85   120.89    69.11   20.54    79.80    31.99     0.47    33.24     0.35
std      3.37    31.97    19.36   15.95   115.24     7.88     0.33    11.76     0.48
min      0.00     0.00     0.00    0.00     0.00     0.00     0.08    21.00     0.00
25%      1.00    99.00    62.00    0.00     0.00    27.30     0.24    24.00     0.00
50%      3.00   117.00    72.00   23.00    30.50    32.00     0.37    29.00     0.00
75%      6.00   140.25    80.00   32.00   127.25    36.60     0.63    41.00     1.00
max     17.00   199.00   122.00   99.00   846.00    67.10     2.42    81.00     1.00

上記の出力から、Pima Indian Diabetesデータセットのデータの統計的要約をデータの形状とともに観察できます。

クラス分布の確認

クラス分布統計は、クラス値のバランスを知る必要がある分類問題で役立ちます。 クラス値の分布を知ることは重要です。なぜなら、クラス分布が非常に不均衡な場合、つまり 1つのクラスが他のクラスよりも多くの観測値を持っている場合、MLプロジェクトのデータ準備段階で特別な処理が必要になる場合があります。 Pandas DataFrameの助けを借りて、Pythonでクラス分布を簡単に取得できます。

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
count_class = data.groupby('class').size()
print(count_class)

出力

Class
0 500
1 268
dtype: int64

上記の出力から、クラス0の観測値の数はクラス1の観測値の数のほぼ2倍であることが明確にわかります。

属性間の相関の確認

2つの変数間の関係は相関と呼ばれます。 統計では、相関を計算するための最も一般的な方法は、ピアソンの相関係数です。 次のように3つの値を持つことができます-

  • *係数値= 1 *-変数間の完全な*正の*相関を表します。
  • *係数値= -1 *-変数間の完全な*負*相関を表します。
  • *係数値= 0 *-変数間の相関がまったくないことを表します。

高度に相関する属性がある場合、線形回帰やロジスティック回帰などの一部の機械学習アルゴリズムのパフォーマンスが低下するため、データセットの属性のペアワイズ相関をMLプロジェクトに使用する前に確認することは常に有効です。 Pythonでは、Pandas DataFrameの_corr()_関数を使用して、データセット属性の相関行列を簡単に計算できます。

from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
correlations = data.corr(method='pearson')
print(correlations)

出力

preg   plas   pres   skin   test    mass    pedi    age    class
preg   1.00   0.13   0.14  -0.08   -0.07    0.02   -0.03   0.54    0.22
plas   0.13   1.00   0.15   0.06    0.33    0.22    0.14   0.26    0.47
pres   0.14   0.15   1.00   0.21    0.09    0.28    0.04   0.24    0.07
skin  -0.08   0.06   0.21   1.00    0.44    0.39    0.18  -0.11    0.07
test  -0.07   0.33   0.09   0.44    1.00    0.20    0.19  -0.04    0.13
mass   0.02   0.22   0.28   0.39    0.20    1.00    0.14   0.04    0.29
pedi  -0.03   0.14   0.04   0.18    0.19    0.14    1.00   0.03    0.17
age    0.54   0.26   0.24  -0.11   -0.04    0.04    0.03   1.00    0.24
class  0.22   0.47   0.07   0.07    0.13    0.29    0.17   0.24    1.00

上記の出力のマトリックスは、データセット内の属性のすべてのペア間の相関関係を示しています。

属性分布のスキューの確認

歪度は、ガウス分布であると想定されるが、ある方向または別の方向、または左または右のいずれかに歪んだりシフトしたように見える分布として定義できます。 属性の歪度を確認することは、次の理由により重要なタスクの1つです-

  • モデルの精度を高めるために、データに歪みが存在する場合は、データ準備段階での修正が必要です。
  • ほとんどのMLアルゴリズムは、データがガウス分布を持っていることを前提としています。 通常のベル曲線データ。

Pythonでは、Pandas DataFrameで* skew()*関数を使用して、各属性のスキューを簡単に計算できます。

from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
print(data.skew())

出力

preg   0.90
plas   0.17
pres  -1.84
skin   0.11
test   2.27
mass  -0.43
pedi   1.92
age    1.13
class  0.64
dtype: float64

上記の出力から、正または負のスキューが観察できます。 値がゼロに近い場合、スキューは少なくなります。