MinMax vs Standard vs Robust:三种特征缩放怎么选 – wang_yb

MinMax vs Standard vs Robust:三种特征缩放怎么选 – wang_yb


多くの人は、特徴エンジニアリングを行うときに、一連の固定アクションを持っています。StandardScaler それから fit_transform。 (つまり、最初にデータを標準化してからモデルをトレーニングします)

これは教科書のデータセットでは問題ありませんが、注文金額、ページ滞在時間、インターフェイス時間などの実際のデータは、ほぼ自然に右に偏っており、常にいくつかの法外な値が混在しています。

StandardScaler 平均値と標準偏差を定規として使用すると、これら 2 つの数値自体が極値によって偏ることになります。あなたは標準化を行ったと思っていますが、実際には正常なサンプルの区別を減らしています。

この記事では、注文金額データを使用して、一般的に使用される 3 つのフィーチャ スケーラー (MinMax、標準、ロバスト) を 1 つずつ実行し、それぞれがどのようなデータに変換されるかを確認し、最後にプロジェクトに直接コピーできる一連の選択ルールを提供します。

まず一つはっきりさせておきたいのは、スケーリングしても分布形状は変わりません右バイアスまたは右バイアス、ロングテールまたはロングテール。変換 (位置の変更) とストレッチ (スケールの変更) のみを実行します。

では、なぜズームするのでしょうか?モデルは単位ではなく数値を参照するためです。

テーブルには注文金額 (0 ~ 200) と注文数 (1 ~ 5) の両方が含まれます。 KNN、SVM、規則的な項を持つ線形モデル、およびニューラル ネットワークの場合、量の特徴は当然ながら「大きく」なります。

スケーリングとは、すべての機能を同じスタートラインに置くことです。

これは単なる変換とストレッチなので、3 つのスケーラーの唯一の違いは、どの 2 つの数値をルーラーとして使用するかという 1 つの質問だけです。

MinMax vs Standard vs Robust:三种特征缩放怎么选 – wang_yb

結論はすでに絵の中に隠されています。

  1. MinMax 大きな注文がある場合、データの両端にある 2 本の基準線は大きく移動する必要があります。
  2. Standard 平均値と標準偏差はサンプル全体に基づいて計算され、もちろん極値も含まれます。
  3. Robust 2 つの行はデータの中央半分から取られたもので、右側で起こっていることは影響しません。

一文で言うと:極値に近い人は、誤った方向に導かれる可能性が高くなります。

合成データを使用してパラメータを制御し、結果を再現できます。

店舗の注文額をシミュレーションしてみると、通常の小売注文800件(50元前後に集中)+小規模ロングテール注文800件(一括注文、イベント価格、当然右偏り)+180~210元のグループ購買注文5件で、わずか0.3%だが、金額は通常注文の3~4倍となる。

np.random.seed(42)
normal_orders = np.random.normal(50, 15, 800)          # 普通零售单
long_tail = np.random.exponential(2, 800) * 10 + 20    # 小额长尾单
amount = np.concatenate([normal_orders, long_tail, [200, 180, 190, 210, 195]])

スケーリングの前に身体検査を行ってください。このステップは省略できません。

x = df["amount"]
print(f"均值 {x.mean():.2f} 中位数 {x.median():.2f} 标准差 {x.std():.2f}")
print(f"偏度 {stats.skew(x):.2f} 范围 {x.min():.1f} ~ {x.max():.1f}")
均值 45.65 中位数 42.81 标准差 20.52
偏度 2.07 范围 1.4 ~ 210.0

これらの数字は一緒に読む必要があります。

平均値が中央値よりも大きい右側に長い尾があることを示します。

歪度 2.07 この問題を定量化します (1 よりはるかに大きい場合は、強い右バイアスです)。

この範囲には 3 番目の情報が隠されています。つまり、最大値 210 は、ほとんどの注文、つまり 5 つのグループ購入注文よりも 1 桁高い値です。

最もよく使用されるものを最初に実行します。

方法は非常に簡単で、「外れ値を含む」と「外れ値を除く(<150元)」をそれぞれ計算して、基準値がどの程度変動しているかを確認します。

