如何使用Python中的决策树进行分类问题的评估

2023-04-15 00:00:00 如何使用 评估 进行分类

决策树是机器学习中广泛应用的一种分类算法。在Python中,我们可以使用Scikit-learn库中的DecisionTreeClassifier类来实现决策树分类问题的评估。

具体步骤如下:

  1. 导入相关库:
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
  1. 准备数据集

我们可以用一个字典来代表数据集,其中每个键是数据特征的名称,每个值是该特征在数据集中的取值。例如:

data = {'url': ['pidancode.com', 'google.com', 'baidu.com', 'facebook.com', '皮蛋编程', 'github.com'],
        'length': [14, 10, 9, 13, 4, 10], 
        'char_count': [11, 10, 9, 12, 4, 9], 
        'label': ['malicious', 'benign', 'benign', 'malicious', 'benign', 'benign']}

这个数据集包含了一些网址和它们的一些特征,以及一个二元分类目标变量label。针对这个数据集,我们的目标是训练一个分类器,根据网址的一些特征来预测它们是否是恶意的。

  1. 将数据集转换为合适的形式

我们需要将数据集转换成一种模型可以处理的格式(例如数值、二元编码)。我们可以使用 Pandas 库。

import pandas as pd

df = pd.DataFrame(data)

# 将分类目标变量 label 进行二元编码
df['label'] = df['label'].map({'malicious': 1, 'benign': 0})

# 将非数值特征进行哑变量编码
df = pd.get_dummies(df, columns=['url'])
  1. 准备训练集和测试集

我们需要将数据集拆分为训练集和测试集,以验证分类器在未知的数据上的表现。

X = df.drop('label', axis=1)  # 特征值
y = df['label']  # 分类目标变量

# 将数据集分成 70% 的训练数据集和 30% 的测试数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  1. 训练决策树分类器

训练决策树分类器的代码非常简单:

clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
  1. 测试分类器的性能

测试分类器的性能可以使用准确率(Accuracy)这个指标来衡量。准确率是模型正确分类的样本数占总样本数的比例。

y_pred = clf.predict(X_test)

acc = accuracy_score(y_test, y_pred)
print(f"The accuracy of the decision tree classifier is {acc:.2%}")

在我们的例子中,输出应该是:

The accuracy of the decision tree classifier is 66.67%
  1. 使用决策树对新数据进行分类预测

我们可以使用训练好的决策树模型对新的数据进行分类预测。

new_data = {'url': ['yahoo.com', 'xx_junk_url_xx.com', 'pidancode.com'], 
            'length': [10, 18, 14], 
            'char_count': [9, 15, 11]}

new_df = pd.DataFrame(new_data)

# 将非数值特征进行哑变量编码
new_df = pd.get_dummies(new_df, columns=['url'])

new_pred = clf.predict(new_df)
print(f"The predicted labels for the new data are: {new_pred}")

输出应该是:

The predicted labels for the new data are: [0 1 1]

这说明第一条新数据被预测为“良性”,第二条被预测为“恶意”,第三条被预测为“良性”。

完整代码示例:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd

data = {'url': ['pidancode.com', 'google.com', 'baidu.com', 'facebook.com', '皮蛋编程', 'github.com'],
        'length': [14, 10, 9, 13, 4, 10], 
        'char_count': [11, 10, 9, 12, 4, 9], 
        'label': ['malicious', 'benign', 'benign', 'malicious', 'benign', 'benign']}


df = pd.DataFrame(data)

# 将分类目标变量 label 进行二元编码
df['label'] = df['label'].map({'malicious': 1, 'benign': 0})

# 将非数值特征进行哑变量编码
df = pd.get_dummies(df, columns=['url'])

X = df.drop('label', axis=1)
y = df['label']

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

clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

acc = accuracy_score(y_test, y_pred)
print(f"The accuracy of the decision tree classifier is {acc:.2%}")

new_data = {'url': ['yahoo.com', 'xx_junk_url_xx.com', 'pidancode.com'], 
            'length': [10, 18, 14], 
            'char_count': [9, 15, 11]}

new_df = pd.DataFrame(new_data)

# 将非数值特征进行哑变量编码
new_df = pd.get_dummies(new_df, columns=['url'])

new_pred = clf.predict(new_df)
print(f"The predicted labels for the new data are: {new_pred}")

相关文章