วิธีการเข้ารหัสแบบ One-Hot สำหรับตัวแปรหลายหมวดหมู่

โหนดต้นทาง: 841101

ในบทความนี้ เราจะเรียนรู้เกี่ยวกับวิธีจัดการกับตัวแปรหลายหมวดหมู่โดยใช้เทคนิค Feature Engineering One Hot Encoding

แต่ก่อนที่จะดำเนินการต่อ เรามาคุยกันสั้นๆ เกี่ยวกับ Feature engineering และ One Hot Encoding

คุณสมบัติวิศวกรรม

ดังนั้น Feature Engineering จึงเป็นกระบวนการแยกฟีเจอร์จากข้อมูลดิบโดยใช้ความรู้โดเมนของปัญหา คุณสมบัติเหล่านี้สามารถใช้เพื่อปรับปรุงประสิทธิภาพของอัลกอริทึมการเรียนรู้ของเครื่องและหากประสิทธิภาพเพิ่มขึ้นก็จะให้ความแม่นยำที่ดีที่สุด เราอาจกล่าวได้ว่าวิศวกรรมคุณลักษณะนั้นเหมือนกับการเรียนรู้ของเครื่องประยุกต์ วิศวกรรมฟีเจอร์เป็นศิลปะที่สำคัญที่สุดในการเรียนรู้ของเครื่อง ซึ่งสร้างความแตกต่างอย่างมากระหว่างโมเดลที่ดีและโมเดลที่ไม่ดี นี่เป็นขั้นตอนที่สามในวงจรชีวิตของโครงการวิทยาศาสตร์ข้อมูล

แนวคิดเรื่องความโปร่งใสสำหรับโมเดลแมชชีนเลิร์นนิงเป็นสิ่งที่ซับซ้อน เนื่องจากโมเดลต่างๆ มักจะต้องการแนวทางที่แตกต่างกันสำหรับข้อมูลประเภทต่างๆ เช่น:-

  • ข้อมูลต่อเนื่อง
  • คุณสมบัติหมวดหมู่
  • ค่าที่ขาดหายไป
  • normalization
  • วันที่และเวลา

แต่ที่นี่เราจะพูดถึงเฉพาะคุณสมบัติตามหมวดหมู่เท่านั้น คุณสมบัติตามหมวดหมู่คือคุณสมบัติที่ประเภทข้อมูลเป็นประเภทวัตถุ ค่าของจุดข้อมูลในคุณลักษณะเชิงหมวดหมู่ใดๆ ไม่ได้อยู่ในรูปแบบตัวเลข แต่จะอยู่ในรูปแบบวัตถุ

มีเทคนิคมากมายในการจัดการตัวแปรเชิงหมวดหมู่ บางส่วนคือ:

  • การเข้ารหัสฉลากหรือการเข้ารหัสลำดับ
  • การเข้ารหัสที่ร้อนแรง
  • การเข้ารหัสจำลอง
  • การเข้ารหัสเอฟเฟกต์
  • การเข้ารหัสไบนารี
  • การเข้ารหัสบาเซิล
  • การเข้ารหัสแฮช
  • การเข้ารหัสเป้าหมาย

ดังนั้น ในที่นี้เราจะจัดการคุณสมบัติตามหมวดหมู่โดย One Hot Encoding ดังนั้นก่อนอื่นเราจะหารือเกี่ยวกับ One Hot Encoding

หนึ่งการเข้ารหัสร้อน

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

ซึ่งหมายความว่าข้อมูลหมวดหมู่จะต้องแปลงเป็นรูปแบบตัวเลข หากตัวแปรหมวดหมู่เป็นตัวแปรเอาต์พุต คุณอาจต้องการแปลงการคาดคะเนโดยโมเดลกลับเป็นรูปแบบหมวดหมู่เพื่อนำเสนอหรือใช้ในแอปพลิเคชันบางอย่าง

เช่น ข้อมูลเกี่ยวกับเพศอยู่ในรูปของ 'ชาย' และ 'หญิง'.

แต่ถ้าเราใช้การเข้ารหัสแบบ one-hot การเข้ารหัสและปล่อยให้โมเดลจัดลำดับตามธรรมชาติระหว่างหมวดหมู่อาจส่งผลให้ประสิทธิภาพต่ำหรือผลลัพธ์ที่ไม่คาดคิด

การเข้ารหัสแบบร้อนครั้งเดียวสามารถนำไปใช้กับการแสดงจำนวนเต็มได้ นี่คือที่ที่ตัวแปรเข้ารหัสจำนวนเต็มถูกลบออก และเพิ่มตัวแปรไบนารีใหม่สำหรับแต่ละค่าจำนวนเต็มที่ไม่ซ้ำกัน

ตัวอย่างเช่น เราเข้ารหัสตัวแปรสี

สีแดง  สีฟ้า
0 1
1 0
0 1

ตอนนี้เราจะเริ่มการเดินทางของเรา ในขั้นแรก เราจะนำชุดข้อมูลของการทำนายราคาบ้าน

ชุด

ในที่นี้เราจะใช้ชุดข้อมูลของ house_price ที่ใช้ในการทำนายราคาบ้านตามขนาดของพื้นที่

หากคุณต้องการดาวน์โหลดชุดข้อมูลการคาดการณ์ราคาบ้าน ให้คลิก โปรดคลิกที่นี่เพื่ออ่านรายละเอียดเพิ่มเติม.

การนำเข้าโมดูล

ตอนนี้เราต้องนำเข้าโมดูลที่สำคัญจาก python ซึ่งจะใช้สำหรับการเข้ารหัสแบบ one-hot

# นำเข้าแพนด้า นำเข้าแพนด้าเป็น pd # นำเข้า numpy นำเข้า numpy เป็น np # นำเข้า OneHotEncoder จาก sklearn.preprocessing นำเข้า OneHotEncoder()

ที่นี่ เราใช้ pandas ซึ่งใช้สำหรับการวิเคราะห์ข้อมูล, NumPyused สำหรับอาร์เรย์ n มิติ และจาก sklearn เราจะใช้ One Hot Encoder คลาสที่สำคัญสำหรับการเข้ารหัสตามหมวดหมู่

ตอนนี้เราต้องอ่านข้อมูลนี้โดยใช้ Python

การอ่านชุดข้อมูล

โดยทั่วไป ชุดข้อมูลจะอยู่ในรูปแบบ CSV และชุดข้อมูลที่เราใช้จะอยู่ในรูปแบบ CSV ด้วย สำหรับการอ่านไฟล์ CSV เราจะใช้ฟังก์ชัน pandas read_csv() ดูด้านล่าง:

# ชุดข้อมูลการอ่าน df = pd.read_csv('house_price.csv') df.head()

เอาต์พุต: -

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

สำหรับการแบ่งตัวแปรหมวดหมู่จากข้อมูลเราต้องตรวจสอบว่าคุณสมบัติมีค่าหมวดหมู่กี่ค่า

การตรวจสอบค่าหมวดหมู่

สำหรับการตรวจสอบค่าเราใช้ฟังก์ชัน pandas select_dtypes ซึ่งใช้สำหรับเลือกประเภทข้อมูลของตัวแปร

# การตรวจสอบคุณสมบัติ cat = df.select_dtypes(include='O').keys() # แสดงตัวแปร cat

เอาต์พุต: -

 

ตอนนี้เราต้องทิ้งคอลัมน์ตัวเลขเหล่านั้นจากชุดข้อมูลและเราจะใช้ตัวแปรหมวดหมู่นี้สำหรับการใช้งานของเรา เราใช้เพียง 3-4 คอลัมน์หมวดหมู่จากชุดข้อมูลเพื่อใช้การเข้ารหัสแบบร้อนครั้งเดียว

การสร้าง DataFrame ใหม่

ตอนนี้สำหรับการใช้ตัวแปรหมวดหมู่ เราจะสร้าง dataframe ใหม่ของคอลัมน์หมวดหมู่ที่เลือก

# สร้างคอลัมน์การตั้งค่า df # ใหม่ เราใช้ new_df = pd.read_csv('house_price.csv',usecols=['ละแวกบ้าน','ภายนอก1','ภายนอก2nd']) new_df.head()

เอาต์พุต: -