mean_all, std_all = df["amount"].mean(), df["amount"].std()
clean = df[df["amount"] < 150]["amount"]
print(f"含异常值 std={std_all:.2f} 剔除后 std={clean.std():.2f}")
print(f"50 元订单 z-score: {(50 - mean_all) / std_all:.2f} "
      f"vs {(50 - clean.mean()) / clean.std():.2f}")
含异常值 std=20.52 剔除后 std=18.51
50 元订单 z-score: 0.21 vs 0.26

平均値は 0.54 しか変化しませんでしたが、これは目立ちません。標準偏差は 18.51 から 20.52 に増加し、10.86% 増加しました。——これが重要なことです。 z-score の分母はそれです。

分母が大きくなり、全ての正規注文が z-score 全体として押しつぶされている: 50 元の典型的な注文は標準偏差 0.26 に低下するはずですが、現在は 0.21 だけが残っています。

同じ外れ値セットの標準偏差 (StandardScaler) は IQR (RobustScaler)10回以上。

違いは次のとおりです。標準偏差計算では、各サンプルは平均とは異なる必要があり、それを二乗する必要があります。非常に遠く離れた点には正方形レベルの寄与があります。IQR 25 パーセンタイルと 75 パーセンタイルがどこにあるかを尋ねるだけで、極端な値には投票権さえありません。

公平を期すために言うと、その問題は「歪度 + 外れ値」が同時に現れた場合にのみ明らかになります。

距離または内積を使用するアルゴリズム (KNN、SVM-RBF、KMeans、PCA、正則化を伴う線形モデル、ニューラル ネットワークなど) は直接影響を受けます。ツリー モデル (XGBoost、LightGBM、ランダム フォレスト) はスケールをまったく考慮しませんこのステップは完全にスキップできます。

MinMaxScaler 最も適切な説明は、最小値が 0 にマッピングされ、最大値が 1 にマッピングされ、中間値が線形に広がるというものです。

問題は、この「最大値」が極端な価値観の手に握られていることです。

df["minmax"] = MinMaxScaler().fit_transform(df[["amount"]]).ravel()
for p in [50, 75, 90, 95, 99]:
    print(f"{p}% 的订单落在 {df['minmax'].quantile(p / 100):.3f} 以下")
print(f"{(df['minmax'] < 0.5).mean() * 100:.1f}% 被塞进 0 ~ 0.5")
50% 的订单落在 0.199 以下
75% 的订单落在 0.262 以下
90% 的订单落在 0.319 以下
95% 的订单落在 0.368 以下
99% 的订单落在 0.541 以下
98.6% 被塞进 0 ~ 0.5

注文の 98.6% は 0 ~ 0.5 の間に圧縮され、値スペースの残りの 57% はこれら 5 つのグループ購入注文のみを処理します。

スケーリングは直線的で、形状はまったく変わりません。変わるのは、通常の注文にどれだけのスペースを割り当てることができるかです。

重要なのは精度ではなく解像度です。20 元と 90 元の注文の差は 4 倍以上あり、スケーリング後の差はわずか 0.335 です。

このギャップは、ニューラル ネットワークの最初の層の入力に特に悪影響を及ぼします。距離に依存する KNN などのアルゴリズムも、大部分のサンプルをボールに押し込みます。

したがって、適用される条件は非常に狭いです。畑には自然の境界があり、この境界自体に意味がある(スコア 1 ~ 5、パーセンテージ、ピクセル 0 ~ 255) を確認し、外れ値がないことを確認します。

式は (x - median) / IQR。 IQR を理解する最良の方法は、箱ひげ図を見ることです。

ボックスにはサンプルの中央の 50% が含まれており、中央値はボックス内の太い線、IQR はボックスの幅です。

外れ値を決定するための古典的なルールもここから来ています。 Q3 + 1.5 × IQR 異常とみなされます。

この例では上限は約93元で、それを超える注文は2.0%となっている。知らせこの比率は「位置」に基づいて計算され、極端さとは関係ありません。合計94元と合計210元は同じ重さです。

