ใครช่วยอธิบาย StandardScaler ให้ฉันหน่อยได้ไหม


คำตอบ:


119

แนวคิดเบื้องหลังStandardScalerคือมันจะแปลงข้อมูลของคุณเพื่อให้การกระจายจะมีค่าเฉลี่ย 0 และส่วนเบี่ยงเบนมาตรฐานเป็น 1
ในกรณีของข้อมูลหลายตัวแปรสิ่งนี้จะทำตามคุณลักษณะที่ชาญฉลาด (หรืออีกนัยหนึ่งโดยอิสระสำหรับแต่ละคอลัมน์ของข้อมูล) .
เมื่อพิจารณาจากการกระจายของข้อมูลแต่ละค่าในชุดข้อมูลจะมีค่าเฉลี่ยลบออกแล้วหารด้วยค่าเบี่ยงเบนมาตรฐานของชุดข้อมูลทั้งหมด (หรือคุณลักษณะในกรณีหลายตัวแปร)


6
ฉันพบว่าคำตอบนี้ไม่ถูกต้อง each value in the dataset will have the sample mean value subtracted-- นี่ไม่เป็นความจริง. ค่าเฉลี่ยของคุณลักษณะ / คอลัมน์แต่ละรายการจะถูกลบออกจากค่าของคอลัมน์ที่ระบุ นี่คือคอลัมน์ที่ชาญฉลาด ไม่มีsample mean value subtracted- ดูคำตอบของฉันด้านล่าง
seralouk

@makis ฉันแก้ไขคำตอบของฉันตามคำชี้แจงที่คุณแนะนำ
user6903745

114

Intro:ฉันคิดว่าคุณมีเมทริกซ์Xโดยที่แต่ละแถว / บรรทัดเป็นตัวอย่าง / การสังเกตและแต่ละคอลัมน์เป็นตัวแปร / คุณสมบัติ (นี่คืออินพุตที่คาดไว้สำหรับsklearnฟังก์ชัน ML ใด ๆ ก็ตาม- X.shapeควรจะเป็น[number_of_samples, number_of_features])


หลักของวิธีการ : แนวคิดหลักคือการปกติ / เป็นมาตรฐานเช่นμ = 0และσ = 1คุณสมบัติของคุณ / ตัวแปร / คอลัมน์ของX, ที่ไม่ซ้ำกัน , ก่อนที่จะใช้รูปแบบการเรียนรู้ของเครื่องใด ๆ

StandardScaler()จะปกติคุณสมบัติเช่นคอลัมน์ X แต่ละรายบุคคลเพื่อให้แต่ละคอลัมน์ / คุณสมบัติ / ตัวแปรจะมีและμ = 0σ = 1


PS:ฉันพบคำตอบที่โหวตมากที่สุดในหน้านี้ผิด ฉันกำลังอ้างถึง "แต่ละค่าในชุดข้อมูลจะมีการลบค่าเฉลี่ยตัวอย่าง" - ไม่เป็นความจริงหรือไม่ถูกต้อง


ดูเพิ่มเติม: อย่างไรและทำไมถึงกำหนดมาตรฐานข้อมูลของคุณ: แบบฝึกหัด Python


ตัวอย่าง:

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.]]

ตรวจสอบว่าค่าเฉลี่ยของแต่ละคุณลักษณะ (คอลัมน์) คือ 0:

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

ตรวจสอบว่า std ของแต่ละคุณลักษณะ (คอลัมน์) คือ 1:

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

คณิตศาสตร์:

ป้อนคำอธิบายภาพที่นี่


อัปเดต 08/2020 : เกี่ยวกับพารามิเตอร์อินพุตwith_meanและwith_stdถึงFalse/ Trueฉันได้ให้คำตอบที่นี่: StandardScaler ความแตกต่างระหว่าง "with_std = False หรือ True" และ "with_mean = False หรือ True"


คุณมีความคิดบ้างไหมว่าทำไมฉันถึงเข้าใจ[1.15, 1.15]เมื่อคำนวณเป็นแพนด้า df:? pd.DataFrame(scaled_data).std(0)
Sos

เมื่อฉันเรียกpd.DataFrame(scaled_data)[0]ฉันได้รับชุดที่มีและค่านิยมName: 0, dtype: float64 [-1.0, 1.0, -1.0, 1.0]ขออภัยในการจัดรูปแบบ
Sos

@seralouk ฉันชอบคุณตอบ แต่ฉันยังสงสัยว่าอะไรคือความตั้งใจที่อยู่เบื้องหลังการเปลี่ยนข้อมูลอินพุตโดยใช้StandardScalerมันทำให้อัลกอริทึมการเรียนรู้ของเครื่องทำงานเร็วขึ้นหรือช่วยในการตัดสินใจที่แม่นยำยิ่งขึ้นหรืออย่างอื่น?
sepisoad

