Đ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

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:

  1. 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.
  2. 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:

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!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!