ตอนนี้เราต้องค้นหาว่ามีกี่หมวดหมู่ที่ไม่ซ้ำกันในแต่ละคอลัมน์หมวดหมู่

การหาค่าที่ไม่ซ้ำ

สำหรับการค้นหาค่าเฉพาะเราจะใช้ฟังก์ชัน pandas unique()

# ค่าที่ไม่ซ้ำกันในแต่ละคอลัมน์สำหรับ x ใน new_df.columns: #prinfting ค่าที่ไม่ซ้ำกัน print(x ,':', len(new_df[x].unique()))

เอาต์พุต: -

บริเวณใกล้เคียง : 25
ภายนอก1st : 15
ภายนอกที่ 2 : 16

ตอนนี้เราจะใช้เทคนิคของเราเพื่อใช้การเข้ารหัสแบบร้อนครั้งเดียวกับตัวแปรหลายหมวดหมู่

เทคนิคสำหรับตัวแปรหลายหมวดหมู่

เทคนิคคือเราจะจำกัดการเข้ารหัสแบบ one-hot ไว้ที่ 10 ป้ายกำกับที่พบบ่อยที่สุดของตัวแปร ซึ่งหมายความว่าเราจะสร้างตัวแปรไบนารีหนึ่งตัวสำหรับแต่ละป้ายกำกับที่พบบ่อยที่สุด 10 ป้ายเท่านั้น ซึ่งเทียบเท่ากับการจัดกลุ่มป้ายกำกับอื่นทั้งหมดภายใต้หมวดหมู่ใหม่ ซึ่งในกรณีนี้จะถูกละทิ้ง ดังนั้น ตัวแปรจำลองใหม่ 10 ตัวแปรบ่งชี้ว่าหนึ่งใน 10 ป้ายกำกับที่พบบ่อยที่สุดมีอยู่หรือไม่ 1 หรือไม่ 0 เพื่อการสังเกตโดยเฉพาะ

ตัวแปรที่พบบ่อยที่สุด

ที่นี่เราจะเลือก 20 ตัวแปรที่พบบ่อยที่สุด

สมมติว่าเราใช้ตัวแปรเด็ดขาดหนึ่งตัว ที่อยู่ไกล้เคียง.

# ค้นหาหมวดหมู่ 20 อันดับแรก new_df.Neighborhood.value_counts().sort_values(ascending=False).head(20)

เอาท์พุท:

เมื่อคุณเห็นภาพที่ส่งออกนี้ คุณจะสังเกตเห็นว่า ชื่อ ป้ายกำกับกำลังทำซ้ำ 225 ครั้งในคอลัมน์ Neighborhood และเราลงไป ตัวเลขนี้กำลังลดลง

ดังนั้นเราจึงนำผลลัพธ์ 10 อันดับแรกจากด้านบน และเราแปลงผลลัพธ์ 10 อันดับแรกนี้เป็นการเข้ารหัสแบบร้อนครั้งเดียว และป้ายกำกับด้านซ้ายกลายเป็นศูนย์

เอาต์พุต: -

 

รายการตัวแปรตามหมวดหมู่ที่พบบ่อยที่สุด

# สร้างรายการด้วยตัวแปร 10 อันดับแรก top_10 = [x สำหรับ x ใน new_df.Neighborhood.value_counts().sort_values(ascending=False).head(10).index] top_10

เอาต์พุต: -

['ชื่อ',
'CollgCr',
'เมืองเก่า',
'เอ็ดเวิร์ด',
'ซัมเมอร์ส',
'กิลเบิร์ต'
'NridgHt',
'ซอว์เยอร์',
'NWA',
'ซอว์เยอร์ว']

มีป้ายกำกับหมวดหมู่ 10 อันดับแรกในคอลัมน์ Neighborhood

สร้างไบนารี่

ตอนนี้เราต้องสร้างตัวแปรไบนารี 10 ตัวของป้ายกำกับ top_10:

# ทำไบนารีของป้ายกำกับ

สำหรับป้ายกำกับใน top_10:

new_df = np.where(new_df['Neighborhood']==label,1,0)

new_df[['ย่าน']+top_10]


เอาต์พุต: -

