การเรียนรู้ของคอมพิวเตอร์ - ต้นไม้ตัดสิน
- หน้าก่อน ฝึก/ทดสอบ
- หน้าต่อไป MySQL ภาคพื้นฐาน

決策樹(Decision Tree)
在本章中,我們將向您展示如何制作“決策樹”。決策樹是一種流程圖,可以幫助您根據以前的经验進行決策。
在這個例子中,一個人將嘗試決定他/她是否應該參加喜劇節目。
幸運的是,我們的例中人物每次在鎮上舉辦喜劇節目時都進行註冊,並註冊一些關於喜劇演員的信息,並且還登記了他/她是否去過。
Age | Experience | Rank | Nationality | Go |
---|---|---|---|---|
36 | 10 | 9 | UK | NO |
42 | 12 | 4 | USA | NO |
23 | 4 | 6 | N | NO |
52 | 4 | 4 | USA | NO |
43 | 21 | 8 | USA | YES |
44 | 14 | 5 | UK | NO |
66 | 3 | 7 | N | YES |
35 | 14 | 9 | UK | YES |
52 | 13 | 7 | N | YES |
35 | 5 | 9 | N | YES |
24 | 3 | 5 | USA | NO |
18 | 3 | 7 | UK | YES |
45 | 9 | 9 | UK | YES |
ตอนนี้ บนข้อมูลชุดนี้ Python สามารถสร้างต้นไม้ตัดสินขึ้นมา ต้นไม้ตัดสินนี้สามารถใช้เพื่อตัดสินว่ามันเป็นไปได้ที่จะเข้าร่วมการแสดงใหม่หรือไม่:
วิธีทำงาน
ตอนแรก นำไฟล์มอดูลที่จำเป็น และใช้ pandas อ่านข้อมูลชุด:
ตัวอย่าง
อ่านและแสดงผลข้อมูลชุด:
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)
เพื่อที่จะสร้างต้นไม้ตัดสิน ทุกข้อมูลต้องเป็นตัวเลข:
เราต้องแปลงคอลัมน์ที่ไม่ใช่ตัวเลข 'Nationality' และ 'Go' ให้เป็นตัวเลข:
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
Rank <= 6.5
แสดงว่านักแสดงเรียลิตี้ที่ 'Rank' ต่ำกว่า 6.5 จะตาม True
ฉากยนต์ (ข้างซ้าย) และอื่นๆ ตามลำดับ False
ฉากยนต์ (ข้างขวา)
gini = 0.497
แสดงถึงคุณภาพของการแบ่งตัวอย่าง และเป็นตัวเลขที่อยู่ในระดับ 0.0 ถึง 0.5 ที่ 0.0 แสดงว่าตัวอย่างทั้งหมดได้ผลลัพธ์เดียวกัน และ 0.5 แสดงว่าการแบ่งตัวอย่างเกิดขึ้นทางกลาง
samples = 13
แสดงว่าในจุดการตัดสินนี้ยังมี 13 นักแสดงเรียลิตี้ ตรงนี้เพราะนี่เป็นขั้นตอนแรก ดังนั้นทุกคนทั้งหมดเป็นนักแสดงเรียลิตี้
value = [6, 7]
แสดงว่าใน 13 นักแสดงเรียลิตี้นี้ มี 6 คนที่จะได้ "NO" และ 7 คนที่จะได้ "GO"
Gini
มีวิธีการแบ่งตัวอย่างหลายรูปแบบ ทางค่านี้ใช้วิธี GINI ในบทความนี้
วิธีการ Gini ใช้สูตรดังต่อไปนี้:
Gini = 1 - (x/n)^2 - (y/n)^2
ในนั้น x คือจำนวนของคำตอบที่ยืนยัน ("GO") น คือจำนวนตัวอย่าง และ y คือจำนวนของคำตอบที่ไม่ยืนยัน ("NO") ใช้สูตรดังต่อไปนี้เพื่อคำนวณ:
1 - (7 / 13)2 - (6 / 13)2 = 0.497

ขั้นตอนต่อไปประกอบด้วยสองกรอบ หนึ่งกรอบใช้สำหรับนักแสดงเรียลิตี้ที่ 'Rank' คือ 6.5 หรือต่ำกว่า และอีกกรอบหนึ่ง
True - 5 นักแสดงเรียลิตี้ที่ที่นี่จบลง:
gini = 0.0
แสดงว่าทุกตัวอย่างทั้งหมดได้ผลลัพธ์เดียวกัน
samples = 5
แสดงว่ายังมีนักแสดงเรียลิตี้ยัง 5 คน (ระดับของ 5 คนนี้คือ 6.5 หรือต่ำกว่านั้น)
value = [5, 0]
表示 5 得到 "NO" 而 0 得到 "GO"。
False - 8 位戏剧演员继续:
Nationality(国籍)
Nationality <= 0.5
表示国籍值小于 0.5 的喜剧演员将遵循左箭头(这表示来自英国的所有人),其余的将遵循右箭头。
gini = 0.219
意味着大约 22% 的样本将朝一个方向移动。
samples = 8
表示该分支中还剩下 8 个喜剧演员(8 个喜剧演员的等级高于 6.5)。
value = [1, 7]
表示在这 8 位喜剧演员中,1 位将获得 "NO",而 7 位将获得 "GO"。

