Computer >> Máy Tính >  >> Lập trình >> Python

Triển khai cây quyết định bằng Python

Cây quyết định là một thuật toán chủ yếu được áp dụng cho các kịch bản phân loại dữ liệu. Nó là một cấu trúc cây trong đó mỗi nút đại diện cho các tính năng và mỗi cạnh đại diện cho quyết định được thực hiện. Bắt đầu từ nút gốc, chúng tôi tiếp tục đánh giá các tính năng để phân loại và đưa ra quyết định theo một cạnh cụ thể. Bất cứ khi nào một điểm dữ liệu mới xuất hiện, cùng một phương pháp này được áp dụng lặp đi lặp lại và sau đó đưa ra kết luận cuối cùng khi tất cả các đặc điểm cần thiết được nghiên cứu hoặc áp dụng cho kịch bản phân loại. Vì vậy, thuật toán cây quyết định là một mô hình học có giám sát được sử dụng để dự đoán một biến phụ thuộc với một loạt các biến huấn luyện.

Ví dụ

Chúng tôi sẽ lấy dữ liệu kiểm tra ma túy có sẵn tại kaggle. Bước đầu tiên, chúng tôi sẽ đọc dữ liệu từ tệp csv bằng cách sử dụng gấu trúc và xem nội dung và cấu trúc của tệp.

import pandas as pd

datainput = pd.read_csv("drug.csv", delimiter=",") #https://www.kaggle.com/gangliu/drugsets
print(datainput)

Chạy đoạn mã trên cho chúng ta kết quả sau:

   Age Sex BP   Cholesterol Na_to_K  Drug
0  23   F HIGH  HIGH        25.355   drugY
1  47   M LOW   HIGH        13.093   drugC
2  47   M LOW   HIGH        10.114  drugC
3  28   F NORMAL HIGH        7.798  drugX
4  61   F LOW    HIGH       18.043  drugY
.. ... .. ... ... ... ...
195 56  F LOW    HIGH       11.567  drugC
196 16  M LOW    HIGH       12.006  drugC
197 52  M NORMAL HIGH     9.894 drugX
[200 rows x 6 columns]

Xử lý trước dữ liệu

Trong bước tiếp theo, chúng tôi xử lý trước dữ liệu trên để lấy các giá trị số cho các giá trị văn bản khác nhau mà chúng tôi có trong dữ liệu. Điều đó rất hữu ích để đào tạo và kiểm tra dữ liệu mẫu về quyết định sử dụng một số loại thuốc cho một giá trị nhất định về tuổi, giới tính, BP, v.v.

Ví dụ

import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix

datainput = pd.read_csv("drug.csv", delimiter=",")

X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values

from sklearn import preprocessing
label_gender = preprocessing.LabelEncoder()
label_gender.fit(['F','M'])
X[:,1] = label_gender.transform(X[:,1])

label_BP = preprocessing.LabelEncoder()
label_BP.fit([ 'LOW', 'NORMAL', 'HIGH'])
X[:,2] = label_BP.transform(X[:,2])

label_Chol = preprocessing.LabelEncoder()
label_Chol.fit([ 'NORMAL', 'HIGH'])
X[:,3] = label_Chol.transform(X[:,3])

# Printing the first 6 records
print(X[0:6])

Chạy đoạn mã trên cho chúng ta kết quả sau -

[[23 0 0 0 25.355]
   [47 1 1 0 13.093]
   [47 1 1 0 10.113999999999999]
   [28 0 2 0 7.797999999999999]
   [61 0 1 0 18.043]
   [22 0 2 0 8.607000000000001]
]

Chuyển đổi biến phụ thuộc

Tiếp theo, chúng tôi cũng chuyển đổi biến phụ thuộc thành các giá trị số để nó có thể được sử dụng trong đào tạo cũng như tập dữ liệu đánh giá.

Ví dụ

import pandas as pd

datainput = pd.read_csv("drug.csv", delimiter=",")
X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values

y = datainput["Drug"]

print(y[0:6])

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau:

0    drugY
1    drugC
2    drugC
3    drugX
4    drugY
5    drugX
Name: Drug, dtype: object

Đào tạo tập dữ liệu

Tiếp theo, chúng tôi sử dụng 30 phần trăm dữ liệu được cung cấp làm tập dữ liệu đào tạo. Điều này sẽ được sử dụng làm cơ sở để tạo phân loại cho 70 phần trăm còn lại mà chúng tôi sẽ gọi là dữ liệu thử nghiệm.

Ví dụ

import pandas as pd
from sklearn.model_selection import train_test_split

datainput = pd.read_csv("drug.csv", delimiter=",")

X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values

y = datainput["Drug"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau:

(140, 5)
(60, 5)
(140,)
(60,)

Nhận kết quả từ Tập dữ liệu được đào tạo

Tiếp theo, chúng ta có thể áp dụng cây quyết định để xem kết quả cho tập dữ liệu đã đào tạo. Ở đây chúng tôi tạo một cây dựa trên đầu vào mà chúng tôi có và sử dụng một tiêu chí gọi là entropy. Và cuối cùng, chúng tôi tính toán độ chính xác của cây quyết định.

Ví dụ

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics

datainput = pd.read_csv("drug.csv", delimiter=",")

X = datainput[['Age', 'Sex', 'BP', 'Cholesterol', 'Na_to_K']].values

# Data Preprocessing
from sklearn import preprocessing

label_gender = preprocessing.LabelEncoder()
label_gender.fit(['F', 'M'])
X[:, 1] = label_gender.transform(X[:, 1])

label_BP = preprocessing.LabelEncoder()
label_BP.fit(['LOW', 'NORMAL', 'HIGH'])
X[:, 2] = label_BP.transform(X[:, 2])

label_Chol = preprocessing.LabelEncoder()
label_Chol.fit(['NORMAL', 'HIGH'])
X[:, 3] = label_Chol.transform(X[:, 3])

y = datainput["Drug"]

# train_test_split
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)

drugTree = DecisionTreeClassifier(criterion="entropy", max_depth=4)

drugTree.fit(X_train, y_train)
predicted = drugTree.predict(X_test)

print(predicted)

print("\nDecisionTrees's Accuracy: ", metrics.accuracy_score(y_test, predicted))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau:

['drugY' 'drugX' 'drugX' 'drugX' 'drugX' 'drugC' 'drugY' 'drugA' 'drugB'
'drugA' 'drugY' 'drugA' 'drugY' 'drugY' 'drugX' 'drugY' 'drugX' 'drugX'
'drugB' 'drugX' 'drugX' 'drugY' 'drugY' 'drugY' 'drugX' 'drugB' 'drugY'
'drugY' 'drugA' 'drugX' 'drugB' 'drugC' 'drugC' 'drugX' 'drugX' 'drugC'
'drugY' 'drugX' 'drugX' 'drugX' 'drugA' 'drugY' 'drugC' 'drugY' 'drugA'
'drugY' 'drugY' 'drugY' 'drugY' 'drugY' 'drugB' 'drugX' 'drugY' 'drugX'
'drugY' 'drugY' 'drugA' 'drugX' 'drugY' 'drugX']

DecisionTrees's Accuracy: 0.9833333333333333