机器学习中的分类:决策树、随机森林及其应用

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!

文章目录

🍋数据预处理

这部分我们可以使用Python脚本随机生成一个csv文件

python 复制代码
import pandas as pd
import random
import string

# 随机生成数据的数量
num_records = 1000

# 随机生成用户ID
def generate_user_id():
    return random.randint(1, 1000)

# 随机生成性别
def generate_gender():
    return random.choice(['M', 'F'])

# 随机生成年龄(假设年龄范围在18到60之间)
def generate_age():
    return random.randint(18, 60)

# 随机生成优惠券ID
def generate_coupon_id():
    return ''.join(random.choices(string.digits, k=4))

# 随机生成优惠力度(假设优惠力度范围在5%到50%之间)
def generate_discount():
    return f"{random.randint(5, 50)}%"

# 随机生成购买历史(假设每个用户的购买历史是一个整数,范围在1到20之间)
def generate_purchase_history():
    return random.randint(1, 20)

# 随机生成优惠券是否被使用(1表示使用,0表示未使用)
def generate_coupon_used():
    return random.choice([0, 1])

# 生成数据
data = []
for _ in range(num_records):
    data.append([
        generate_user_id(),
        generate_age(),
        generate_gender(),
        generate_coupon_id(),
        generate_discount(),
        generate_purchase_history(),
        generate_coupon_used()
    ])

# 创建DataFrame
columns = ['user_id', 'age', 'gender', 'coupon_id', 'discount', 'purchase_history', 'coupon_used']
df = pd.DataFrame(data, columns=columns)

# 保存为CSV文件
df.to_csv('o2o_data.csv', index=False)

print("CSV文件已生成:o2o_data.csv")

数据大概如下图

我们将用 pandas 处理这个数据集,生成特征,并进行标签编码

python 复制代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

# 加载数据
data = pd.read_csv('o2o_data.csv')

# 处理缺失值
data = data.dropna()  # 丢弃含有缺失值的行

# 特征选择与标签编码
features = data[['age', 'gender', 'discount', 'purchase_history']]  # 选择特征
labels = data['coupon_used']  # 目标变量

# 性别特征标签编码
le = LabelEncoder()
features['gender'] = le.fit_transform(features['gender'])

# 将折扣从百分比转化为数值
features['discount'] = features['discount'].apply(lambda x: float(x.strip('%')) / 100)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

🍋决策树模型

决策树是一种基于树形结构的模型,通过一系列的决策规则来对数据进行分类。它从数据中提取特征信息,并基于这些特征做出决策。决策树的每个内部节点代表对某个特征的判断,每个分支代表判断结果,而每个叶子节点代表最终的类别。

🍋构建及优缺点

  1. 决策树的构建
    构建决策树的目标是通过一系列决策来最小化分类错误,常用的方法是选择最能区分数据的特征。常见的特征选择标准有:
  • 信息增益(Information Gain):基于熵(Entropy)来衡量某一特征对数据集的分类效果。
  • 基尼指数(Gini Impurity):通过计算数据集的不纯度来选择最优特征。
  1. 决策树的优缺点
  • 优点:易于理解和解释,模型透明;无需特征标准化;可以处理非线性数据。
  • 缺点:容易过拟合;对噪声数据敏感;树结构的构建和剪枝过程较为复杂。

🍋代码

接下来,我们使用决策树来进行分类。我们将用 DecisionTreeClassifier 来训练模型,并评估其性能。

python 复制代码
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# 初始化决策树模型
dt_model = DecisionTreeClassifier(random_state=42)

# 训练模型
dt_model.fit(X_train, y_train)

# 预测结果
y_pred_dt = dt_model.predict(X_test)

# 评估模型性能
print("决策树模型准确率:", accuracy_score(y_test, y_pred_dt))
print("\n分类报告:\n", classification_report(y_test, y_pred_dt))
print("\n混淆矩阵:\n", confusion_matrix(y_test, y_pred_dt))

# 可视化决策树
plt.figure(figsize=(12,8))
plot_tree(dt_model, filled=True, feature_names=features.columns, class_names=['Not Used', 'Used'], rounded=True)
plt.show()

下图是输出的示例

可视化决策树

🍋随机森林模型

