ในหลาย ๆ Dataset เราจะพบว่าข้อมูลแบบ Category มีการแตกยิบย่อยมากเกินไป เช่น บาง Category มีแค่ 1 หรือ 2 Record เท่านั้น หรือ Category เล็ก จำนวน Record แตกต่างกับ Category ใหญ่ ๆ หลายร้อย หลายพันเท่า ข้อมูล Category เล็ก ๆ ยิบย่อยเหล่านี้ อาจจะไม่ได้ช่วยโมเดล Machine Learning ในการเรียนรู้ก็ได้

ทางแก้คือ เราจะ Group รวม Category เล็ก ๆ เหล่านั้นรวมออกมาเป็น Category ใหม่ ตั้งชื่อว่า Other

An example of a power law graph showing popularity ranking. To the right (yellow) is the long tail; to the left (green) are the few that dominate. In this example, the cutoff is chosen so that areas of both regions are equal. Credit https://commons.wikimedia.org/wiki/File:Long_tail.svg
An example of a power law graph showing popularity ranking. To the right (yellow) is the long tail; to the left (green) are the few that dominate. In this example, the cutoff is chosen so that areas of both regions are equal. Credit https://commons.wikimedia.org/wiki/File:Long_tail.svg

Other (และอื่น ๆ)

การสร้าง Other Category มีข้อดีอีกอย่าง คือ ถ้าเวลาใช้งานจริง มีข้อมูล Category ใหม่ หลุดเข้ามา เราอาจจะเอาใส่ไว้ใน Other ได้เลย โดยที่ไม่ต้องแก้โปรแกรมเยอะ

และยิ่งถ้า Category นั่นใช้ One-Hot Encoding ถ้าเรามี Category ยิบย่อยจำนวนมาก เช่น หลักพัน จะทำให้ต้องเพิ่มจำนวน Column อีกหลักพัน เท่าจำนวนหมวดหมู่ ทำให้โมเดลอาจจะมีปัญหาได้

เรามาเริ่มกันเลยดีกว่า

Open In Colab

ในข้อมูลแบบ Category ถ้าข้อมูลมีการแตกยิบย่อยมากเกินไป เช่น บาง Category มีแค่ 1 หรือ 2 Record หรือจำนวน Record แตกต่างกับ Category ใหญ่ ๆ เป็น 100 เป็น 1000 เท่า ข้อมูล Category เหล่านี้ อาจจะไม่ได้ช่วยโมเดล Machine Learning ในการเรียนรู้ก็ได้

ทางแก้คือ เราจะ Group Category เล็ก ๆ เหล่านั้นรวมออกมาเป็น Category ใหม่ ตั้งชื่อว่า Other

การสร้าง Other Category มีข้อดีอีกอย่างคือ ถ้ามีข้อมูล Category ใหม่หลุดมา เราอาจจะเอาใส่ไว้ใน Other ได้เลย โดยที่ไม่ต้องแก้โปรแกรมเยอะ

0. Magic

In [0]:
%reload_ext autoreload
%autoreload 2
%matplotlib inline

1. Import

In [0]:
import pandas as pd
import matplotlib.pyplot as plt

2. Data

เราจะสมมติข้อมูล ผู้เข้าร่วมงานสัมมนา ขึ้นมา

In [0]:
df = pd.DataFrame({'Name': ["Mister A", "Mister B", "Mister C", "Mister D", "Mister E", "Mister F", "Mister G", "Mister H", "Mister I", "Mister J", "Mister K", "Mister L", "Mister M", "Mister N", "Mister O", "Mister P", "Mister Q", "Mister R", "Mister S", "Mister T", "Mister U", "Mister V", "Mister W", "Mister X"], 
                   'Age': [22, 33, 35, 31, 41, 51, 27, 33, 37, 31, 42, 57, 22, 33, 35, 31, 41, 51, 27, 33, 37, 31, 42, 57], 
                   'Country': ["Thai", "Laos", "Laos", "Thai", "Brazil", "Ethiopia", "Myanmar", "Canada", "Laos", "Thai", "Thai", "Myanmar", "Thai", "Laos", "Laos", "Thai", "Myanmar", "Myanmar", "Myanmar", "Laos", "Laos", "Thai", "Thai", "Myanmar"], 
                   })
