Bất cứ ai có thể giải thích cho tôi StandardScaler?


Câu trả lời:


105

Ý tưởng đằng sau StandardScalerlà nó sẽ biến đổi dữ liệu của bạn sao cho phân phối của nó sẽ có giá trị trung bình 0 và độ lệch chuẩn là 1.
Trong trường hợp dữ liệu đa biến, điều này được thực hiện theo tính năng (nói cách khác là độc lập cho từng cột dữ liệu) .
Với sự phân bố của dữ liệu, mỗi giá trị trong tập dữ liệu sẽ có giá trị trung bình bị trừ đi và sau đó chia cho độ lệch chuẩn của toàn bộ tập dữ liệu (hoặc đối tượng trong trường hợp đa biến).


3
Tôi thấy rằng câu trả lời này là không chính xác. each value in the dataset will have the sample mean value subtracted-- Đây không phải là sự thật. Giá trị trung bình của MỖI đối tượng / cột sẽ được trừ khỏi các giá trị của cột cụ thể. Điều này được thực hiện theo cột khôn ngoan. Không có sample mean value subtracted- Xem câu trả lời của tôi bên dưới
seralouk

@makis Tôi đã chỉnh sửa câu trả lời của mình theo cách làm rõ mà bạn đề xuất.
user6903745

98

Giới thiệu: Tôi giả sử rằng bạn có một ma trận Xtrong đó mỗi hàng / dòng là một mẫu / quan sát và mỗi cột là một biến / tính năng (nhân tiện, đây là đầu vào dự kiến ​​cho bất kỳ sklearnhàm ML nào - X.shapenên như vậy [number_of_samples, number_of_features]).


Cốt lõi của phương pháp : Ý tưởng chính là chuẩn hóa / chuẩn hóa tức là μ = 0σ = 1các tính năng / biến / cột của bạn X, riêng lẻ , trước khi áp dụng bất kỳ mô hình học máy nào.

StandardScaler()sẽ chuẩn hóa các tính năng tức là mỗi cột của X, RIÊNG TƯ , để mỗi cột / tính năng / biến sẽ có μ = 0σ = 1.


Tái bút: Tôi thấy câu trả lời được ủng hộ nhiều nhất trên trang này, sai. Tôi đang trích dẫn "mỗi giá trị trong tập dữ liệu sẽ bị trừ đi giá trị trung bình mẫu" - Điều này không đúng cũng không đúng.


Xem thêm: Làm thế nào và tại sao để Chuẩn hóa dữ liệu của bạn: Hướng dẫn python


Thí dụ:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Xác minh rằng giá trị trung bình của mỗi đối tượng (cột) là 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Xác minh rằng std của mỗi tính năng (cột) là 1:

scaled_data.std(axis = 0)
array([1., 1.])

Các phép toán:

nhập mô tả hình ảnh ở đây


CẬP NHẬT 08/2019 : Kết hợp các tham số đầu vào with_meanwith_stdđến False/ True, tôi đã đưa ra câu trả lời ở đây: Sự khác biệt của StandardScaler giữa “with_std = False hoặc True” và “with_mean = False hoặc True”


Bạn có biết tại sao tôi nhận được [1.15, 1.15]khi tôi tính toán như một con gấu trúc pd.DataFrame(scaled_data).std(0)không:?
Sos

khi tôi chạy, pd.DataFrame(scaled_data)[0]tôi nhận được một chuỗi Name: 0, dtype: float64các giá trị và [-1.0, 1.0, -1.0, 1.0]. Xin lỗi vì định dạng
Sos

@seralouk Tôi thích bạn trả lời, tuy nhiên tôi vẫn đang tự hỏi ý định đằng sau việc chuyển đổi dữ liệu đầu vào bằng cách sử dụng là gì StandardScaler, nó có làm cho thuật toán học máy hoạt động nhanh hơn hay giúp đưa ra quyết định chính xác hơn hay điều gì khác?
sepisoad