True - 4 名戏剧演员继续:
Age(年龄)
Age <= 35.5
表示年龄在 35.5 岁或以下的喜剧演员将遵循左箭头,其余的将遵循右箭头。
gini = 0.375
意味着大约 37.5% 的样本将朝一个方向移动。
samples = 4
表示该分支中还剩下 4 位喜剧演员(来自英国的 4 位喜剧演员)。
value = [1, 3]
表示在这 4 位喜剧演员中,1 位将获得 "NO",而 3 位将获得 "GO"。
False - 4 名喜剧演员到这里结束:
gini = 0.0
แสดงถึงทุกตัวอย่างที่ได้รับคำตอบเหมือนกัน
samples = 4
表示该分支中还剩下 4 位喜剧演员(来自英国的 4 位喜剧演员)。
value = [0, 4]
表示在这 4 位喜剧演员中,0 将获得 "NO",而 4 将获得 "GO"。

True - 2 名喜剧演员在这里结束:
gini = 0.0
แสดงถึงทุกตัวอย่างที่ได้รับคำตอบเหมือนกัน
samples = 2
表示该分支中还剩下 2 名喜剧演员(2 名 35.5 岁或更年轻的喜剧演员)。
value = [0, 2]
表示在这 2 位喜剧演员中,0 将获得 "NO",而 2 将获得 "GO"。
False - 2 名戏剧演员继续:
Experience(经验)
Experience <= 9.5
表示具有 9.5 年或以上经验的喜剧演员将遵循左侧的箭头,其余的将遵循右侧的箭头。
gini = 0.5
表示 50% 的样本将朝一个方向移动。
samples = 2
表示此分支中还剩下 2 个喜剧演员(2 个年龄超过 35.5 的喜剧演员)。
value = [1, 1]
表示这两个喜剧演员中,1 将获得 "NO",而 1 将获得 "GO"。

True - 1 名喜剧演员在这里结束:
gini = 0.0
แสดงถึงทุกตัวอย่างที่ได้รับคำตอบเหมือนกัน
samples = 1
แสดงถึงยังมีนักแสดงเจ้าตัวอีกคนในขอบเขตนี้ (1 คนมีประสบการณ์เจ้า 9.5 ปีหรือน้อยกว่า)
value = [0, 1]
แสดงถึง 0 แสดงถึง "NO" 1 แสดงถึง "GO"
False - นักแสดงเจ้านี้มาถึงจุดนี้: 1 คน
gini = 0.0
แสดงถึงทุกตัวอย่างที่ได้รับคำตอบเหมือนกัน
samples = 1
แสดงถึงยังมีนักแสดงเจ้าตัวอีกคนในขอบเขตนี้ (1 คนมีประสบการณ์เจ้ามากกว่า 9.5 ปี)
value = [1, 0]
1 แสดงถึง "NO" 0 แสดงถึง "GO"
ค่าทำนาย
เราสามารถใช้ต้นไม้ตัดสินเพื่อทำนายค่าใหม่
ตัวอย่าง: คุณควรดูรายการโทรทัศน์ที่มีนักแสดงเจ้าตัวอายุ 40 ปีจากสหรัฐอเมริกา มีประสบการณ์ 10 ปี และมีการจัดอันดับความน่ายินยอมที่ 7 หรือไม่?
ตัวอย่าง
ใช้ predict()
วิธีที่จะทำนายค่าใหม่
print(dtree.predict([[40, 10, 7, 1]]))
ตัวอย่าง
ถ้าระดับของความน่ายินยอมคือ 6 คำตอบคืออะไร?
print(dtree.predict([[40, 10, 6, 1]]))
คำตอบที่แตกต่างกัน
ถ้าเรียกใช้มากพอ แม้ว่าคุณจะใส่ข้อมูลที่เหมือนกัน ต้นไม้ตัดสินก็จะให้คำตอบที่แตกต่างกัน
นี่เพราะต้นไม้ตัดสินไม่สามารถให้คำตอบที่แน่นอนถึง 100% ได้ คำตอบของมันขึ้นอยู่กับความเป็นไปได้ของผลลัพธ์ คำตอบจึงจะแตกต่างกัน
- หน้าก่อน ฝึก/ทดสอบ
- หน้าต่อไป MySQL ภาคพื้นฐาน