การเรียนรู้ของเครื่องด้วย Python - การเตรียมข้อมูล

บทนำ

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

ทำให้การเตรียมข้อมูลเป็นขั้นตอนที่สำคัญที่สุดในกระบวนการ ML การเตรียมข้อมูลอาจถูกกำหนดเป็นขั้นตอนที่ทำให้ชุดข้อมูลของเราเหมาะสมกับกระบวนการ ML มากขึ้น

ทำไมต้องประมวลผลข้อมูลล่วงหน้า

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

เทคนิคการประมวลผลข้อมูลล่วงหน้า

เรามีเทคนิคการประมวลผลข้อมูลล่วงหน้าต่อไปนี้ที่สามารถนำไปใช้กับชุดข้อมูลเพื่อสร้างข้อมูลสำหรับอัลกอริทึม ML -

การปรับขนาด

ชุดข้อมูลของเราส่วนใหญ่อาจประกอบด้วยแอตทริบิวต์ที่มีมาตราส่วนแตกต่างกัน แต่เราไม่สามารถให้ข้อมูลดังกล่าวแก่อัลกอริทึม ML ได้ดังนั้นจึงต้องมีการปรับขนาดใหม่ การปรับขนาดข้อมูลทำให้แน่ใจว่าแอตทริบิวต์อยู่ในระดับเดียวกัน โดยทั่วไปแอตทริบิวต์จะถูกปรับขนาดให้อยู่ในช่วง 0 และ 1 อัลกอริทึม ML เช่นการไล่ระดับสีและ k-Nearest Neighbours ต้องการข้อมูลที่ปรับขนาด เราสามารถปรับขนาดข้อมูลใหม่ด้วยความช่วยเหลือของคลาส MinMaxScaler ของไลบรารี scikit-learn Python

ตัวอย่าง

ในตัวอย่างนี้เราจะปรับขนาดข้อมูลของชุดข้อมูล Pima Indians Diabetes ที่เราใช้ก่อนหน้านี้ ขั้นแรกข้อมูล CSV จะถูกโหลด (ตามที่ทำในบทก่อนหน้า) จากนั้นด้วยความช่วยเหลือของคลาส MinMaxScaler ข้อมูลนั้นจะถูกปรับขนาดใหม่ในช่วง 0 และ 1

สองสามบรรทัดแรกของสคริปต์ต่อไปนี้เหมือนกับที่เราเขียนในบทก่อนหน้าขณะโหลดข้อมูล CSV

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

ตอนนี้เราสามารถใช้คลาส MinMaxScaler เพื่อลดขนาดข้อมูลในช่วง 0 และ 1

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

เรายังสามารถสรุปข้อมูลสำหรับเอาต์พุตตามที่เราเลือก ที่นี่เรากำลังตั้งค่าความแม่นยำเป็น 1 และแสดง 10 แถวแรกในผลลัพธ์

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])

เอาต์พุต

