Điều kiện tiên quyết để học bài này: Cây quyết định, Bộ phân loại Quyết định, sklearn, numpy, gấu trúc
Cây quyết định là một trong những thuật toán mạnh mẽ và phổ biến nhất. Thuật toán cây quyết định thuộc loại thuật toán học có giám sát. Nó hoạt động cho cả các biến đầu ra liên tục cũng như phân loại.
Trong bài viết này, cafedev sẽ triển khai thuật toán cây Quyết định trên Cơ sở dữ liệu Cân bằng Cân bằng Trọng lượng & Khoảng cách được trình bày trên UCI.
Mô tả tập dữ liệu:
Tiêu đề: Cân bằng Cân bằng Cơ sở dữ liệu Cân nặng & Khoảng cách
Số phiên bản: 625 (49 cân bằng, 288 trái, 288 phải)
Số thuộc tính: 4 (số) + tên lớp = 5
Thông tin thuộc tính:
Tên lớp (Biến mục tiêu): 3
L [đầu cân cân bằng ở bên trái]
B [cân bằng cân được cân bằng]
R [đầu cân cân bằng ở bên phải]
Trọng lượng bên trái: 5 (1, 2, 3, 4, 5)
Khoảng cách trái: 5 (1, 2, 3, 4, 5)
Trọng lượng bên phải: 5 (1, 2, 3, 4, 5)
Khoảng cách phải: 5 (1, 2, 3, 4, 5)
Thiếu giá trị thuộc tính: Không có
Phân phối theo lớp:
46,08 phần trăm là L
07,84 phần trăm là B
46,08 phần trăm là R
Bạn có thể tìm thêm thông tin chi tiết của bộ dữ liệu tại đây.
Nơi tải
Nội dung chính
1. Các gói Python đã sử dụng:
1.sklearn:
Trong python, sklearn là một gói máy học bao gồm rất nhiều thuật toán ML.
Ở đây, chúng tôi đang sử dụng một số mô-đun của nó như train_test_split, DecisionTreeClassifier và precision_score.
2.NumPy:
Nó là một mô-đun python số cung cấp các hàm toán học nhanh để tính toán.
Nó được sử dụng để đọc dữ liệu trong các mảng phức tạp và cho mục đích thao tác.
3.Pandas:
Được sử dụng để đọc và ghi các tệp khác nhau.
Thao tác dữ liệu có thể được thực hiện dễ dàng với các khung dữ liệu.
Cài đặt các gói:
Trong Python, sklearn là gói chứa tất cả các gói cần thiết để triển khai thuật toán Học máy. Bạn có thể cài đặt gói sklearn bằng cách làm theo các lệnh dưới đây.
sử dụng pip:
pip install -U scikit-learning
Trước khi sử dụng lệnh trên, hãy đảm bảo rằng bạn đã cài đặt các gói scipy và numpy.
Nếu bạn không có pip. Bạn có thể cài đặt nó bằng cách sử dụng
python get-pip.py
sử dụng conda:
conda install scikit-learn
Các giả định chúng tôi đưa ra khi sử dụng cây Quyết định:
- Khi bắt đầu, chúng tôi coi toàn bộ tập huấn là gốc.
- Các thuộc tính được giả định là phân loại để đạt được thông tin và đối với chỉ mục gini, các thuộc tính được giả định là liên tục.
- Trên cơ sở các bản ghi giá trị thuộc tính được phân phối một cách đệ quy.
- Chúng ta sử dụng các phương pháp thống kê để sắp xếp các thuộc tính dưới dạng nút gốc hoặc nút nội bộ.
2. Mã giả:
- Tìm thuộc tính tốt nhất và đặt nó trên nút gốc của cây.
- Bây giờ, hãy chia tập huấn luyện của tập dữ liệu thành các tập con. Trong khi tạo tập con, hãy đảm bảo rằng mỗi tập con của tập dữ liệu huấn luyện phải có cùng giá trị cho một thuộc tính.
- Tìm các nút lá trong tất cả các nhánh bằng cách lặp lại 1 và 2 trên mỗi tập con.
Trong khi thực hiện cây quyết định, chúng ta sẽ trải qua hai giai đoạn sau:
- Giai đoạn xây dựng
- Xử lý trước tập dữ liệu.
- Tách tập dữ liệu khỏi đào tạo và kiểm tra bằng cách sử dụng gói Python sklearn.
- Đào tạo trình phân loại.
- Giai đoạn hoạt động
- Dự đoán.
- Tính độ chính xác.
3. Nhập dữ liệu :
Để nhập và thao tác dữ liệu, chúng ta đang sử dụng gói pandas được cung cấp trong python.
Ở đây, chúng ta đang sử dụng một URL đang trực tiếp tìm nạp tập dữ liệu từ trang UCI mà không cần tải xuống tập dữ liệu. Khi bạn cố gắng chạy mã này trên hệ thống của mình, hãy đảm bảo rằng hệ thống phải có kết nối Internet đang hoạt động.
Vì tập dữ liệu được phân tách bằng “,” nên chúng ta phải chuyển giá trị của tham số sep là “,”.
Một điều khác cần lưu ý là tập dữ liệu không chứa tiêu đề, vì vậy chúng ta sẽ chuyển giá trị của tham số Tiêu đề như không có. Nếu chúng ta không truyền tham số tiêu đề thì nó sẽ coi dòng đầu tiên của tập dữ liệu là tiêu đề.
4. Cắt dữ liệu:
- Trước khi huấn luyện mô hình, chúng ta phải tách tập dữ liệu thành tập dữ liệu huấn luyện và thử nghiệm.
- Để tách tập dữ liệu cho việc đào tạo và kiểm tra, chúng ta đang sử dụng mô-đun sklearn train_test_split
- Trước hết chúng ta phải tách biến đích khỏi các thuộc tính trong tập dữ liệu.
X = balance_data.values[:, 1:5]
Y = balance_data.values[:,0]
- Trên đây là các dòng từ mã phân tách tập dữ liệu. Biến X chứa các thuộc tính trong khi biến Y chứa biến đích của tập dữ liệu.
- Bước tiếp theo là tách tập dữ liệu cho mục đích đào tạo và thử nghiệm.
X_train, X_test, y_train, y_test = train_test_split(
X, Y, test_size = 0.3, random_state = 100)
- Dòng trên chia tập dữ liệu để đào tạo và thử nghiệm. Vì chúng ta đang chia nhỏ tập dữ liệu theo tỷ lệ 70:30 giữa đào tạo và kiểm tra nên chúng ta chuyển giá trị của tham số test_size là 0,3.
- biến random_state là một trạng thái tạo số giả ngẫu nhiên được sử dụng để lấy mẫu ngẫu nhiên.
5. Các thuật ngữ được sử dụng trong mã:
Chỉ mục Gini và thu thập thông tin cả hai phương pháp này được sử dụng để chọn từ n thuộc tính của tập dữ liệu mà thuộc tính sẽ được đặt ở nút gốc hoặc nút bên trong.
chỉ số Gini
- Chỉ số Gini là một số liệu để đo lường tần suất một phần tử được chọn ngẫu nhiên sẽ được xác định không chính xác.
- Nó có nghĩa là một thuộc tính có chỉ số gini thấp hơn nên được ưu tiên.
- Sklearn hỗ trợ tiêu chí “gini” cho Gini Index và theo mặc định, nó nhận giá trị “gini”.
Entropy
- Entropy là thước đo độ không đảm bảo của một biến ngẫu nhiên, nó đặc trưng cho tạp chất của một tập hợp các ví dụ tùy ý. Entropy càng cao thì nội dung thông tin càng nhiều.
Thông tin thu được
- Entropy thường thay đổi khi chúng ta sử dụng một nút trong cây quyết định để phân vùng các cá thể huấn luyện thành các tập con nhỏ hơn. Mức tăng thông tin là một thước đo của sự thay đổi này trong entropy.
- Sklearn hỗ trợ các tiêu chí “entropy” cho Mức tăng thông tin và nếu chúng ta muốn sử dụng phương pháp Mức tăng thông tin trong sklearn thì chúng ta phải đề cập đến nó một cách rõ ràng.
Điểm chính xác
- Điểm chính xác được sử dụng để tính toán độ chính xác của bộ phân loại được đào tạo.
Ma trận hỗn loạn
- Ma trận nhầm lẫn được sử dụng để hiểu hành vi của bộ phân loại được đào tạo qua tập dữ liệu thử nghiệm hoặc xác thực tập dữ liệu.
Dưới đây là mã python cho cây quyết định.
# Run this program on your local python
# interpreter, provided you have installed
# the required libraries.
# Importing the required packages
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
# Function importing Dataset
def importdata():
balance_data = pd.read_csv(
'https://archive.ics.uci.edu/ml/machine-learning-'+
'databases/balance-scale/balance-scale.data',
sep= ',', header = None)
# Printing the dataswet shape
print ("Dataset Length: ", len(balance_data))
print ("Dataset Shape: ", balance_data.shape)
# Printing the dataset obseravtions
print ("Dataset: ",balance_data.head())
return balance_data
# Function to split the dataset
def splitdataset(balance_data):
# Separating the target variable
X = balance_data.values[:, 1:5]
Y = balance_data.values[:, 0]
# Splitting the dataset into train and test
X_train, X_test, y_train, y_test = train_test_split(
X, Y, test_size = 0.3, random_state = 100)
return X, Y, X_train, X_test, y_train, y_test
# Function to perform training with giniIndex.
def train_using_gini(X_train, X_test, y_train):
# Creating the classifier object
clf_gini = DecisionTreeClassifier(criterion = "gini",
random_state = 100,max_depth=3, min_samples_leaf=5)
# Performing training
clf_gini.fit(X_train, y_train)
return clf_gini
# Function to perform training with entropy.
def tarin_using_entropy(X_train, X_test, y_train):
# Decision tree with entropy
clf_entropy = DecisionTreeClassifier(
criterion = "entropy", random_state = 100,
max_depth = 3, min_samples_leaf = 5)
# Performing training
clf_entropy.fit(X_train, y_train)
return clf_entropy
# Function to make predictions
def prediction(X_test, clf_object):
# Predicton on test with giniIndex
y_pred = clf_object.predict(X_test)
print("Predicted values:")
print(y_pred)
return y_pred
# Function to calculate accuracy
def cal_accuracy(y_test, y_pred):
print("Confusion Matrix: ",
confusion_matrix(y_test, y_pred))
print ("Accuracy : ",
accuracy_score(y_test,y_pred)*100)
print("Report : ",
classification_report(y_test, y_pred))
# Driver code
def main():
# Building Phase
data = importdata()
X, Y, X_train, X_test, y_train, y_test = splitdataset(data)
clf_gini = train_using_gini(X_train, X_test, y_train)
clf_entropy = tarin_using_entropy(X_train, X_test, y_train)
# Operational Phase
print("Results Using Gini Index:")
# Prediction using gini
y_pred_gini = prediction(X_test, clf_gini)
cal_accuracy(y_test, y_pred_gini)
print("Results Using Entropy:")
# Prediction using entropy
y_pred_entropy = prediction(X_test, clf_entropy)
cal_accuracy(y_test, y_pred_entropy)
# Calling main function
if __name__=="__main__":
main()
Data Infomation:
Dataset Length: 625
Dataset Shape: (625, 5)
Dataset: 0 1 2 3 4
0 B 1 1 1 1
1 R 1 1 1 2
2 R 1 1 1 3
3 R 1 1 1 4
4 R 1 1 1 5
Results Using Gini Index:
Predicted values:
['R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'R' 'L'
'L' 'R' 'L' 'R' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'L'
'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'R' 'L' 'R'
'R' 'L' 'R' 'R' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'L' 'R'
'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'R' 'L'
'R' 'R' 'L' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'R' 'R'
'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L'
'L' 'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R'
'L' 'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'R' 'R'
'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R' 'R'
'L' 'R' 'R' 'L' 'L' 'R' 'R' 'R']
Confusion Matrix: [[ 0 6 7]
[ 0 67 18]
[ 0 19 71]]
Accuracy : 73.4042553191
Report :
precision recall f1-score support
B 0.00 0.00 0.00 13
L 0.73 0.79 0.76 85
R 0.74 0.79 0.76 90
avg/total 0.68 0.73 0.71 188
Results Using Entropy:
Predicted values:
['R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'L'
'L' 'R' 'L' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'L' 'L'
'L' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'R' 'L' 'L' 'R' 'L' 'L' 'R' 'L' 'L'
'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'L' 'R' 'L' 'L' 'L' 'R'
'R' 'L' 'R' 'L' 'R' 'R' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'R' 'R' 'L' 'R' 'L'
'R' 'R' 'L' 'L' 'L' 'R' 'R' 'L' 'L' 'L' 'R' 'L' 'L' 'R' 'R' 'R' 'R' 'R'
'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L'
'L' 'L' 'L' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'L' 'R'
'L' 'R' 'R' 'L' 'L' 'R' 'L' 'R' 'R' 'R' 'R' 'R' 'L' 'R' 'R' 'R' 'R' 'R'
'R' 'L' 'R' 'L' 'R' 'R' 'L' 'R' 'L' 'R' 'L' 'R' 'L' 'L' 'L' 'L' 'L' 'R'
'R' 'R' 'L' 'L' 'L' 'R' 'R' 'R']
Confusion Matrix: [[ 0 6 7]
[ 0 63 22]
[ 0 20 70]]
Accuracy : 70.7446808511
Report :
precision recall f1-score support
B 0.00 0.00 0.00 13
L 0.71 0.74 0.72 85
R 0.71 0.78 0.74 90
avg / total 0.66 0.71 0.68 188
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Tự học ML bằng Python từ cơ bản tới nâng cao.
- Ebook về python tại đây.
- Các series tự học lập trình MIỄN PHÍ khác
- Nơi liên hệ hợp tác hoặc quảng cáo cùng Cafedevn tại đây.
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!