zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python每日一练(机器学习篇)——第44天:机器学习

Python机器学习 每日 44
2023-09-14 09:05:12 时间

废话少说速度上号刷题卷起来



1. 决策树的生成与训练-信息熵的计算

描述
决策树是非常经典的机器学习模型,以决策树为基模型的集成学习模型(XGBoost、GBDT 等)在工业界得到了极为广泛的应用。决策树有三种常见的启发式生成标准,信息增益就是其中之一。计算某一特征的信息增益主要分为两步,第一步是计算数据集的信息熵,信息熵可以表示为,其中代表的是属于某一类的样本个数,D 是整个数据集的样本数量,K 为类别数量。第二步是根据信息熵计算每个特征的经验条件熵。特征的信息增益即为信息熵和经验条件熵的差。现有一数据集,有 4 个特征,分别为教育程度、是否有车、是否有正式工作和征信情况,通过这 4 个特征决策是否予以审批信用卡,数据已经通过 dataSet 给出。其中 dataSet 每行的前 4 列依次代表上述特征的取值,最后一列代表对应的 label 标签。
要求实现 calcInfoEnt 功能,数据集从当前路径下 dataSet.csv读取,计算在给定数据集的情况下,数据集的信息熵,信息熵用 infoEnt 进行表示,数据类型为 float,将 infoEnt 作为函数返回值。计算逻辑参考题目描述中给出的公式。
其中dataSet.csv的示例数据集如下所示:

其中dataSet.csv的示例数据集如下所示:

在这里插入图片描述

实现代码:

# -*- coding: UTF-8 -*-
from math import log
import pandas as pd
 
dataSet = pd.read_csv('dataSet.csv', header=None)
 
def calcInfoEnt(dataSet):
    # 数据集的样本数量 D
    numEntres = len(dataSet)
    #code start here
    # 样本类别分组
    label = dataSet.iloc[:,-1].value_counts()
     
    infoEnt = 0.0
    for i in label.index:
        # Pi
        Pi = label[i]/numEntres
        # H(D)
        infoEnt = infoEnt - Pi * log(Pi, 2)
         
    return infoEnt
    #code end here
    #返回值 infoEnt 为数据集的信息熵,表示为 float 类型
     
if __name__ == '__main__':
    print(calcInfoEnt(dataSet))
    #输出为当前数据集的信息熵

运行结果:
在这里插入图片描述



2. 使用梯度下降对逻辑回归进行训练

描述
在这里插入图片描述

实现代码:

import numpy as np
import pandas as pd

def generate_data():
    datasets = pd.read_csv('dataSet.csv', header=None).values.tolist()
    labels = pd.read_csv('labels.csv', header=None).values.tolist()
    return datasets, labels
def sigmoid(X):
    #补全 sigmoid 函数功能
    #code start here
    s = 1/(1+np.exp(-X))
    return s
    #code end here
def gradientDescent(dataMatIn, classLabels):
    alpha = 0.001  # 学习率,也就是题目描述中的 α
    iteration_nums = 100  # 迭代次数,也就是for循环的次数
    dataMatrix = np.mat(dataMatIn) 
    labelMat = np.mat(classLabels).transpose() 
    m, n = np.shape(dataMatrix)  # 返回dataMatrix的大小。m为行数,n为列数。
    weight_mat = np.ones((n, 1)) #初始化权重矩阵
    #iteration_nums 即为循环的迭代次数
    #请在代码完善部分注意矩阵乘法的维度,使用梯度下降矢量化公式
    #code start here
    for i in range(iteration_nums):
        error = sigmoid(dataMatrix*weight_mat)-labelMat
        weight_mat=weight_mat-alpha*dataMatrix.transpose()*error
    
    return weight_mat

    #code end here
if __name__ == '__main__':
    dataMat, labelMat = generate_data()
    print(gradientDescent(dataMat, labelMat))

运行结果:

在这里插入图片描述


《100天精通Python》专栏推荐白嫖80g Python全栈视频

《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)!
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述