Ví dụ về các tiêu chuẩn khác nhau trong python.
Để tham khảo xem bài viết trên wikipedia này:
https://en.wikipedia.org/wiki/Unbiased_estimation_of_stiteria_deviation
Dữ liệu mẫu
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
print(df)
A B C
0 1 100 a
1 2 300 b
2 3 500 c
Bình thường hóa bằng cách sử dụng gấu trúc (Cung cấp ước tính không thiên vị)
Khi bình thường hóa, chúng ta chỉ cần trừ trung bình và chia cho độ lệch chuẩn.
df.iloc[:,0:-1] = df.iloc[:,0:-1].apply(lambda x: (x-x.mean())/ x.std(), axis=0)
print(df)
A B C
0 -1.0 -1.0 a
1 0.0 0.0 b
2 1.0 1.0 c
Chuẩn hóa bằng sklearn (Đưa ra ước tính sai lệch, khác với gấu trúc)
Nếu bạn làm điều tương tự với sklearn
bạn sẽ nhận được đầu ra KHÁC BIỆT!
import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
df.iloc[:,0:-1] = scaler.fit_transform(df.iloc[:,0:-1].to_numpy())
print(df)
A B C
0 -1.224745 -1.224745 a
1 0.000000 0.000000 b
2 1.224745 1.224745 c
Các ước tính thiên vị của sklearn có làm cho Machine Learning kém mạnh mẽ hơn không?
KHÔNG.
Tài liệu chính thức của sklearn.pre Processing.scale nói rằng việc sử dụng công cụ ước tính thiên vị là KHÔNG GIỚI HẠN để ảnh hưởng đến hiệu suất của các thuật toán học máy và chúng ta có thể sử dụng chúng một cách an toàn.
From official documentation:
We use a biased estimator for the standard deviation,
equivalent to numpy.std(x, ddof=0).
Note that the choice of ddof is unlikely to affect model performance.
Điều gì về quy mô MinMax?
Không có tính toán Độ lệch chuẩn trong tỷ lệ MinMax. Vì vậy, kết quả là giống nhau ở cả gấu trúc và scikit-learn.
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
})
(df - df.min()) / (df.max() - df.min())
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0
# Using sklearn
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
arr_scaled = scaler.fit_transform(df)
print(arr_scaled)
[[0. 0. ]
[0.5 0.5]
[1. 1. ]]
df_scaled = pd.DataFrame(arr_scaled, columns=df.columns,index=df.index)
print(df_scaled)
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0