ชื่อ CollgCr เมืองเก่า เอ็ดเวิร์ด ซัมเมอร์ส กิลเบิร์ NridgHt คนเลื่อยไม้ กศน ซอว์เยอร์ว
0 CollgCr 0 1 0 0 0 0 0 0 0 0
1 วีนเกอร์ 0 0 0 0 0 0 0 0 0 0
2 CollgCr 0 1 0 0 0 0 0 0 0 0
3 ครอว์ฟอร์ 0 0 0 0 0 0 0 0 0 0
4 ไม่มีริดจ์ 0 0 0 0 0 0 0 0 0 0
5 มิทเชล 0 0 0 0 0 0 0 0 0 0
6 ซัมเมอร์ส 0 0 0 0 1 0 0 0 0 0
7 กศน 0 0 0 0 0 0 0 0 1 0
8 เมืองเก่า 0 0 1 0 0 0 0 0 0 0
9 บริคไซด์ 0 0 0 0 0 0 0 0 0 0
10 คนเลื่อยไม้ 0 0 0 0 0 0 0 1 0 0
11 NridgHt 0 0 0 0 0 0 1 0 0 0

คุณสามารถดูวิธีการแปลงป้ายกำกับ top_10 เป็นรูปแบบไบนารี

ลองยกตัวอย่างดูในตารางที่ 1 ดัชนี วีนเกอร์ ซึ่งไม่ได้อยู่ในป้ายกำกับหมวดหมู่ top_10 ของเรา ดังนั้นจะส่งผลให้ 0 คอลัมน์ทั้งหมด

ตอนนี้เราจะทำกับตัวแปรตามหมวดหมู่ทั้งหมดที่เราเลือกไว้ด้านบน

ตัวแปรที่เลือกทั้งหมดใน OneHotEncoding

# สำหรับตัวแปรหมวดหมู่ทั้งหมดที่เราเลือก def top_x(df2,variable,top_x_labels): สำหรับ label ใน top_x_labels: df2[variable+'_'+label] = np.where(data[variable]==label,1,0) # read ข้อมูลอีกครั้ง data = pd.read_csv('D://xdatasets/train.csv',usecols = ['Neighborhood','Exterior1st','Exterior2nd']) #encode Nighborhood เป็น 10 หมวดหมู่ที่พบบ่อยที่สุด top_x(data, 'ย่าน',top_10) # แสดงข้อมูล data.head()

ผลลัพธ์:-

ตอนนี้ เราใช้การเข้ารหัสแบบ one-hot กับตัวแปรหลายหมวดหมู่ทั้งหมด

ตอนนี้เราจะเห็นข้อดีและข้อเสียของ One Hot Encoding สำหรับหลายตัวแปร

ข้อดี

  • ตรงไปตรงมาในการดำเนินการ
  • ไม่ต้องใช้เวลามากในการสำรวจตัวแปร
  • ไม่ขยายพื้นที่ฟีเจอร์อย่างหนาแน่น

ข้อเสีย

  • ไม่เพิ่มข้อมูลใด ๆ ที่อาจทำให้ตัวแปรคาดการณ์ได้มากขึ้น
  • อย่าเก็บข้อมูลของตัวแปรที่ถูกละเว้น

หมายเหตุสิ้นสุด

ดังนั้น สรุปคือ เราเรียนรู้วิธีจัดการตัวแปรหลายหมวดหมู่ หากคุณเจอปัญหานี้ นี่เป็นงานที่ยากมาก ขอบคุณที่อ่านบทความนี้

เชื่อมต่อกับฉันใน Linkedin: โปรไฟล์

อ่านบทความอื่น ๆ ของฉัน: https://www.analyticsvidhya.com/blog/author/mayurbadole2407/

ขอบคุณครับ😎

สื่อที่แสดงในบทความนี้ไม่ใช่ของ Analytics Vidhya และใช้ดุลยพินิจของผู้เขียน

คุณยังสามารถอ่านบทความนี้ในแอพมือถือของเรา ได้รับมันใน Google Play

บทความที่เกี่ยวข้อง

ที่มา: https://www.analyticsvidhya.com/blog/2021/05/how-to-perform-one-hot-encoding-for-multi-categorical-variables/

ประทับเวลา:

เพิ่มเติมจาก การวิเคราะห์ วิทยา