การ Centering และ Scaling

Supervised Learning ด้วย scikit-learn

George Boorman

Core Curriculum Manager

ทำไมต้อง Scale ข้อมูล?

print(music_df[["duration_ms", "loudness", "speechiness"]].describe())
         duration_ms     loudness       speechiness
count    1.000000e+03    1000.000000    1000.000000
mean     2.176493e+05    -8.284354      0.078642
std      1.137703e+05    5.065447       0.088291
min      -1.000000e+00   -38.718000     0.023400
25%      1.831070e+05    -9.658500      0.033700
50%      2.176493e+05    -7.033500      0.045000
75%      2.564468e+05    -5.034000      0.078642
max      1.617333e+06    -0.883000      0.710000
Supervised Learning ด้วย scikit-learn

ทำไมต้อง Scale ข้อมูล?

  • โมเดลหลายตัวใช้ระยะห่างในการเรียนรู้

  • ฟีเจอร์ที่มีค่าสเกลใหญ่กว่าอาจส่งผลต่อโมเดลมากเกินไป

  • ตัวอย่าง: KNN ใช้ระยะห่างโดยตรงในการทำนาย

  • ฟีเจอร์ควรอยู่ในสเกลที่ใกล้เคียงกัน

  • แก้ได้ด้วยการ Normalize หรือ Standardize (scaling และ centering)

Supervised Learning ด้วย scikit-learn

วิธี Scale ข้อมูล

  • ลบค่าเฉลี่ยแล้วหารด้วยความแปรปรวน

    • ทุกฟีเจอร์จะมีค่ากึ่งกลางที่ศูนย์และ variance เป็นหนึ่ง
    • วิธีนี้เรียกว่า standardization
  • หรือลบค่าต่ำสุดแล้วหารด้วยช่วงค่า

    • ค่าต่ำสุดเป็น 0 และค่าสูงสุดเป็น 1
  • สามารถ normalize ให้ข้อมูลอยู่ในช่วง -1 ถึง +1 ได้เช่นกัน

  • ดูรายละเอียดเพิ่มเติมได้ที่เอกสาร scikit-learn

Supervised Learning ด้วย scikit-learn

การ Scaling ใน scikit-learn

from sklearn.preprocessing import StandardScaler

X = music_df.drop("genre", axis=1).values y = music_df["genre"].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(np.mean(X), np.std(X)) print(np.mean(X_train_scaled), np.std(X_train_scaled))
19801.42536120538, 71343.52910125865
2.260817795600319e-17, 1.0
Supervised Learning ด้วย scikit-learn

การ Scaling ใน Pipeline

steps = [('scaler', StandardScaler()),
         ('knn', KNeighborsClassifier(n_neighbors=6))]
pipeline = Pipeline(steps)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=21)
knn_scaled = pipeline.fit(X_train, y_train)
y_pred = knn_scaled.predict(X_test)
print(knn_scaled.score(X_test, y_test))
0.81
Supervised Learning ด้วย scikit-learn

เปรียบเทียบประสิทธิภาพเมื่อไม่ได้ Scale ข้อมูล

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
                                                    random_state=21)
knn_unscaled = KNeighborsClassifier(n_neighbors=6).fit(X_train, y_train)
print(knn_unscaled.score(X_test, y_test))
0.53
Supervised Learning ด้วย scikit-learn

CV และ Scaling ใน Pipeline

from sklearn.model_selection import GridSearchCV
steps = [('scaler', StandardScaler()),
         ('knn', KNeighborsClassifier())]
pipeline = Pipeline(steps)

parameters = {"knn__n_neighbors": np.arange(1, 50)}
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=21)
cv = GridSearchCV(pipeline, param_grid=parameters)
cv.fit(X_train, y_train)
y_pred = cv.predict(X_test)
Supervised Learning ด้วย scikit-learn

ตรวจสอบพารามิเตอร์ของโมเดล

print(cv.best_score_)
0.8199999999999999
print(cv.best_params_)
{'knn__n_neighbors': 12}
Supervised Learning ด้วย scikit-learn

มาฝึกกันเถอะ!

Supervised Learning ด้วย scikit-learn

Preparing Video For Download...