การเรียนรู้ของเครื่อง - โครงสร้างการตัดสินใจ
ต้นไม้การตัดสินใจ
ในบทนี้เราจะแสดงวิธีการสร้าง "แผนภูมิการตัดสินใจ" โครงสร้างการตัดสินใจคือผังงาน และสามารถช่วยคุณตัดสินใจตามประสบการณ์ก่อนหน้านี้
ในตัวอย่างนี้ คนๆ หนึ่งจะพยายามตัดสินใจว่าเขา/เธอควรไปชมการแสดงตลกหรือไม่
โชคดีที่คนตัวอย่างของเราลงทะเบียนทุกครั้งที่มีการแสดงตลกในเมือง และลงทะเบียนข้อมูลบางอย่างเกี่ยวกับตัวตลก และยังลงทะเบียนด้วยว่าเขา/เธอไปหรือไม่
อายุ | ประสบการณ์ | อันดับ | สัญชาติ | ไป |
36 | 10 | 9 | สหราชอาณาจักร | ไม่ |
42 | 12 | 4 | สหรัฐอเมริกา | ไม่ |
23 | 4 | 6 | นู๋ | ไม่ |
52 | 4 | 4 | สหรัฐอเมริกา | ไม่ |
43 | 21 | 8 | สหรัฐอเมริกา | ใช่ |
44 | 14 | 5 | สหราชอาณาจักร | ไม่ |
66 | 3 | 7 | นู๋ | ใช่ |
35 | 14 | 9 | สหราชอาณาจักร | ใช่ |
52 | 13 | 7 | นู๋ | ใช่ |
35 | 5 | 9 | นู๋ | ใช่ |
24 | 3 | 5 | สหรัฐอเมริกา | ไม่ |
18 | 3 | 7 | สหราชอาณาจักร | ใช่ |
45 | 9 | 9 | สหราชอาณาจักร | ใช่ |
จากชุดข้อมูลนี้ Python สามารถสร้างโครงสร้างการตัดสินใจที่สามารถใช้ตัดสินว่ารายการใหม่ ๆ ที่ควรค่าแก่การเข้าร่วมหรือไม่
มันทำงานอย่างไร?
ขั้นแรก นำเข้าโมดูลที่คุณต้องการ และอ่านชุดข้อมูลที่มีแพนด้า:
ตัวอย่าง
อ่านและพิมพ์ชุดข้อมูล:
import pandas
from sklearn import tree
import pydotplus
from
sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
ในการสร้างโครงสร้างการตัดสินใจ ข้อมูลทั้งหมดต้องเป็นตัวเลข
เราต้องแปลงคอลัมน์ 'สัญชาติ' และ 'ไป' ที่ไม่ใช่ตัวเลขเป็นค่าตัวเลข
Pandas มีmap()
วิธีการนำพจนานุกรมที่มีข้อมูลเกี่ยวกับวิธีการแปลงค่าต่างๆ
{'UK': 0, 'USA': 1, 'N': 2}
หมายถึงแปลงค่า 'UK' เป็น 0, 'USA' เป็น 1 และ 'N' เป็น 2
ตัวอย่าง
เปลี่ยนค่าสตริงเป็นค่าตัวเลข:
d = {'UK': 0,
'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d =
{'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
จากนั้นเราต้องแยก คอลัมน์ คุณลักษณะออกจากคอลัมน์เป้าหมาย
คอลัมน์คุณลักษณะคือคอลัมน์ที่เราพยายามคาดการณ์จากและคอลัมน์เป้าหมายคือคอลัมน์ที่มีค่าที่เราพยายามคาดการณ์
ตัวอย่าง
X
เป็นคอลัมน์คุณลักษณะ
y
เป็นคอลัมน์เป้าหมาย:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
ตอนนี้ เราสามารถสร้างโครงสร้างการตัดสินใจที่แท้จริง ให้พอดีกับรายละเอียดของเรา และบันทึกไฟล์ .png ลงในคอมพิวเตอร์:
ตัวอย่าง
สร้างแผนภูมิการตัดสินใจ บันทึกเป็นรูปภาพ และแสดงรูปภาพ:
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data =
tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph =
pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
อธิบายผลลัพธ์
โครงสร้างการตัดสินใจใช้การตัดสินใจก่อนหน้านี้ของคุณในการคำนวณอัตราต่อรองที่คุณต้องการไปพบนักแสดงตลกหรือไม่
ให้เราอ่านแง่มุมต่างๆ ของโครงสร้างการตัดสินใจ:
อันดับ
Rank <= 6.5
หมายความว่านักแสดงตลกทุกคนที่มีอันดับ 6.5 หรือต่ำกว่าจะตาม
True
ลูกศร (ไปทางซ้าย) และที่เหลือจะตามFalse
ลูกศร (ทางขวา)
gini = 0.497
หมายถึงคุณภาพของการแยก และจะเป็นตัวเลขระหว่าง 0.0 ถึง 0.5 เสมอ โดยที่ 0.0 จะหมายถึงตัวอย่างทั้งหมดได้ผลลัพธ์เดียวกัน และ 0.5 จะหมายความว่าการแยกนั้นทำตรงกลางพอดี
samples = 13
หมายความว่าตอนนี้มีนักแสดงตลกเหลืออยู่ 13 คนในการตัดสินใจ ซึ่งเป็นทั้งหมดตั้งแต่นี้เป็นขั้นตอนแรก
value = [6, 7]
หมายความว่าจากนักแสดงตลกทั้ง 13 คน 6 คนจะได้ "ไม่" และ 7 คนจะได้ "GO"
Gini
มีหลายวิธีในการแยกตัวอย่าง เราใช้วิธี GINI ในบทช่วยสอนนี้
วิธี Gini ใช้สูตรนี้:
Gini = 1 - (x/n)2 - (y/n)2
x
จำนวนคำตอบที่เป็นบวก ("GO")
คือn
จำนวนตัวอย่างและ
y
จำนวนคำตอบเชิงลบ ("NO") ซึ่งให้การคำนวณนี้แก่เรา:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
ขั้นตอนต่อไปประกอบด้วยสองกล่อง หนึ่งกล่องสำหรับนักแสดงตลกที่มี 'อันดับ' 6.5 หรือต่ำกว่า และอีกหนึ่งกล่องที่มีส่วนที่เหลือ
ทรู - 5 นักแสดงตลกจบที่นี่:
gini = 0.0
หมายความว่ากลุ่มตัวอย่างทั้งหมดได้ผลลัพธ์เหมือนกัน
samples = 5
หมายความว่ามีนักแสดงตลกเหลืออยู่ 5 คนในสาขานี้ (นักแสดงตลก 5 คนที่มีอันดับ 6.5 หรือต่ำกว่า)
value = [5, 0]
หมายความว่า 5 จะได้รับ "ไม่" และ 0 จะได้รับ "GO"
เท็จ - นักแสดงตลก 8 คนดำเนินการต่อ:
สัญชาติ
Nationality <= 0.5
หมายความว่า นักแสดงตลกที่มีสัญชาติน้อยกว่า 0.5 จะเดินตามลูกศรไปทางซ้าย (ซึ่งหมายถึงทุกคนจากสหราชอาณาจักร ) และที่เหลือจะตามลูกศรไปทางขวา
gini = 0.219
หมายความว่าประมาณ 22% ของกลุ่มตัวอย่างจะไปในทิศทางเดียว
samples = 8
หมายความว่ามีนักแสดงตลกเหลืออยู่ 8 คนในสาขานี้ (นักแสดงตลก 8 คนที่มีอันดับสูงกว่า 6.5)
value = [1, 7]
หมายถึงนักแสดงตลกทั้ง 8 คนนี้ 1 คนจะได้ "ไม่" และ 7 คนจะได้ "GO"
ทรู - 4 นักแสดงตลก ดำเนินการต่อ:
อายุ
Age <= 35.5
หมายความว่า นักแสดงตลกที่อายุไม่เกิน 35.5 ปีจะตามลูกศรไปทางซ้าย และที่เหลือจะตามลูกศรไปทางขวา
gini = 0.375
หมายความว่าตัวอย่างประมาณ 37,5% จะไปทางเดียว
samples = 4
หมายความว่าสาขานี้มีนักแสดงตลกเหลืออยู่ 4 คน (นักแสดงตลกจากสหราชอาณาจักร 4 คน)
value = [1, 3]
หมายความว่าในนักแสดงตลก 4 คนนี้ 1 จะได้รับ "ไม่" และ 3 จะได้รับ "GO"
เท็จ - นักแสดงตลก 4 คนจบที่นี่:
gini = 0.0
หมายความว่ากลุ่มตัวอย่างทั้งหมดได้ผลลัพธ์เหมือนกัน
samples = 4
หมายความว่าสาขานี้มีนักแสดงตลกเหลืออยู่ 4 คน (นักแสดงตลก 4 คนไม่ได้มาจากสหราชอาณาจักร)
value = [0, 4]
หมายความว่าในนักแสดงตลก 4 คนนี้ 0 จะได้รับ "ไม่" และ 4 จะได้รับ "GO"
ทรู - 2 นักแสดงตลกจบที่นี่:
gini = 0.0
หมายความว่ากลุ่มตัวอย่างทั้งหมดได้ผลลัพธ์เหมือนกัน
samples = 2
หมายความว่ามีนักแสดงตลก 2 คนในสาขานี้ (นักแสดงตลก 2 คนอายุไม่เกิน 35.5 ปี)
value = [0, 2]
หมายถึงนักแสดงตลก 2 คนนี้ 0 จะได้รับ "ไม่" และ 2 จะได้รับ "GO"
เท็จ - นักแสดงตลก 2 คนดำเนินการต่อ:
ประสบการณ์
Experience <= 9.5
หมายความว่า นักแสดงตลกที่มีประสบการณ์ 9.5 ปีหรือน้อยกว่านั้นจะตามลูกศรไปทางซ้าย ที่เหลือจะตามลูกศรไปทางขวา
gini = 0.5
หมายความว่า 50% ของตัวอย่างจะไปในทิศทางเดียว
samples = 2
หมายความว่ามีนักแสดงตลก 2 คนในสาขานี้ (นักแสดงตลกอายุมากกว่า 35.5 2 คน)
value = [1, 1]
หมายถึงนักแสดงตลก 2 คนนี้ 1 จะได้รับ "ไม่" และ 1 จะได้รับ "GO"
ทรู - นักแสดงตลก 1 คนสิ้นสุดที่นี่:
gini = 0.0
หมายความว่ากลุ่มตัวอย่างทั้งหมดได้ผลลัพธ์เหมือนกัน
samples = 1
หมายความว่าสาขานี้มีนักแสดงตลกเหลืออยู่ 1 คน (นักแสดงตลก 1 คนที่มีประสบการณ์ 9.5 ปีหรือน้อยกว่า)
value = [0, 1]
หมายความว่า 0 จะได้รับ "NO" และ 1 จะได้รับ "GO"
เท็จ - นักแสดงตลก 1 คนสิ้นสุดที่นี่:
gini = 0.0
หมายความว่ากลุ่มตัวอย่างทั้งหมดได้ผลลัพธ์เหมือนกัน
samples = 1
แสดงว่าสาขานี้มีนักแสดงตลกเหลืออยู่ 1 คน (นักแสดงตลก 1 คนที่มีประสบการณ์มากกว่า 9.5 ปี)
value = [1, 0]
หมายความว่า 1 จะได้รับ "ไม่" และ 0 จะได้รับ "GO"
ทำนายค่า
เราสามารถใช้ Decision Tree เพื่อทำนายค่าใหม่ได้
ตัวอย่าง: ฉันควรไปดูการแสดงที่นำแสดงโดยนักแสดงตลกชาวอเมริกันอายุ 40 ปี มีประสบการณ์ 10 ปี และอันดับตลกอยู่ที่ 7 หรือไม่
ตัวอย่าง
ใช้วิธีทำนาย () เพื่อทำนายค่าใหม่:
print(dtree.predict([[40, 10, 7, 1]]))
ตัวอย่าง
คำตอบจะเป็นอย่างไรถ้าอันดับตลกคือ 6?
print(dtree.predict([[40, 10, 6, 1]]))
ผลลัพธ์ที่แตกต่าง
คุณจะเห็นว่าแผนภูมิการตัดสินใจให้ผลลัพธ์ที่แตกต่างกัน หากคุณเรียกใช้มันมากพอ แม้ว่าคุณจะป้อนข้อมูลเดียวกันก็ตาม
นั่นเป็นเพราะแผนภูมิการตัดสินใจไม่ได้ให้คำตอบที่แน่นอนแก่เรา 100% ขึ้นอยู่กับความน่าจะเป็นของผลลัพธ์ และคำตอบจะแตกต่างกันไป