df
Out[0]:
NameAgeCountry
0Mister A22Thai
1Mister B33Laos
2Mister C35Laos
3Mister D31Thai
4Mister E41Brazil
5Mister F51Ethiopia
6Mister G27Myanmar
7Mister H33Canada
8Mister I37Laos
9Mister J31Thai
10Mister K42Thai
11Mister L57Myanmar
12Mister M22Thai
13Mister N33Laos
14Mister O35Laos
15Mister P31Thai
16Mister Q41Myanmar
17Mister R51Myanmar
18Mister S27Myanmar
19Mister T33Laos
20Mister U37Laos
21Mister V31Thai
22Mister W42Thai
23Mister X57Myanmar

3. Preprocessing

3.1 Other Category

Before

การที่เราจะ Group Category เล็ก รวมกันเป็น Other เราต้องเข้าใจข้อมูลก่อน นับดูก่อน ว่าแต่ละ Category มีสมาชิกเท่าไร

In [0]:
df["Country"].value_counts()
Out[0]:
Thai        8
Laos        7
Myanmar     6
Canada      1
Ethiopia    1
Brazil      1
Name: Country, dtype: int64

ในเคสนี้ เราจะเลือก Top 3 Category ออกมาก่อน

In [0]:
top3 = df["Country"].value_counts().nlargest(3).index
top3
Out[0]:
Index(['Thai', 'Laos', 'Myanmar'], dtype='object')

After

เราจะ Group Category ให้เหลือเป็น 3 + 1 Category (Top 3 + Other)

In [0]:
df["Country_NEW"] = df["Country"].where(df["Country"].isin(top3), other="Other")
df
Out[0]:
NameAgeCountryCountry_NEW
0Mister A22ThaiThai
1Mister B33LaosLaos
2Mister C35LaosLaos
3Mister D31ThaiThai
4Mister E41BrazilOther
5Mister F51EthiopiaOther
6Mister G27MyanmarMyanmar
7Mister H33CanadaOther
8Mister I37LaosLaos
9Mister J31ThaiThai
10Mister K42ThaiThai
11Mister L57MyanmarMyanmar
12Mister M22ThaiThai
13Mister N33LaosLaos
14Mister O35LaosLaos
15Mister P31ThaiThai
16Mister Q41MyanmarMyanmar
17Mister R51MyanmarMyanmar
18Mister S27MyanmarMyanmar
19Mister T33LaosLaos
20Mister U37LaosLaos
21Mister V31ThaiThai
22Mister W42ThaiThai
23Mister X57MyanmarMyanmar

นับค่า Feature ใหม่ ที่เพิ่งสร้างขึ้นมา

In [0]:
df["Country_NEW"].value_counts()
Out[0]:
Thai       8
Laos       7
Myanmar    6
Other      3
Name: Country_NEW, dtype: int64

4. สรุป

  1. เราได้ Group รวม Category เล็ก ๆ รวมเข้าเป็น Category ใหม่ ตั้งชื่อว่า Other ซึ่งเราต้องตัดสินใจเลือกว่าเล็ก คือแค่ไหน จากความเข้าใจในข้อมูล ด้วยการทำ Exploratory Data Analysis (EDA)
  2. เราสามารถสร้าง Other Category อย่างง่าย ด้วย โค้ดไม่กี่บรรทัด และ Pandas Dataframe
  3. เราสามารถนำเทคนิคนี้ ไปใช้ร่วมกับ Preprocessing แบบอื่น ๆ เพื่อจัดเตรียมข้อมูล เพิ่มประสิทธิภาพการเรียนรู้ให้กับโมเดลของเรา

Credit

In [0]:
 

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.

Enable Notifications.    Ok No thanks