Scaled data:
[
   [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
   [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
   [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
   [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
   [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
   [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
   [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
   [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
   [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
   [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

จากผลลัพธ์ข้างต้นข้อมูลทั้งหมดจะถูกปรับขนาดให้อยู่ในช่วง 0 และ 1

Normalization

เทคนิคการประมวลผลข้อมูลที่มีประโยชน์อีกอย่างหนึ่งคือ Normalization สิ่งนี้ใช้เพื่อลดขนาดข้อมูลแต่ละแถวให้มีความยาว 1 ซึ่งส่วนใหญ่มีประโยชน์ในชุดข้อมูลกระจัดกระจายที่เรามีศูนย์จำนวนมาก เราสามารถ rescale ข้อมูลด้วยความช่วยเหลือของ Normalizer class ของ scikit-learn Python library

ประเภทของ Normalization

ในแมชชีนเลิร์นนิงมีเทคนิคก่อนการประมวลผลแบบมาตรฐานสองประเภทดังนี้ -

L1 Normalization

อาจถูกกำหนดให้เป็นเทคนิคการทำให้เป็นมาตรฐานที่แก้ไขค่าชุดข้อมูลในลักษณะที่ในแต่ละแถวผลรวมของค่าสัมบูรณ์จะสูงถึง 1 เสมอเรียกอีกอย่างว่า Least Absolute Deviation

Example

ในตัวอย่างนี้เราใช้เทคนิค L1 Normalize เพื่อทำให้ข้อมูลปกติของชุดข้อมูล Pima Indians Diabetes ซึ่งเราใช้ก่อนหน้านี้ ขั้นแรกข้อมูล CSV จะถูกโหลดจากนั้นด้วยความช่วยเหลือของคลาส Normalizer ข้อมูลนั้นจะถูกทำให้เป็นมาตรฐาน

สองสามบรรทัดแรกของสคริปต์ต่อไปนี้เหมือนกับที่เราเขียนในบทก่อนหน้าขณะโหลดข้อมูล CSV

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

ตอนนี้เราสามารถใช้ Normalizer class กับ L1 เพื่อทำให้ข้อมูลเป็นปกติได้

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

เรายังสามารถสรุปข้อมูลสำหรับเอาต์พุตตามที่เราเลือก ที่นี่เรากำลังตั้งค่าความแม่นยำเป็น 2 และแสดง 3 แถวแรกในผลลัพธ์

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
   [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
   [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2 Normalization

อาจถูกกำหนดให้เป็นเทคนิคการทำให้เป็นมาตรฐานที่ปรับเปลี่ยนค่าชุดข้อมูลในลักษณะที่ในแต่ละแถวผลรวมของกำลังสองจะสูงถึง 1 เสมอเรียกอีกอย่างว่ากำลังสองน้อยที่สุด

Example

ในตัวอย่างนี้เราใช้เทคนิค L2 Normalization เพื่อทำให้ข้อมูลปกติของชุดข้อมูล Pima Indians Diabetes ซึ่งเราใช้ก่อนหน้านี้ ขั้นแรกข้อมูล CSV จะถูกโหลด (ตามที่ทำในบทก่อนหน้า) จากนั้นด้วยความช่วยเหลือของคลาส Normalizer ข้อมูลจะถูกทำให้เป็นมาตรฐาน

สองสามบรรทัดแรกของสคริปต์ต่อไปนี้เหมือนกับที่เราเขียนในบทก่อนหน้าขณะโหลดข้อมูล CSV

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

ตอนนี้เราสามารถใช้ Normalizer class กับ L1 เพื่อทำให้ข้อมูลเป็นปกติได้

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

เรายังสามารถสรุปข้อมูลสำหรับเอาต์พุตตามที่เราเลือก ที่นี่เรากำลังตั้งค่าความแม่นยำเป็น 2 และแสดง 3 แถวแรกในผลลัพธ์

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
   [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
   [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

ไบนาไรเซชั่น

ตามชื่อที่แนะนำนี่คือเทคนิคที่เราสามารถทำให้ข้อมูลของเราเป็นไบนารีได้ เราสามารถใช้เกณฑ์ไบนารีเพื่อสร้างข้อมูลของเราเป็นไบนารี ค่าที่สูงกว่าค่า threshold นั้นจะถูกแปลงเป็น 1 และต่ำกว่า threshold นั้นจะถูกแปลงเป็น 0 ตัวอย่างเช่นถ้าเราเลือก threshold value = 0.5 ค่าชุดข้อมูลที่อยู่ด้านบนจะกลายเป็น 1 และด้านล่างนี้จะกลายเป็น 0 นั่นคือ ทำไมเราถึงเรียกมันได้binarizing ข้อมูลหรือ thresholdingข้อมูล. เทคนิคนี้มีประโยชน์เมื่อเรามีความน่าจะเป็นในชุดข้อมูลของเราและต้องการแปลงเป็นค่าที่คมชัด

เราสามารถแยกข้อมูลออกเป็นสองส่วนด้วยความช่วยเหลือของคลาส Binarizer ของไลบรารี scikit-learn Python

ตัวอย่าง

ในตัวอย่างนี้เราจะปรับขนาดข้อมูลของชุดข้อมูล Pima Indians Diabetes ที่เราใช้ก่อนหน้านี้ ขั้นแรกข้อมูล CSV จะถูกโหลดจากนั้นด้วยความช่วยเหลือของคลาส Binarizer มันจะถูกแปลงเป็นค่าไบนารีคือ 0 และ 1 ขึ้นอยู่กับค่าเกณฑ์ เรารับ 0.5 เป็นค่าเกณฑ์

สองสามบรรทัดแรกของสคริปต์ต่อไปนี้เหมือนกับที่เราเขียนในบทก่อนหน้าขณะโหลดข้อมูล CSV

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

ตอนนี้เราสามารถใช้คลาส Binarize เพื่อแปลงข้อมูลเป็นค่าไบนารี

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

ที่นี่เรากำลังแสดง 5 แถวแรกในผลลัพธ์

print ("\nBinary data:\n", Data_binarized [0:5])

เอาต์พุต

Binary data:
[
   [1. 1. 1. 1. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 0. 1. 0. 1. 0.]
   [1. 1. 1. 0. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 1. 1. 0. 1. 0.]
   [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

การกำหนดมาตรฐาน

อีกหนึ่งเทคนิคการประมวลผลข้อมูลที่มีประโยชน์ซึ่งโดยพื้นฐานแล้วจะใช้เพื่อแปลงแอตทริบิวต์ข้อมูลด้วยการแจกแจงแบบเกาส์เซียน มันแตกต่างระหว่างค่าเฉลี่ยและ SD (Standard Deviation) กับการแจกแจงแบบเกาส์เซียนมาตรฐานโดยมีค่าเฉลี่ย 0 และ SD เท่ากับ 1 เทคนิคนี้มีประโยชน์ในอัลกอริทึม ML เช่นการถดถอยเชิงเส้นการถดถอยโลจิสติกที่ถือว่าการแจกแจงแบบเกาส์เซียนในชุดข้อมูลอินพุตและให้ผลลัพธ์ที่ดีกว่า ผลลัพธ์ที่มีการปรับขนาดข้อมูล เราสามารถสร้างมาตรฐานข้อมูล (ค่าเฉลี่ย = 0 และ SD = 1) ด้วยความช่วยเหลือของคลาส StandardScaler ของไลบรารี scikit-learn Python

ตัวอย่าง

ในตัวอย่างนี้เราจะปรับขนาดข้อมูลของชุดข้อมูล Pima Indians Diabetes ที่เราใช้ก่อนหน้านี้ ขั้นแรกข้อมูล CSV จะถูกโหลดจากนั้นด้วยความช่วยเหลือของคลาส StandardScaler จะถูกแปลงเป็น Gaussian Distribution ด้วยค่าเฉลี่ย = 0 และ SD = 1

สองสามบรรทัดแรกของสคริปต์ต่อไปนี้เหมือนกับที่เราเขียนในบทก่อนหน้าขณะโหลดข้อมูล CSV

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

ตอนนี้เราสามารถใช้คลาส StandardScaler เพื่อปรับขนาดข้อมูลใหม่

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

เรายังสามารถสรุปข้อมูลสำหรับเอาต์พุตตามที่เราเลือก ที่นี่เรากำลังตั้งค่าความแม่นยำเป็น 2 และแสดง 5 แถวแรกในผลลัพธ์

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])

เอาต์พุต

Rescaled data:
[
   [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
   [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
   [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
   [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
   [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

การติดฉลากข้อมูล

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

Label Encoding คืออะไร?

ฟังก์ชัน sklearn ส่วนใหญ่คาดหวังว่าข้อมูลที่มีป้ายกำกับตัวเลขแทนที่จะเป็นป้ายคำ ดังนั้นเราต้องแปลงป้ายดังกล่าวเป็นป้ายหมายเลข กระบวนการนี้เรียกว่าการเข้ารหัสฉลาก เราสามารถทำการเข้ารหัสฉลากข้อมูลด้วยความช่วยเหลือของฟังก์ชัน LabelEncoder () ของไลบรารี scikit-learn Python

ตัวอย่าง

ในตัวอย่างต่อไปนี้สคริปต์ Python จะทำการเข้ารหัสฉลาก

ขั้นแรกให้นำเข้าไลบรารี Python ที่จำเป็นดังต่อไปนี้ -

import numpy as np
from sklearn import preprocessing

ตอนนี้เราต้องจัดเตรียมป้ายกำกับการป้อนข้อมูลดังนี้ -

input_labels = ['red','black','red','green','black','yellow','white']

บรรทัดถัดไปของโค้ดจะสร้างตัวเข้ารหัสฉลากและฝึกมัน

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

บรรทัดถัดไปของสคริปต์จะตรวจสอบประสิทธิภาพโดยการเข้ารหัสรายการลำดับแบบสุ่ม -

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

เราสามารถรับรายการค่าที่เข้ารหัสด้วยความช่วยเหลือของสคริปต์ python ต่อไปนี้ -

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))

เอาต์พุต

Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']