การกำหนดมาตรฐานของชุดข้อมูลเป็นข้อกำหนดทั่วไปสำหรับตัวประมาณค่าการเรียนรู้ของเครื่องจำนวนมากซึ่งอาจทำงานได้ไม่ดีหากคุณลักษณะแต่ละรายการมีลักษณะไม่มากหรือน้อยเหมือนข้อมูลที่กระจายตามปกติ (เช่น Gaussian ที่มีค่าเฉลี่ย 0 และความแปรปรวนของหน่วย) ตัวอย่างเช่นองค์ประกอบหลายอย่างที่ใช้ในฟังก์ชั่นวัตถุประสงค์ของอัลกอริทึมการเรียนรู้ (เช่นเคอร์เนล RBF ของ SVM หรือตัวกำหนดตำแหน่ง L1 และ L2 ของแบบจำลองเชิงเส้น) ถือว่าคุณลักษณะทั้งหมดอยู่กึ่งกลางรอบ 0 และมีความแปรปรวนในลำดับเดียวกัน
seralouk

ดังนั้นการกำหนดมาตรฐานจึงนำไปสู่ ​​a) มีเสถียรภาพมากขึ้น b) ได้รับอิทธิพลน้อยลงจากช่วงของตัวแปร c) การติดตั้งที่เร็วขึ้น d) ประสิทธิภาพที่เสถียรมากขึ้น
seralouk


26

StandardScaler ดำเนินงานของมาตรฐาน โดยปกติชุดข้อมูลจะมีตัวแปรที่มีขนาดต่างกัน สำหรับเช่นชุดข้อมูลของพนักงานจะมีคอลัมน์ที่มีค่าอายุโย 20-70และคอลัมน์ที่มีค่าเงินเดือนโย 10,000-80,000
เนื่องจากคอลัมน์ทั้งสองนี้มีขนาดที่แตกต่างกันจึงได้รับมาตรฐานให้มีมาตราส่วนร่วมกันในขณะที่สร้างโมเดลแมชชีนเลิร์นนิง


11

สิ่งนี้มีประโยชน์เมื่อคุณต้องการเปรียบเทียบข้อมูลที่สอดคล้องกับหน่วยต่างๆ ในกรณีนี้คุณต้องการลบหน่วย ในการทำเช่นนั้นด้วยวิธีที่สอดคล้องกันของข้อมูลทั้งหมดคุณต้องแปลงข้อมูลในลักษณะที่ความแปรปรวนรวมกันและค่าเฉลี่ยของชุดข้อมูลคือ 0


1
กรุณาอธิบายด้วยตัวอย่าง.. ว่ามันช่วยได้อย่างไร.. ที่เป็นประโยชน์จริงๆ.. ขอบคุณ
Lakshay

8

ต่อไปนี้เป็นตัวอย่างการทำงานอย่างง่ายเพื่ออธิบายว่าการคำนวณมาตรฐานทำงานอย่างไร ในส่วนของทฤษฎีนั้นอธิบายได้ดีอยู่แล้วในคำตอบอื่น ๆ

>>>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

การคำนวณ

ดังที่คุณเห็นในผลลัพธ์ค่าเฉลี่ยคือ [6 , 2.5] และค่าเบี่ยงเบนมาตรฐานคือ [1.41421356, 0.8660254]

ข้อมูลคือ (0,1) ตำแหน่งคือ 2 Standardization = (2 - 2.5) /0.8660254 = -0.57735027

ข้อมูลใน (1,0) ตำแหน่งคือ 4 Standardization = (4-6) /1.41421356 = -1.414

ผลลัพธ์หลังจากการกำหนดมาตรฐาน

ป้อนคำอธิบายภาพที่นี่

ตรวจสอบค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานหลังจากการกำหนดมาตรฐาน

ป้อนคำอธิบายภาพที่นี่

หมายเหตุ: -2.77555756e-17 อยู่ใกล้ 0 มาก

อ้างอิง

  1. เปรียบเทียบผลของเครื่องวัดขนาดต่างๆที่มีต่อข้อมูลกับค่าผิดปกติ

  2. อะไรคือความแตกต่างระหว่าง Normalization และ Standardization

  3. ค่าเฉลี่ยของข้อมูลที่ปรับขนาดด้วย sklearn StandardScaler ไม่ใช่ศูนย์


5

คำตอบข้างต้นดีมาก แต่ฉันต้องการตัวอย่างง่ายๆเพื่อบรรเทาความกังวลบางอย่างที่เคยมีในอดีต ฉันต้องการตรวจสอบให้แน่ใจว่าเป็นการปฏิบัติต่อแต่ละคอลัมน์แยกกัน ตอนนี้ฉันมั่นใจและไม่พบว่าตัวอย่างใดทำให้ฉันกังวล คอลัมน์ทั้งหมดกำลังปรับขนาดแยกตามที่อธิบายข้างต้น

รหัส

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)

เอาท์พุท

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)

บันทึก:

โมดูล scipy.stats รายงานความแปรปรวน "ตัวอย่าง" อย่างถูกต้องซึ่งใช้ (n - 1) ในตัวส่วน ความแปรปรวน "ประชากร" จะใช้ n ในตัวส่วนสำหรับการคำนวณความแปรปรวน เพื่อให้เข้าใจได้ดีขึ้นโปรดดูโค้ดด้านล่างซึ่งใช้ข้อมูลที่ปรับขนาดจากคอลัมน์แรกของชุดข้อมูลด้านบน:

รหัส

import scipy.stats as ss

sc_Data = [[-1.34164079], [-0.4472136], [0.4472136], [1.34164079]]
col_stats = ss.describe([-1.34164079, -0.4472136, 0.4472136, 1.34164079])
print(col_stats)
print()

mean_by_hand = 0
for row in sc_Data:
    for element in row:
        mean_by_hand += element
mean_by_hand /= 4

variance_by_hand = 0
for row in sc_Data:
    for element in row:
        variance_by_hand += (mean_by_hand - element)**2
sample_variance_by_hand = variance_by_hand / 3
sample_std_dev_by_hand = sample_variance_by_hand ** 0.5

pop_variance_by_hand = variance_by_hand / 4
pop_std_dev_by_hand = pop_variance_by_hand ** 0.5

print("Sample of Population Calcs:")
print(mean_by_hand, sample_variance_by_hand, sample_std_dev_by_hand, '\n')
print("Population Calcs:")
print(mean_by_hand, pop_variance_by_hand, pop_std_dev_by_hand)

เอาต์พุต

DescribeResult(nobs=4, minmax=(-1.34164079, 1.34164079), mean=0.0, variance=1.3333333422778562, skewness=0.0, kurtosis=-1.36000000429325)

Sample of Population Calcs:
0.0 1.3333333422778562 1.1547005422523435

Population Calcs:
0.0 1.000000006708392 1.000000003354196

2
ทำไมความแปรปรวนไม่เป็น 1 ได้โปรด?
สูงสุด

@Max สถิติ scipy ใช้ความแปรปรวนตัวอย่าง ดูเพิ่มใหม่เพื่อตอบโจทย์
Thom Ives

@seralouk ใช่ถ้าความแปรปรวนของประชากรและส่วนเบี่ยงเบนมาตรฐาน แต่ไม่ใช่สำหรับความแปรปรวนของตัวอย่างและส่วนเบี่ยงเบนมาตรฐาน - สถิติ scipy ที่มีค่าเริ่มต้นเป็น calcs ตัวอย่าง
Thom Ives

3

หลังจากใช้StandardScaler()แล้วแต่ละคอลัมน์ใน X จะมีค่าเฉลี่ยเป็น 0 และส่วนเบี่ยงเบนมาตรฐานเป็น 1

สูตรจะแสดงโดยผู้อื่นในหน้านี้

เหตุผล: อัลกอริทึมบางอย่างต้องการข้อมูลที่มีลักษณะเช่นนี้ (ดูเอกสาร sklearn )


แก้ไข. คำตอบบางคำที่แสดงคำอธิบายสถิติ scipy ของค่าเฉลี่ยและความแปรปรวนของข้อมูลที่ปรับขนาด ความแปรปรวนตัวอย่างสำหรับชุดข้อมูลขนาดเล็กอาจแตกต่างจากความแปรปรวนของประชากรอย่างมีนัยสำคัญ
Thom Ives

0

เราสมัครStandardScalar()เป็นรายแถว

ดังนั้นสำหรับแต่ละแถวในคอลัมน์ (ฉันสมมติว่าคุณกำลังทำงานกับ Pandas DataFrame):

x_new = (x_original - mean_of_distribution) / std_of_distribution

ไม่กี่คะแนน -

  1. เรียกว่า Standard Scalar เมื่อเราหารด้วยค่าเบี่ยงเบนมาตรฐานของการแจกแจง (ระยะห่างของคุณลักษณะ) ในทำนองเดียวกันคุณสามารถคาดเดาMinMaxScalar()ได้

  2. StandardScalar()มีการกระจายของเดิมยังคงเหมือนเดิมหลังจากการใช้ เป็นความเข้าใจผิดทั่วไปที่ว่าการแจกแจงจะเปลี่ยนเป็นการแจกแจงแบบปกติ เรากำลังแยกช่วงเป็น [0, 1]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.