机器学习(二)决策树之儿童入学推荐


实验内容

给定一个数据集合nursery.txt。该数据集包含12960个入学儿童的自身及家庭状况以及是否推荐他们入学,目标是找到决策树模型可以将这些数据拟合,从而对是否入学做出预测分析,同时通过计算它的均方误差来评价拟合的好坏。


一、详细步骤

(1) 从这个网址下载nursery.data,然后将修改扩展名,将其修改成Python容易处理的nursery.txt文件
(2) 导入相关的包
(3) 读取数据,加载到numpy数组中
(4) 对数据进行标记编码
(5) 将数据分为训练集和测试集
(6) 使用训练集拟合普通的决策树模型和AdaBoost的决策树模型
(7) 将测试数据代入训练好的两个模型,得到用标记编码表示的测试结果
(8) 将测试结果反标记编码,转换为原来的字符串形式
(9) 通过计算均方误差和可释方差分数评估两个模型的拟合效果

二、实现代码

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error,explained_variance_score
from sklearn import preprocessing


if __name__ == '__main__':
    input_file = 'nursery.txt'

    # 读取数据
    schooling_data = []
    y = []
    count = 0
    with open(input_file, 'r') as f:
        for line in f.readlines():
            data = line[:-1].split(',')
            schooling_data.append(data)

    schooling_data = np.array(schooling_data)

    # 对数据进行标记编码
    label_encoder = []
    X_encoded = np.empty(schooling_data.shape)

    for i,item in enumerate(schooling_data[0]):
        label_encoder.append(preprocessing.LabelEncoder())
        X_encoded[:, i] = label_encoder[-1].fit_transform(schooling_data[:, i])

    X = X_encoded[:, :-1].astype(int)
    y = X_encoded[:, -1].astype(int)

    # 将数据分成训练数据集合测试数据集
    num_training = int(0.7*len(X))

    X_train, y_train = X[:num_training], y[:num_training]
    X_test, y_test = X[num_training:], y[num_training:]

    # 拟合一个决策树回归模型,限制最大深度为4
    dt_regressor = DecisionTreeRegressor(max_depth=4)
    dt_regressor.fit(X_train, y_train)

    # 再用AdaBoost算法的决策树回归模型进行拟合
    ab_regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),
                                     n_estimators=400, random_state=7)
    # 第一个参数是基分类器,n_estimators 基分类器循环次数,random_state随机种子设置
    ab_regressor.fit(X_train, y_train)

    # 将训练数据代入普通的决策树
    y_pred_dt = dt_regressor.predict(X_test)
    # 预测结果暂时以数字形式保存在这个列表中,不一定是整数,可以通过后期设置条件,将其转换成整数。
    # 最后反标记编码,输出想要的字符串形式。
    y_pred_dt_string = []
    print(y_pred_dt.shape)

    for i in range(3888 - 1):
        if (y_pred_dt[i] >= 1 and y_pred_dt[i] <= 1.4):
            y_pred_dt_string.append('not_recom')
        if (y_pred_dt[i] > 1.4 and y_pred_dt[i] <= 2.4):
            y_pred_dt_string.append('priority')
        if (y_pred_dt[i] > 2.4 and y_pred_dt[i] <= 3.4):
            y_pred_dt_string.append('recommend')
        if (y_pred_dt[i] > 3.4 and y_pred_dt[i] <= 4.4):
            y_pred_dt_string.append('spec_prior')
        if (y_pred_dt[i] > 4.4 and y_pred_dt[i] <= 5):
            y_pred_dt_string.append('very_recom')


    # 将训练数据代入AdaBoost决策树
    y_pred_ab = ab_regressor.predict(X_test)

    # 评价决策树分类器的训练效果
    y_pred_dt = dt_regressor.predict(X_test)
    mse = mean_squared_error(y_test, y_pred_dt)
    evs = explained_variance_score(y_test, y_pred_dt)
    print("\n#### Decision Tree 性能表现 ####")
    print("Mean squared error(均方误差) =", round(mse, 2))
    print("Explained variance score(可释方差分数) =", round(evs, 2))

    # 评价AdaBoost算法的改善效果
    y_pred_ab = ab_regressor.predict(X_test)
    mse = mean_squared_error(y_test, y_pred_ab)
    evs = explained_variance_score(y_test, y_pred_ab)
    print("\n#### AdaBoost 性能表现 ####")
    print("Mean squared error(均方误差)  =", round(mse, 2))
    print("Explained variance score (可释方差分数)=", round(evs, 2))



调试截图

(1) 读取到的数据截图,放到了schooling_data这个numpy数组中

在这里插入图片描述
(2) 对数据进行标记编码,发现原来的字符串全都变成了数字
在这里插入图片描述
在这里插入图片描述

(3) 训练好决策树后,用测试集得到的预测结果如下。
在这里插入图片描述
其中,每个数字都映射到对应的推荐程度,观察输出的结果,在[1,2,3,4,5]范围内,正好对应四种推荐程度(not_recom, priority, recommend, spec_prior, very_recom)。
(4) 将测试结果反标记编码,转换为原来的字符串形式
在这里插入图片描述
(5) 评价决策树分类器的测试效果
在这里插入图片描述

总结

本文以儿童入学推荐为背景,依托AdaBoost类型的决策树进行了实践,这里先不讲AdaBoost类型的决策树是什么(涉及集成学习),等到后面进行AdaBoost的讲解

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雨陌潇潇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值