Chuẩn hóa tập dữ liệu là một yêu cầu chung đối với nhiều công cụ ước tính học máy: chúng có thể hoạt động không tốt nếu các tính năng riêng lẻ ít nhiều trông giống như dữ liệu được phân phối chuẩn thông thường (ví dụ: Gaussian với 0 trung bình và phương sai đơn vị). Ví dụ: nhiều phần tử được sử dụng trong hàm mục tiêu của một thuật toán học tập (chẳng hạn như hạt nhân RBF của SVM hoặc bộ điều chỉnh L1 và L2 của mô hình tuyến tính) giả định rằng tất cả các đặc trưng đều tập trung xung quanh 0 và có phương sai theo cùng một thứ tự.
seralouk

Vì vậy, Tiêu chuẩn hóa dẫn đến a) ổn định hơn b) ít bị ảnh hưởng bởi phạm vi biến c) phù hợp nhanh hơn d) hiệu suất ổn định hơn
seralouk


22

StandardScaler thực hiện nhiệm vụ Chuẩn hóa . Thông thường, một tập dữ liệu chứa các biến có tỷ lệ khác nhau. Ví dụ: tập dữ liệu Nhân viên sẽ chứa cột TUỔI với các giá trị trên thang 20-70 và cột LƯƠNG với các giá trị trên thang 10000-80000 .
Vì hai cột này khác nhau về tỷ lệ, chúng được Tiêu chuẩn hóa để có tỷ lệ chung trong khi xây dựng mô hình học máy.


10

Điều này rất hữu ích khi bạn muốn so sánh dữ liệu tương ứng với các đơn vị khác nhau. Trong trường hợp đó, bạn muốn loại bỏ các đơn vị. Để làm điều đó theo cách nhất quán của tất cả dữ liệu, bạn biến đổi dữ liệu theo cách mà phương sai là đơn nhất và giá trị trung bình của chuỗi là 0.


1
? pls u có thể giải thích với một example..as trong cách nó giúp .. mà wud được thực sự helpful..thanks
Lakshay

6

Các câu trả lời ở trên rất tuyệt, nhưng tôi cần một ví dụ đơn giản để giảm bớt một số lo ngại mà tôi đã có trong quá khứ. Tôi muốn đảm bảo rằng nó thực sự đang xử lý từng cột riêng biệt. Bây giờ tôi đã yên tâm và không thể tìm thấy ví dụ nào đã khiến tôi lo lắng. Tất cả các cột quy mô riêng biệt như mô tả của những người ở trên.

CODE

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

ĐẦU RA

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)

1
Tại sao phương sai không phải là 1, làm ơn?
Tối đa

6

Sau đây là một ví dụ làm việc đơn giản để giải thích cách tính toán chuẩn hóa hoạt động. Phần lý thuyết đã được giải thích kỹ trong các đáp án khác.

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

Phép tính

Như bạn có thể thấy trong đầu ra, giá trị trung bình là [6. , 2,5] và độ lệch std là [1,41421356, 0,8660254]

Dữ liệu là (0,1) vị trí là 2 Chuẩn hóa = (2 - 2,5) /0,8660254 = -0,57735027

Dữ liệu ở vị trí (1,0) là 4 Chuẩn hóa = (4-6) /1.41421356 = -1.414

Kết quả sau khi chuẩn hóa

nhập mô tả hình ảnh ở đây

Kiểm tra Trung bình và Độ lệch Std Sau khi Chuẩn hóa

nhập mô tả hình ảnh ở đây

Lưu ý: -2,77555756e-17 rất gần với 0.

Người giới thiệu

  1. So sánh tác động của các tỷ lệ khác nhau trên dữ liệu với các tỷ lệ ngoại lệ

  2. Sự khác biệt giữa Chuẩn hóa và Chuẩn hóa là gì?

  3. Giá trị trung bình của dữ liệu được chia tỷ lệ với sklearn StandardScaler không bằng 0


3

Sau khi áp dụng StandardScaler(), mỗi cột trong X sẽ có giá trị trung bình là 0 và độ lệch chuẩn là 1.

Các công thức được liệt kê bởi những người khác trên trang này.

Cơ sở lý luận: một số thuật toán yêu cầu dữ liệu có dạng như thế này (xem tài liệu sklearn ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.