機械学習 - scikit-learn - データ前処理の正規化と標準化 - 2

scikit-learnの正規化方法を詳しく解説

1. fit_transform メソッド

1. 最大および最小正規化の手動および自動コード比較のデモ 1:

式: (この式はやや誤解を招くものです。つまり、ズーム範囲です。ズームされた feature_range は、マトリックスの最小値と最大値で構成されるマトリックス間隔範囲ではなく [0, 1] であることに注意してください) max = 1 、分 = 0

X std = X − X . 最小 (軸 = 0) X . 最大 (軸 = 0) − X . 最小 (軸 = 0) X_{std}=\frac{X_{}-X_{.}最小(軸=0)} {X_{.}最大(軸=0)-X_{.}最小(軸=0) )}バツs t d=バツ.ma x ( a x i s = 0 ) X.( a x i s = 0 )バツ×.( a x i s = 0 )

X scaled = X std × ( max − min ) + min X_{scaled}=X_{std}\times(max-min)+minバツスケーリング_ _ _ _=バツs t d×(最大x最小)+min、範囲[0,1][0,1][ 0 ,1 ]
X。最大 (軸 = 0) {X_{.}最大 (軸 = 0)}バツ.max ( a x i s _=0 )は最大値の行列
X . min ( axis = 0 ) X_{.} min(axis=0)バツ.( a x i s=0 )は最小値の行列です
max maxmax1
min min最小は 0 に等しい

コードのデモ:

#!/usr/bin/env python
# -*-coding:utf-8-*-
from sklearn.preprocessing import MinMaxScaler
import numpy as np

data = np.array([[4,2,3],
                [1,5,6]])

print("data格式: ",type(data))
# 手动归一化
feature_range = [0,1]  # 要映射的区间
print("每一列的最小值: ",data.min(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最小值
print("每一列的最大值: ",data.max(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最大值
x_std = (data-data.min(axis=0))/(data.max(axis=0)-data.min(axis=0))  # axis 坐标轴 0 ,从上往下,列 ,标准化
x_scaled = x_std*(feature_range[1]-feature_range[0]) + feature_range[0]
print('手动归一化结果:\n{}'.format(x_scaled))

# 自动归一化
scaler = MinMaxScaler()
print('自动归一化结果:\n{}'.format(scaler.fit_transform(data)))

操作結果:
ここに画像の説明を挿入

> 这里 [ 4 ]   算是一列,同理 [ 2 ] [ 3 ]  各自算一列
> 	  [ 1 ]				   [ 5 ] [ 6 ]

1 列目の最小値は 1、2 列目の最小値は 2、3 列目の最小値は 3 であるため、 の値は [1, 2, 3 ] であり、 のdata.min(axis)
同じ方法で、各列が取得されますdata.max(axis)[ 4, 5, 6 ] の最大値

2. 平均正規化の手動コード デモンストレーション:

公式:

X std = X − X 平均 X max − X min X_{std}=\frac{X-X_{mean}}{X_{max}-X_{min}}バツs t d=バツマックス_×X Xミーアン_ _
X scaled = X std × ( max − min ) + min X_{scaled}=X_{std}\times(max-min)+minバツスケーリング_ _ _ _=バツs t d×(最大x最小)+最小、範囲[ − 1 , 1 ] [-1,1][ 1 ,1 ]
X。最大 (軸 = 0) {X_{.}最大 (軸 = 0)}バツ.max ( a x i s _=0 )は最大値の行列
X . min ( axis = 0 ) X_{.} min(axis=0)バツ.( a x i s=0 )は最小値の行列です
max maxmax1
min min最小は -1 に等しい

手動コードのデモ例 1:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import numpy as np

data = np.array([[ 0, -3,  1],
              [ 3,  1,  2],
              [ 0,  1, -1]])
              
print("矩阵: \n",data)
print("data格式: ",type(data))
# 手动归一化
feature_range = [-1,1]  # 要映射的区间
print("每一列的最小值: ",data.min(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最小值
print("每一列的最大值: ",data.max(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最大值
print("每一列的均值: ",data.mean(axis=0))   # axis 坐标轴 0 ,从上往下,每一列的均值
x_std = (data-data.mean(axis=0))/(data.max(axis=0)-data.min(axis=0))  # axis 坐标轴 0 ,从上往下,列 ,标准化
x_scaled = x_std*(feature_range[1]-feature_range[0]) + feature_range[0]
print('手动归一化结果:\n{}'.format(x_scaled))

実行結果 1:
ここに画像の説明を挿入
手動コードのデモ例 2:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import numpy as np

data = np.array([[4,2,3],
                [1,5,6]])
              
print("矩阵: \n",data)
print("data格式: ",type(data))
# 手动归一化
feature_range = [-1,1]  # 要映射的区间
print("每一列的最小值: ",data.min(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最小值
print("每一列的最大值: ",data.max(axis=0))  # axis 坐标轴 0 ,从上往下,每一列的最大值
print("每一列的均值: ",data.mean(axis=0))   # axis 坐标轴 0 ,从上往下,每一列的均值
x_std = (data-data.mean(axis=0))/(data.max(axis=0)-data.min(axis=0))  # axis 坐标轴 0 ,从上往下,列 ,标准化
x_scaled = x_std*(feature_range[1]-feature_range[0]) + feature_range[0]
print('手动归一化结果:\n{}'.format(x_scaled))

実行結果 2:
ここに画像の説明を挿入

3. 10 進数のキャリブレーションと正規化の手動コードのデモ:

公式:

X new = X 1 0 k X_{new}=\frac{X}{10^k}バツ新しい_ _=1 0kX

  • k はXXに依存Xの属性値の最大絶対値
  • 小数スケーリング正規化は、小数点の位置を移動して正規化することです。
  • 小数点を何桁まで移動するかは、XXによって異なります。Xの属性の値のうち最大の絶対値。

ここに○○Xの属性は、
小数スケーリングの正規化は、小数点の位置を移動することにより、データを[ − 1 , 1 ] [-1,1][ 1 ,1 ]または[0,1][0,1][ 0 ,1 ]

手動コードのデモ:

#!/usr/bin/env python
# -*-coding:utf-8-*-

from sklearn import preprocessing
import numpy as np

# 初始化数据
data = np.array([[ 0, -3,  1],
              [ 3,  1,  2],
              [ 0,  1, -1]])

# 小数定标规范化    # 手动归一化
j = np.ceil(np.log10(np.max(abs(data))))  # abs函数返回一个绝对值的矩阵
scaled_data = data/(10**j)  #幂函数运算
print(scaled_data)

abs()この関数は, 行列内のすべてのデータに対して絶対値処理を実行し, 絶対値のみの行列を返すことができます. メソッドは絶対値行列に対して最大値処理を実行して, 行列内の最大値np.max()を見つけます.メソッドは切り上げます.整数を丸める方法ではなく、浮動小数点数を直接削除します。このように、元のデータセットの絶対値の最大値に基づく値、正規化後の新しいデータが式を使用して計算されます。ceil()
k

実行結果:
ここに画像の説明を挿入
参照リンク:
python abs とはどういう意味ですか? abs 関数の用途は何ですか?

Python numpy.log10 の使用法とコード例

numpy_ceil 関数

4. ゼロ平均正規化 (平均除去) 手動および自動コードのデモンストレーション:

公文書

sklearn.preprocessing.scale()関数


sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)

平均を中心とする軸 (軸) に沿ってデータ セットを標準化し、成分を単位として使用します。
分散軸の値は 0 または 1 で、0 は上から下、列は 1 は左から下を表します。右、列

パラメータ データの種類 意義
X {配列のような疎行列} このデータを中心にスケーリングする
axis int (デフォルトでは 0) 軸に沿って、平均と標準偏差が計算されます。0 の場合、各フィーチャを個別に正規化します。1 の場合、各サンプル (行) を正規化します。
with_mean ブール値、デフォルトで True True の場合、スケーリングの前にデータを中央に配置します
with_std ブール値、デフォルトで True True の場合、データを単位分散 (または同等の単位標準偏差) でスケーリングします。
copy ブール値、オプション、デフォルト True False: 行の正規化をインプレースで実行し、コピーを回避します (入力が既に numpy 配列または scipy.sparse CSC 行列であり、軸が 1 の場合 - 行のコピー)

公式:

X new = X − X mean X std X_{new}=\frac{X-X_{mean}}{X_{std}}バツ新しい_ _=バツs t dX Xミーアン_ _、平均 0、分散 1

手動および自動コード比較のデモ:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import numpy as np
from sklearn import preprocessing

data = np.array([[ 0, -3,  1],
              [ 3,  1,  2],
              [ 0,  1, -1]])
print("矩阵: \n",data)
print("data格式: ",type(data))
# 手动归一化
feature_range = [0,1]  # 要映射的区间
print("每一列的均值: ",data.mean(axis=0))   # axis 坐标轴 0 ,从上往下,每一列的均值
print("每一列的方差: ",data.std(axis=0))   # axis 坐标轴 0 ,从上往下,每一列的均值
x_std = (data-data.mean(axis=0))/(data.std(axis=0))  # axis 坐标轴 0 ,从上往下,列 ,标准化

print('手动标准化结果:\n{}'.format(x_std))

data = np.array([[ 0, -3,  1],
              [ 3,  1,  2],
              [ 0,  1, -1]])

# 将数据进行Z-Score规范化   自动标准化
scaled_data = preprocessing.scale(data)
print("自动标准化结果: \n",scaled_data)

操作結果:
ここに画像の説明を挿入

フィットとトランスフォームとは

1. MinMaxScaler 正規化インターフェースの fit 関数

MinMaxScaler のfit関数の公式定義:

Compute the minimum and maximum to be used for later scaling.
翻訳: 特徴スケーリングの最大値と最小値を計算します

つまり、フィット関数を通じて、最初に正規化する必要があるデータセットの最大値と最小値を計算できます.最終的な正規化結果については、申し訳ありませんが、フィット関数はここで終了します.

fitフィット

ここから、実際にはfit、フィッティング関数はデータセットから最も価値のある最大値と最小値fitしか抽出できず、次のステップを実行できないことがわかります-ここで述べたように、正規化または標準化MinMaxScalerモジュールのみは最大および最小の正規化モジュールであり、次に導入されるStandardScaler標準化されたインターフェースのfitフィッティングと区別する必要があります

MinMaxScaler のフィット フィッティング関数コードのデモ:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 创建数组
data_rn = np.random.randint(-10, 10, 10).reshape(5, 2)  # np模块在-10 到 10 的范围内随机抽取10 个数,并且组成 5行 2 列的矩阵
print("矩阵: \n",data_rn)
# 进行归一化
scaler_mmc = MinMaxScaler()
scaler_mmc_fit = scaler_mmc.fit(data_rn)   # 默认 axix=0 按列处理,也就是处理向量
print("提取矩阵中的最大值: ",scaler_mmc_fit.data_max_)  # 最大值
print("提取矩阵中的最小值: ",scaler_mmc_fit.data_min_)  # 最小值
print("提取矩阵中的极差值: ",scaler_mmc_fit.data_range_) # 极差 最大值减最小值,有两列最大最小值,那么就会有两个极差

実行結果:
ここに画像の説明を挿入
各列の最大値と最小値を抽出する. 1 列目の最大値は 5、2 列目の最大値は 3、1 列目の最小値は -8、 2 番目の列の最小値は -4 です。

2. StandardScaler 標準化インターフェースの fit 関数

StandardScalerfit関数の公式定義:

Compute the mean and std to be used for later scaling
変換: 機能スケーリングの平均と標準偏差を計算するモジュールのフィッティング
を使用して、標準化が必要なデータ セットの平均と標準偏差を計算しますStandardScalerfit

StandardScaler のフィット フィッティング関数コードのデモ:

#!/usr/bin/env python
# -*-coding:utf-8-*-
import numpy as np
from sklearn.preprocessing import StandardScaler

# 创建数组
data_rn = np.random.randint(-10, 10, 10).reshape(5, 2)  # np模块在-10 到 10 的范围内随机抽取10 个数,并且组成 5行 2 列的矩阵
print("矩阵: \n",data_rn)
# 进行标准化
scaler_ss = StandardScaler()
scaler_ss_fit = scaler_ss.fit(data_rn)
print("均值: ",scaler_ss_fit.mean_) # 均值,默认对列获取均值
print("方差: ",scaler_ss_fit.var_) # 方差,默认对列获取方差

実行結果:
ここに画像の説明を挿入
列ごとに平均と分散が抽出され、次に平均と分散がそれぞれ 2 つの貴重な平均と分散であることがわかりますfit。 data値データは、後で他のデータ前処理操作の準備をするために出てきます。

フィットの使用法を要約する
と、簡単に言えば、データセットの平均、分散、最大値、最小値などの固有の属性を取得することであり、しばしばtransform組み合わせて

アルゴリズム モデルの観点から、fitフィッティング プロセスはトレーニング プロセスとして理解できます。

transform および fit_transform 関数の理解

公式ドキュメントからの定義:

MinMaxScaler:feature_range に従って X の機能をスケーリングします。
StandardScaler:センタリングとスケーリングによる標準化を行う

翻訳:

MinMaxScaler: ○○feature_rangeよるXのスケーリング
StandardScaler: センタリングとスケーリングによる標準化
つまり、実際には実際に正規化と標準化を行う関数transformでありfitフィッティング関数は前準備作業にすぎません。

アルゴリズム モデルの観点からは、変換プロセスは変換プロセスとして理解できます。
使用法も非常に簡単で、以前に適合したデータ セットを直接操作できます。

# 归一化
scaler_mmc = MinMaxScaler()
scaler_mmc_fit = scaler_mmc.fit(data_rn)   # 默认 axix=0 按列处理,也就是处理向量
scaler_mmc_result = scaler_mmc.transform(data_rn)
# 标准化
scaler_ss = StandardScaler()
scaler_ss_fit = scaler_ss.fit(data_rn)
scaler_ss_result = scaler_ss.transform(data_rn)  

最終結果は、fit_transform直接の。たった今:

fit + transform = fit_transform

つまり、fit_transformfittransformの組み合わせです。プロセス全体には、トレーニングと変換の両方が含まれます。fit_transform
最初にデータを適合させfit、データの全体的な指標 (平均、分散、最大値、最小値など) を見つけてから、データを変換します。transformデータを達成するための設定 標準化および正規化操作

プロジェクトで使用されるスキル - fit_transform および transform

fit と transform の使用法を理解したら、プロジェクトで使用されるヒントを学習できます。

プロジェクトのデータセットは、一般的にトレーニングセットとテストセットに分けられ、トレーニングセットはモデルのトレーニングに使用され、テストセットはモデルの効果を検証するために使用されます。

トレーニングされたモデルがテスト セットでも良いスコアを達成できる場合、トレーニング セットとテスト セットのデータ分布が同じであることを確認するだけでなく、それらに対して同じデータ前処理操作を実行することも必要です。例: 標準化と正規化。

したがって、一般的に、データセットの処理では、トレーニング セットを直接フィッティング + 変換し、次にテスト セットを直接変換します。

トレーニング セットがフィッティングに使用され、トレーニング セットとテスト セットがフィッティングされた "モデル" で変換されることに注意してください。このロジックを理解する必要があります。!

MinMaxScalerインターフェイス コードのデモ:

from sklearn.preprocessing import MinMaxScaler 

scaler_mmc = MinMaxScaler()
# 训练集操作
new_train_x = scaler_mmc.fit_transform(train_x)
# 测试集操作
new_test_x = scaler_mmc.tranform(test_x)

StandardScalerインターフェイス コードのデモ:

from sklearn.preprocessing import StandardScaler

scaler_ss = StandardScaler()
# 训练集操作
new_train_x = scaler_ss.fit_transform(train_x)
# 测试集操作
new_test_x = scaler_ss.tranform(test_x)

気をつけて、気をつけて、気をつけて:
It cannot be used for both the training set and the test set fit_transform. テスト セットは正常に変換 (正規化または標準化) できますが、2 つの結果は同じ基準ではなく、明らかな違いがあります。

要約:

  1. 機械学習で問題を解決するとき、データセットは次のように分割されますトレーニングセットテストセット
  2. メソッドを使用してfit_transform()最初にトレーニング セットを処理し、次にtransform()メソッドを使用してテスト セットを処理できます。このとき、テスト セットを正規化するときに、トレーニング セットの統計を使用して、トレーニング セットとテスト セットをより類似させます。2つのアルゴリズムのパフォーマンスを可能な限り類似させます(これは、fit_transform()メソッドを使用した後、fit()メソッドを、transform()メソッドを使用する必要fit()がない意味します。fit_transform()メソッドはfit()後にためです)transform()メソッドで使用するためのトレーニング セット);
  3. メソッドがテスト セットで使用される場合fit_transform()、データはテスト セット自体の統計で正規化されます。テスト セットでこれら 2 つの方法を混在させないでください. テスト セットでこの方法を使用するとfit_transform()、テスト セットでの損失は常に検証セットでの損失よりもはるかに大きくなります。
  4. fit()言うまでもない別の方法があります。これfit_transform()は最も簡単で、and と同じですが、後者は変換された結果を返しますが、前者は返さず、コンバーターをトレーニングするだけです。
  5. まず、fit_transformの、最初に分解しfit、次に を分解するtransformと、fit最終結果にデータの分布が含まれます。
  6. データ分布を気にせず、最終結果のみを気にする場合は、 fit_transform1 つのステップ。
  7. 次に、プロジェクト内のトレーニング データとテスト データの変換には同じ標準を使用する必要があります。別々に変換しないように注意してくださいfit_transform

参考リンク:

データ処理では、fit、transform、fit_transform の違いさえわかりませんか?

sklearn での transform() と fit_transform() の深い理解

python numpy は標準偏差、分散を実装します

[機械学習] データの正規化 - MinMaxScaler の理解

2. normalize() メソッド

正規化メソッドのパラメーター:

sklearn.preprocessing.normalize(X, norm='l2', *, axis=1, copy=True, return_norm=False)

XXX : 正規化されるデータ
ノルム ノルムn or m : { }、ノルムを指定、 ‘l1’, ‘l2’, ‘max’デフォルトは行列の 2 ノルムです。l2、しかし一般的に言えば、一般的に使用される行列の 1 ノルム、つまりl1ノルムl1正規化されます。各データをl1ノルム (すべてのデータ列の絶対値の合計の最大値)で割ったもの
maxが無限ノルムです。行列の∣ ∣ A ∣ ∣ ∝ ||A||_{\propto}∣∣

この方法は、フィーチャの基本的な性質によってデータ ポイントに大きな違いがないことを確認するためによく使用されます。つまり、データが同じ大きさのオーダーであることを確認し、異なるフィーチャ データの比較可能性を向上させます。 .

軸 軸a x i s : 軸。デフォルトは軸 = 1 です。つまり、計算はサンプルの行によって実行され、軸はデータの正規化に使用されます。1 の場合、各サンプルを個別に正規化します。それ以外の場合 (0 の場合)、各特徴、つまり特徴ベクトルを正規化します。

コピー コピーコピー:bool、default = True

一般的なアイデアの参照リンク:

scikit-learn初心者

おすすめ

転載: blog.csdn.net/qq_42701659/article/details/124478468