การปรับปรุงประสิทธิภาพของรุ่น ML

การปรับปรุงประสิทธิภาพด้วย Ensembles

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

วิธีการเรียงตามลำดับ

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

วิธีการทั้งชุดขนาน

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

รวบรวมวิธีการเรียนรู้

ต่อไปนี้เป็นวิธีการเรียนรู้ทั้งมวลที่ได้รับความนิยมมากที่สุดนั่นคือวิธีการรวมการทำนายจากแบบจำลองต่างๆ -

การบรรจุถุง

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

การส่งเสริม

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

การโหวต

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

อัลกอริทึมการบรรจุหีบห่อ

ต่อไปนี้เป็นอัลกอริธึมการรวมกลุ่มสามชุด -

ต้นไม้ตัดสินใจบรรจุถุง

อย่างที่เราทราบกันดีว่าวิธีการรวมกลุ่มกันถุงทำงานได้ดีกับอัลกอริทึมที่มีความแปรปรวนสูงและในข้อนี้วิธีที่ดีที่สุดคืออัลกอริธึมแผนผังการตัดสินใจ ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลองกลุ่มต้นไม้ตัดสินใจแบบบรรจุถุงโดยใช้ฟังก์ชัน BaggingClassifier ของ sklearn ด้วย DecisionTreeClasifier (อัลกอริทึมการจำแนกและการถดถอย) บนชุดข้อมูลเบาหวาน Pima Indians

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes เหมือนที่เคยทำในตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

seed = 7
kfold = KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()

เราจำเป็นต้องระบุจำนวนต้นไม้ที่เรากำลังจะสร้าง ที่นี่เรากำลังสร้างต้นไม้ 150 ต้น -

num_trees = 150

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

model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)

คำนวณและพิมพ์ผลลัพธ์ดังนี้ -

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7733766233766234

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 77% ของแบบจำลองลักษณนามทรีการตัดสินใจแบบบรรจุถุง

ป่าสุ่ม

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

ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลองกลุ่มสุ่มฟอเรสต์แบบถุงโดยใช้คลาส RandomForestClassifier ของ sklearn บนชุดข้อมูลเบาหวาน Pima Indians

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes ตามตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

เราจำเป็นต้องระบุจำนวนต้นไม้ที่เรากำลังจะสร้าง ที่นี่เรากำลังสร้างต้นไม้ 150 ต้นพร้อมจุดแยกที่เลือกจากคุณสมบัติ 5 ประการ -

num_trees = 150
max_features = 5

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

model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)

คำนวณและพิมพ์ผลลัพธ์ดังนี้ -

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7629357484620642

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 76% ของแบบจำลองลักษณนามฟอเรสต์แบบสุ่มที่บรรจุถุง

ต้นไม้เสริม

เป็นอีกหนึ่งส่วนขยายของวิธีการรวมกลุ่มต้นไม้ตัดสินใจ ในวิธีนี้ต้นไม้สุ่มถูกสร้างขึ้นจากตัวอย่างของชุดข้อมูลการฝึกอบรม

ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลองชุดต้นไม้พิเศษโดยใช้คลาส ExtraTreesClassifier ของ sklearn บนชุดข้อมูลเบาหวาน Pima Indians

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes ตามตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

เราจำเป็นต้องระบุจำนวนต้นไม้ที่เรากำลังจะสร้าง ที่นี่เรากำลังสร้างต้นไม้ 150 ต้นพร้อมจุดแยกที่เลือกจากคุณสมบัติ 5 ประการ -

num_trees = 150
max_features = 5

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

model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)

คำนวณและพิมพ์ผลลัพธ์ดังนี้ -

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7551435406698566

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 75.5% ของแบบจำลองลักษณนามต้นไม้พิเศษที่บรรจุถุง

การเพิ่มอัลกอริทึมทั้งมวล

ต่อไปนี้เป็นสองอัลกอริธึมการเพิ่มประสิทธิภาพที่พบบ่อยที่สุด -

AdaBoost

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

ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลอง Ada Boost สำหรับการจำแนกประเภทโดยใช้คลาส AdaBoostClassifier ของ sklearn บนชุดข้อมูลเบาหวาน Pima Indians

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes ตามตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

เราจำเป็นต้องระบุจำนวนต้นไม้ที่เรากำลังจะสร้าง ที่นี่เรากำลังสร้างต้นไม้ 150 ต้นพร้อมจุดแยกที่เลือกจากคุณสมบัติ 5 ประการ -

num_trees = 50

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

model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)

คำนวณและพิมพ์ผลลัพธ์ดังนี้ -

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7539473684210527

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 75% ของโมเดลชุดลักษณนาม AdaBoost ของเรา

Stochastic Gradient Boosting

เรียกอีกอย่างว่า Gradient Boosting Machines ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลอง Stochastic Gradient Boostingensemble สำหรับการจัดประเภทโดยใช้คลาส GradientBoostingClassifier ของ sklearn บนชุดข้อมูลเบาหวาน Pima Indians

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes ตามตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

เราจำเป็นต้องระบุจำนวนต้นไม้ที่เรากำลังจะสร้าง ที่นี่เรากำลังสร้างต้นไม้ 150 ต้นพร้อมจุดแยกที่เลือกจากคุณสมบัติ 5 ประการ -

num_trees = 50

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

model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)

คำนวณและพิมพ์ผลลัพธ์ดังนี้ -

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7746582365003418

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 77.5% ของแบบจำลองชุดลักษณนาม Gradient Boosting ของเรา

อัลกอริทึมการลงคะแนนทั้งมวล

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

ในสูตร Python ต่อไปนี้เราจะสร้างแบบจำลองชุดการโหวตสำหรับการจำแนกประเภทโดยใช้คลาส VotingClassifier ของ sklearn บนชุดข้อมูลเบาหวาน Pima Indians เรากำลังรวมการคาดคะเนของการถดถอยโลจิสติกลักษณนามทรีการตัดสินใจและ SVM เข้าด้วยกันสำหรับปัญหาการจำแนกดังนี้ -

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

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier

ตอนนี้เราต้องโหลดชุดข้อมูล Pima diabetes ตามตัวอย่างก่อนหน้านี้ -

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

จากนั้นให้ป้อนข้อมูลสำหรับการตรวจสอบความถูกต้องข้าม 10 เท่าดังนี้ -

kfold = KFold(n_splits=10, random_state=7)

ต่อไปเราต้องสร้างโมเดลย่อยดังนี้ -

estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model3))

ตอนนี้สร้างแบบจำลองชุดการลงคะแนนโดยรวมการคาดการณ์ของโมเดลย่อยที่สร้างไว้ข้างต้น

ensemble = VotingClassifier(estimators)
results = cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())

เอาต์พุต

0.7382262474367738

ผลลัพธ์ด้านบนแสดงให้เห็นว่าเรามีความแม่นยำประมาณ 74% ของแบบจำลองชุดลักษณนามการลงคะแนนของเรา