分かりやすく解説:データ前処理の正規化(Pythonコードで)

テクニカルQ&A

この記事は、技術グループの友人の共有からのものです. 参加したい場合, 以下の手順に従ってください

現在、技術交流グループが開設されており、グループには3,000人以上の人がいます.追加するときの最良の発言方法は、ソース+興味の方向であり、志を同じくする友人を見つけるのに便利です.

方法①、WeChat ID追加:dkl88191、備考:CSDN+技術交流から
方法②、WeChat検索公開番号:Python学習とデータマイニング、バックグラウンド返信:グループ追加+CSDN

1. なぜデータの前処理を行うのですか?

  • 収集された膨大なデータは、取得した直後に使用できないことが多く、たとえば、値が大きいデータは計算量が多く、収束しにくく、統計処理が困難です。

  • データは正規分布に従っておらず、正規分布に従う一部の数学的分析は実行できません。

したがって、データをより有効に活用するには、データを標準化する必要があります。

2. データの標準化

データの無次元処理は、主にデータの比較可能性を解決します。データの正規化には多くの方法があり、一般的に使用されるのは、「最小最大正規化」、「Z スコア正規化」、および「小数スケール正規化」です。

上記の標準化プロセスの後、元のデータは無次元の指標評価値に変換されます。つまり、各指標値は同じレベルの大きさであり、包括的な評価と分析を実行できます。ここでは、データを [0,1] 間隔に一様にマッピングする、最も一般的に使用されるデータ正規化処理に焦点を当てます。

1. 正規化された目標

1. データを (0,1) 区間の 10 進数に変換する方法は、主にデータ処理の便宜のために提案されています. データを 0 から 1 の範囲にマッピングして処理する方が便利で高速です.

2. 次元式を無次元式に変更して、データの比較可能性を解決します。

2.正規化の利点

1. 正規化後、最適解を見つけるための勾配降下の速度が加速されます. 機械学習モデルが勾配降下法を使用して最適解を見つける場合、正規化が非常に必要になることがよくあります.収束します。

2. 正規化により精度が向上する可能性があります。一部の分類器では、KNN などのサンプル間の距離 (ユークリッド距離など) を計算する必要があります。特徴範囲の範囲が非常に大きい場合、距離計算は主にこの特徴に依存し、実際の状況に反します (たとえば、実際の状況では、範囲範囲が狭い特徴がより重要になります)。

3.正規化を必要としないアルゴリズムはどれですか

確率モデル (ツリー モデル) は、変数の値を気にせず、変数の分布と変数間の条件付き確率 (意思決定ツリー、RF など) を気にするため、正規化を必要としません。また、Adaboost、SVM、LR、Knn、KMeans などの最適化問題には、正規化が必要です。

三、データの正規化方法

1.最小最大正規化

特徴ベクトルの各データをトラバースすることにより、Max と Min が記録され、データは Max-Min をベースとして使用して正規化されます (つまり、Min=0、Max=1): ここで、Max はサンプル データ値の最大値です。 、Min はサンプル データの最小値です。

def MaxMinNormalization(x,Max,Min):
 
    x = (x - Min) / (Max - Min);
 
    return x;

numpy で np.max() と np.min() を使用して、最大値と最小値を見つけます。この正規化方法は、数値比較の場合により適しています。この方法には欠点があり、max と min が不安定な場合、正規化の結果が不安定になりやすく、その後の使用効果も不安定になります。実際の使用では、最大値と最小値を経験的な定数値に置き換えることができます。

ps: データを [a,b] 間隔範囲に正規化する方法:

(1) まず、元のサンプル データ X の最小値 Min と最大値 Max を見つけます
(2) 係数を計算します: k=(ba)/(Max-Min)
(3) [a, b] interval : Y=a+k(X-Min) または Y=b+k(X-Max)

2. Z スコアの正規化

最も一般的な標準化方法は Z 標準化であり、これは SPSS で最も一般的に使用される標準化方法でもあります.spss のデフォルトの標準化方法は z スコア標準化です.