だからこそ安定しているのです。

df["robust"] = RobustScaler().fit_transform(df[["amount"]]).ravel()
median_all = df["amount"].median()
iqr_all = df["amount"].quantile(0.75) - df["amount"].quantile(0.25)
clean = df[df["amount"] < 150]["amount"]
iqr_clean = clean.quantile(0.75) - clean.quantile(0.25)
print(f"含异常值 median={median_all:.2f} IQR={iqr_all:.2f}")
print(f"剔除后   median={clean.median():.2f} IQR={iqr_clean:.2f}")
print(f"50 元订单 robust score: {(50 - median_all) / iqr_all:.2f} "
      f"vs {(50 - clean.median()) / iqr_clean:.2f}")
含异常值 median=42.81 IQR=25.31
剔除后   median=42.80 IQR=25.08
50 元订单 robust score: 0.28 vs 0.29

中央値ドリフトは 0.02%、IQR ドリフトは 0.96%、同じ次数のスケーリング結果は 0.28 対 0.29 で、基本的には変わりません。

RobustScaler 価格も明確に記載する必要があります。出力には境界がありません。

MinMax 0~1で止まってしまいます。Standard 約-2.16~8.01まで下がりますが、Robust およそ-1.64~6.61まで下がります。

さらに、ダウンストリームで制限された入力が必要な場合は、その後ろに別のレイヤーを接続する必要があります。

解釈性も少し悪くなります。たとえば、「0.28 IQR」は「0.28 標準偏差」ほど直感的ではありません。

参考値 出力範囲 何を恐れていますか? 該当するシナリオ
MinMaxScaler 最小/最大 に固定 [0,1] 極値は大きな分母をサポートします 自然な境界があり、外れ値は確認されません。
スタンダードスケーラー 平均値 / 標準値 無制限 歪度 + 外れ値 ほぼ正常ですが、解釈可能性が必要です
ロバストスケーラー 中央値 / IQR 無制限 基本的に怖くない 歪度や外れ値は削除できません。

def recommend_scaler(data):
    skewness = abs(stats.skew(data))
    q25, q75 = np.percentile(data, [25, 75])
    iqr = q75 - q25
    outlier_pct = ((data > q75 + 1.5 * iqr) | (data < q25 - 1.5 * iqr)).mean() * 100
    if outlier_pct > 5:
        return "RobustScaler - 异常值占比过高"
    if skewness > 1:
        return "RobustScaler - 强偏态分布"
    if skewness < 0.5 and outlier_pct < 1:
        return "StandardScaler - 近似正态分布"
    return "RobustScaler - 默认安全牌"
偏度 2.07 异常值占比 2.0%
推荐结果: RobustScaler - 强偏态分布

3 種類の特徴スケーリングを使用するための重要なポイント:

  1. 優先順位は逆転できません: 外れ値のダメージはより直接的なため、最初に外れ値の割合を確認し、次に歪度を確認します。
  2. 閾値は経験値です: ビジネスに自然な外れ値が多数ある場合は、5% の値を増やすことができます。
  3. それは終わりではなく出発点です:最後に、検証セットについて話しましょう。 2 つまたは 3 つの候補を実行して比較することは、どのヒューリスティックよりも信頼性が高くなります。

あるいは、機能スケーリングによって、列ごとに実行する——テーブル内の金額は偏っており、ピースの数は正常であり、各列は独自のスケーラーを使用しています。

完全な実行可能なコードは次の場所で共有されています。order_amount_scaler_demo.py: (アクセスパスワード: 6872)

興味がある場合は、手動で実行して感触を掴むことをお勧めします。

python order_amount_scaler_demo.py

最後に、スケーラー自体に違いはなく、違いはデータの外観にあります。

自然なフチがありすっきりとしていて、MinMax 使用して説明するのが最適です。

ほぼ正常、他人に説明する必要がある、Standard より適切です。

現実のビジネスにおいて、偏っていて汚く、少数の大きな注文が混在している分野は、RobustScaler これは最も心配のないデフォルトの選択です。



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *