决策树-实现二分类问题

基本含义:

决策树是一种常用于分类和回归的机器学习算法。在实现二分类问题时,决策树的目标是将数据划分为两个类别(或类),通常是“正类”(例如,标签为1)和“负类”(例如,标签为0)。

实现步骤:

步骤:

  1. 特征选择:决策树从根节点开始,选择一个特征(即数据中的一个属性)来划分数据。这个特征的选择是基于一些度量标准,比如信息增益、基尼系数等,以确保最大程度地将数据分类。

  2. 节点划分:根据选择的特征,将数据集分成两个子集,每个子集对应树的一个分支。这个过程会递归进行,直到所有的子集都尽可能纯净(即,子集中的数据点大多数属于同一类别),或满足某个停止条件(如树的最大深度、最小节点样本数等)。

  3. 叶节点:当划分完成后,每个叶节点会代表一个最终的分类决策。对于二分类问题,叶节点会输出0或1,表示该节点属于哪一个类别。

举例:

假设你有一个数据集,特征包括“年龄”、“收入”和“信用评分”,目标是预测一个人是否会购买某款产品(0表示不会购买,1表示会购买)。决策树可能会首先基于“收入”划分,然后基于“年龄”进一步划分,最终得到两个类别的预测。

通过这样的方式,决策树在二分类问题中起到了分类器的作用,根据特征递归地划分数据,最终给出二分类的结果。

代码实现:

示例

现在我以"电信银行卡诈骗的数据分析"为例,通过使用“精确率”,“准确率”,“召回率”和“F1分数”来评估。

①训练模型

模型保存为:decision_tree_model.pkl

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import joblib

# 读取数据集
df = pd.read_csv('电信银行卡诈骗的数据分析.csv')

# 假设目标列为 'Fraud',需要根据实际数据调整
X = df.drop('Fraud', axis=1)  # 特征
y = df['Fraud']  # 标签

# 分割数据为训练集、验证集、测试集
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# 初始化决策树分类器
clf = DecisionTreeClassifier(random_state=42)

# 在训练集上训练模型
clf.fit(X_train, y_train)

# 预测
y_train_pred = clf.predict(X_train)
y_val_pred = clf.predict(X_val)
y_test_pred = clf.predict(X_test)

# 计算精确率、召回率、准确率和F1分数
metrics = {
    '训练集': {
        '精确率': precision_score(y_train, y_train_pred),
        '准确率': accuracy_score(y_train, y_train_pred),
        '召回率': recall_score(y_train, y_train_pred),
        'F1分数': f1_score(y_train, y_train_pred)
    },
    '验证集': {
        '精确率': precision_score(y_val, y_val_pred),
        '准确率': accuracy_score(y_val, y_val_pred),
        '召回率': recall_score(y_val, y_val_pred),
        'F1分数': f1_score(y_val, y_val_pred)
    },
    '测试集': {
        '精确率': precision_score(y_test, y_test_pred),
        '准确率': accuracy_score(y_test, y_test_pred),
        '召回率': recall_score(y_test, y_test_pred),
        'F1分数': f1_score(y_test, y_test_pred)
    }
}

# 打印结果
for dataset, metrics_dict in metrics.items():
    print(f"{dataset}:")
    for metric, value in metrics_dict.items():
        print(f"  {metric}: {value:.5f}")

# 保存模型到文件
model_filename = 'decision_tree_model.pkl'
joblib.dump(clf, model_filename)
print(f"模型已保存到 {model_filename}")

# 从文件加载模型
loaded_clf = joblib.load(model_filename)
print("模型已加载")

# 使用加载的模型进行预测
y_test_pred_loaded = loaded_clf.predict(X_test)

# 验证加载的模型是否正确
print("使用加载的模型计算测试集的准确率:")
print(f"准确率: {accuracy_score(y_test, y_test_pred_loaded):.5f}")

②测试

import numpy as np
import joblib  # 用于加载模型

# 加载保存的模型
model_filename = 'decision_tree_model.pkl'
loaded_model = joblib.load(model_filename)
print("Model loaded successfully.")

# 假设新数据的格式和训练数据一致
# 新数据的特征顺序为: Distance1, Distance2, Ratio, Repeat, Card, Pin, Online
new_data = np.array([[57.877857, 0.31114, 1.94594, 1, 1, 1, 0],  # 样本 1
                     [44.199036, 0.566463, 2.222763, 1, 1, 1, 0]])  # 样本 2

# 使用加载的模型进行预测
new_predictions = loaded_model.predict(new_data)

# 打印预测结果
print("Predicted classes for new data:", new_predictions)
  • Predicted classes for new data: [0 0]:表示模型对你提供的两条新数据样本都预测为0
    • 第一个样本的预测结果是 0
    • 第二个样本的预测结果也是 0

在这个二分类问题中,如果 0 代表“非欺诈”(正常行为),1 代表“欺诈”(异常行为),那么模型认为这两条新数据都属于“非欺诈”。

因此,这两个预测结果表示模型认为这两个新样本都是“非欺诈”的交易。

资源获取:

上述使用的表格如下:

通过网盘分享的文件:电信银行卡诈骗的数据分析.zip
链接: https://pan.baidu.com/s/1w6OrRLrpUeb7SL1XYEgR3g?pwd=capu 提取码: capu
--来自百度网盘超级会员v5的分享

好啦,希望能够帮助到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值