標準偏差標準化とも呼ばれるこの方法は、データを標準化するために元のデータの平均と標準偏差を求めます。

def  Z_ScoreNormalization(x,mu,sigma):
 
    x = (x - mu) / sigma;
 
    return x;

numpyの mean 関数と std 関数、およびsklearnが提供するStandardScalerメソッドは、平均と標準偏差の両方を取得できます。標準化された変数値は 0 付近で変動し、0 より大きい場合は平均を上回っていることを意味し、0 未満は平均を下回っていることを意味します。

以下では、 numpyを使用して行列の標準偏差標準化を実現しています。

numpy を np としてインポート

x_np = np.array([[1.5, -1., 2.],
[2., 0., 0.]])
mean = np.mean(x_np, axis=0)
std = np.std(x_np, axis=0)
print('行列の初期値: {}'.format(x_np))
print('行列の平均値: {}\n 行列の標準偏差: {}' .format(mean,std ))
another_trans_data = x_np - 平均
another_trans_data = another_trans_data / std
print('標準偏差正規化行列: {}'.format(another_trans_data))

行列の初期値: [[ 1.5 -1. 2. ]
[ 2. 0. 0. ]]
行列の平均値: [ 1.75 -0.5 1. ]
行列の標準偏差: [ 0.25 0.5 1. ]
標準 差分の正規化された行列は [[-1. -1. 1.]
[ 1. 1. -1.]] です。

以下では、sklearn が提供する StandardScaler メソッドを使用します。

from sklearn.preprocessing import StandardScaler # 標準化ツール
import numpy as np

x_np = np.array([[1.5, -1., 2.],
[2., 0., 0.]]) scaler
= StandardScaler()
x_train = scaler.fit_transform(x_np)
print('の初期値マトリックス:{}'.format(x_np))
print('このマトリックスの平均: {}\n このマトリックスの標準偏差: {}'.format(scaler.mean_,np.sqrt(scaler .var_)))
print('標準偏差の標準化されたマトリックス: {}'.format(x_train))

行列の初期値: [[ 1.5 -1. 2. ]
[ 2. 0. 0. ]]
行列の平均値: [ 1.75 -0.5 1. ]
行列の標準偏差: [ 0.25 0.5 1. ]
標準 差分の正規化された行列は [[-1. -1. 1.]
[ 1. 1. -1.]] です。

sklearn の標準化ツールがインスタンス化後に 2 つの属性を持つことを確認するには、1 つは mean_ (平均) で、もう 1 つは var_ (分散) です。最終的な結果は、numpy を使用した場合と同じです。

zスコア正規化データの標準偏差が1なのはなぜですか?

x-μ は平均を変えるだけで、標準偏差は変わらないので平均は 0 になります; (x-μ)/σ は標準偏差を σ 倍で割るだけなので、標準偏差は 1 になります。

3.シグモイド関数:

シグモイド関数は、S 字型の曲線を持つ関数であり、優れたしきい値関数です. (0, 0.5) で中心対称であり、(0, 0.5) の周りで比較的大きな勾配を持ち、データが正の無限大になる傾向がある場合および負の無限大 の場合、マッピングされた値は無限に 1 と 0 になる傾向があります。式の変更に応じて, セグメンテーションしきい値を変更できます. ここでは正規化方法として, セグメンテーションしきい値として (0, 0.5) の場合のみを考慮します:

from matplotlib import pyplot as plt
import numpy as np
import math


def sigmoid_function(z):
    fz = []
    for num in z:
        fz.append(1 / (1 + math.exp(-num)))
    return fz


if __name__ == '__main__':
    z = np.arange(-10, 10, 0.01)
    fz = sigmoid_function(z)
    plt.title('Sigmoid Function')
    plt.xlabel('z')
    plt.ylabel('σ(z)')
    plt.plot(z, fz)
    plt.show()

要約する

主なことは、機械学習でsklearnが提供するStandardScalerメソッドの後にデータ標準化の概念を発見し、フリードマン テストをさらに理解することです。

おすすめ

転載: blog.csdn.net/m0_59596937/article/details/127181149