Contoh standardisasi berbeda dalam python.
Untuk referensi lihat artikel wikipedia ini:
https://en.wikipedia.org/wiki/Unprice_estimation_of_standard_deviation
Contoh Data
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
Normalisasi menggunakan panda (Memberikan perkiraan tidak bias)
Ketika menormalkan kita cukup mengurangi mean dan membaginya dengan standar deviasi.
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
Normalisasi menggunakan sklearn (Memberikan perkiraan bias, berbeda dari panda)
Jika Anda melakukan hal yang sama dengan sklearn
Anda akan mendapatkan hasil yang BERBEDA!
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
Apakah perkiraan bias sklearn membuat Pembelajaran Mesin Kurang Kuat?
TIDAK.
Dokumentasi resmi sklearn.preprocessing.scale menyatakan bahwa menggunakan estimator yang bias TIDAK UNIK untuk mempengaruhi kinerja algoritma pembelajaran mesin dan kita dapat menggunakannya dengan aman.
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.
Bagaimana dengan Scaling MinMax?
Tidak ada perhitungan Standar Deviasi dalam penskalaan MinMax. Jadi hasilnya sama di kedua panda dan scikit-belajar.
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