随机森林是由多棵决策树构成的集成学习方法,它通过构建多个决策树并将各树的结果进行投票(分类问题)或平均(回归问题)来增强模型的准确性。

🍋构建及优缺点

  1. 随机森林的构建
    在构建随机森林时,主要有两种方法来提高模型的多样性:
  • 自助法(Bootstrap sampling):从原始数据集随机抽取多个子集(有放回抽样),每个子集用于训练一棵决策树。
  • 特征选择随机性:每个节点的分裂不仅基于当前最佳的特征,还从随机选择的特征子集进行选择,从而增加了树之间的差异性。
  1. 随机森林的优缺点
  • 优点:较高的准确率;较少的过拟合;适用于处理高维数据。
  • 缺点:模型较为复杂,训练和预测速度相对较慢;解释性差。

🍋代码

然后,我们用随机森林来增强模型性能。我们将使用 RandomForestClassifier 进行训练。

python 复制代码
from sklearn.ensemble import RandomForestClassifier

# 初始化随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf_model.fit(X_train, y_train)

# 预测结果
y_pred_rf = rf_model.predict(X_test)

# 评估模型性能
print("随机森林模型准确率:", accuracy_score(y_test, y_pred_rf))
print("\n分类报告:\n", classification_report(y_test, y_pred_rf))
print("\n混淆矩阵:\n", confusion_matrix(y_test, y_pred_rf))

# 可视化特征重要性
feature_importances = rf_model.feature_importances_
plt.barh(features.columns, feature_importances)
plt.xlabel('Feature Importance')
plt.title('Random Forest Feature Importance')
plt.show()


🍋模型评估

模型 准确率 精确度(类别0) 准确率(类别1) 召回率(类别0) 召回率(类别1) F1分数(类别0) F1分数(类别1)
决策树 0.475 0.50 0.45 0.48 0.47 0.49 0.46
随机森林 0.475 0.50 0.45 0.50 0.44 0.50 0.44

总结:

  • 准确率: 两个模型的准确率相似,均为0.475,表明它们的分类性能差异不大,表现较弱。
  • 精确度和召回率: 在两个模型中,类别0的精确度和召回率均高于类别1,说明模型对类别0的识别更好。类别1的召回率较低,表示模型难以正确识别出类别1的样本。
  • F1 分数: 两个模型在类别0和类别1的F1分数上都相差不大,且都处于较低的水平,表明模型在平衡精度与召回率方面仍有优化空间。

🍋下一步优化建议

  • 数据平衡处理: 由于数据的类别分布不平衡,建议尝试采用过采样(如SMOTE)或欠采样的方法来平衡类别分布。
  • 模型调参: 可以通过调整模型的超参数(如决策树深度、随机森林的树数量)来提高模型性能。
  • 特征工程: 可以尝试更多的特征工程方法,增加更多的特征或进行特征选择,以帮助模型更好地理解数据。
  • 其他模型: 如果决策树和随机森林模型表现不理想,考虑使用其他更复杂的模型,如支持向量机(SVM)或XGBoost。

当然我们毕竟是虚假的数据,但是上面的建议还是可以参考一下的

🍋总结

决策树和随机森林是机器学习中非常强大的工具,它们不仅在分类任务中应用广泛,也在回归、预测等任务中大有作为。特别是在O2O优惠券使用预测中,利用这些模型可以为商家提供更精确的营销决策,从而提高消费者的转化率。刚兴趣的同学可以多使用几组数据集进行测试

挑战与创造都是很痛苦的,但是很充实。

相关推荐
埃菲尔铁塔_CV算法2 小时前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
艾思科蓝-何老师【H8053】2 小时前
【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
人工智能·信号处理·论文发表·香港中文大学
秀儿还能再秀2 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
weixin_452600693 小时前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪
学术搬运工3 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
右恩3 小时前
AI大模型重塑软件开发:流程革新与未来展望
人工智能
图片转成excel表格3 小时前
WPS Office Excel 转 PDF 后图片丢失的解决方法
人工智能·科技·深度学习
阿_旭4 小时前
如何使用OpenCV和Python进行相机校准
python·opencv·相机校准·畸变校准
幸运的星竹4 小时前
使用pytest+openpyxl做接口自动化遇到的问题
python·自动化·pytest
ApiHug4 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug