当前位置: 首页 > news >正文

保定徐水网站建设杭州手机软件开发

保定徐水网站建设,杭州手机软件开发,商城网站建设公司哪家好,北京黄页#x1f935;‍♂️ 个人主页: AI_magician #x1f4e1;主页地址#xff1a; 作者简介#xff1a;CSDN内容合伙人#xff0c;全栈领域优质创作者。 #x1f468;‍#x1f4bb;景愿#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长#xff01;#xff01;… ‍♂️ 个人主页: AI_magician 主页地址 作者简介CSDN内容合伙人全栈领域优质创作者。 ‍景愿旨在于能和更多的热爱计算机的伙伴一起成长‍ ‍♂️声明本人目前大学就读于大二研究兴趣方向人工智能硬件虽然硬件还没开始玩但一直很感兴趣希望大佬带带 该文章收录专栏 [✨— 《深入解析机器学习从原理到应用的全面指南》 —✨] 决策树 1.1 分类 决策树是一种基于树形结构的分类模型它通过对数据属性的逐步划分将数据集分成多个小的决策单元。每个小的决策单元都对应着一个叶节点在该节点上进行分类决策。决策树的核心是如何选择最优的分割属性。常见的决策树算法有ID3、C4.5和CART。 决策树的输入数据主要包括训练集和测试集。训练集是已知类别的样本集测试集则是需要分类的未知样本集。 具体来说构建决策树的过程可以分为如下几个步骤 选择最优特征。在构建决策树时需要从当前样本集合中选择一个最优的特征作为当前节点的划分属性。通常使用信息增益、信息增益比或基尼指数等指标来评估各个特征的划分能力并选取最优特征。划分子集。根据选取的最优特征将当前样本集合划分成若干个子集。每个子集对应于一个子节点且该节点所代表的样本集合与其父节点的样本集合不重复。递归构建决策树。对于每个子节点重复前两个步骤直到所有的样本都被分配到叶子节点上并且每个叶子节点对应着一个类别。剪枝操作。由于决策树容易出现过拟合因此需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。 在进行分类时对输入测试样本按照各个属性的划分方式逐步匹配最终到达某个叶子节点并将该测试样本归为叶子节点所代表的类别。决策树的输出结果就是针对测试样本的分类结果即该测试样本所属的类别。 决策树的优点在于易于理解和解释能够处理不同类型的数据且不需要对数据进行预处理。但是决策树容易出现过拟合问题因此在构建决策树时需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。 1.1.1 案例 假设我们要构建一个决策树来预测一个人是否会购买某个产品。我们将使用以下特征来进行预测 年龄年龄范围在18岁到65岁之间。性别男性或女性。收入收入范围在0到100,000之间。 我们有一个包含以下数据的训练集 编号年龄性别收入购买125男性30,000否235女性40,000否345女性80,000是420男性10,000否555男性60,000是660女性90,000是730男性50,000否840女性75,000是 现在我们将使用这些数据来构建一个决策树模型。 首先我们选择一个特征来作为根节点。我们可以使用信息增益或基尼不纯度等指标来选择最佳特征。在这个例子中我们选择使用信息增益。 基尼指数和信息增益都是用于决策树中特征选择的指标它们各有优劣。 基尼指数是一种衡量数据集纯度或不确定性的指标常用于决策树算法中的特征选择。它基于基尼系数的概念用于度量从数据集中随机选择两个样本其类别标签不一致的概率。 基尼指数的计算公式如下 G i n i ( D ) 1 − Σ ( p i ) 2 Gini(D) 1 - Σ (p_i)^2 Gini(D)1−Σ(pi​)2 其中Gini(D)表示数据集D的基尼指数p_i表示数据集D中第i个类别的样本所占比例。 基尼指数的取值范围为0到1数值越小表示数据集的纯度越高即样本的类别越一致。当数据集D中只包含一种类别的样本时基尼指数为0表示数据集完全纯净。当数据集D中的样本类别均匀分布时基尼指数最大即值越小为1表示数据集的不确定性最高。 在决策树算法中基尼指数被用于衡量选择某个特征进行划分后数据集的纯度提升程度。通过计算每个特征的基尼指数选择基尼指数最小的特征作为划分依据以达到最大程度地减少数据集的不确定性。 计算每个特征的信息增益 年龄的信息增益0.029性别的信息增益0.152收入的信息增益0.048 根据信息增益我们选择性别作为根节点。 信息增益是一种用于选择决策树节点的指标它衡量了在选择某个特征作为节点后数据集的纯度提高了多少。信息增益的计算基于信息熵的概念。 信息熵是用来衡量数据集的混乱程度或不确定性的度量。对于一个二分类问题如购买与否信息熵的计算公式如下 多分类也一样每个不题类别求和 E n t r o p y ( S ) − p ( Y e s ) ∗ l o g 2 ( p ( Y e s ) ) − p ( N o ) ∗ l o g 2 ( p ( N o ) ) Entropy(S) -p(Yes) * log2(p(Yes)) - p(No) * log2(p(No)) Entropy(S)−p(Yes)∗log2(p(Yes))−p(No)∗log2(p(No)) 其中S是数据集p(Yes)和p(No)分别是购买为是和否的样本在数据集中的比例。(信息熵代表了分布越平均,样本信息含量越高,不确定性越大,信息熵越大分布越不均匀占比越大信息熵会趋于0。所以以信息熵大小来确定分类就是为了把一些小范围的集合分离出去) 信息增益的计算公式如下不同类别信息熵相加 G a i n ( S , A ) E n t r o p y ( S ) − ∑ ( ∣ S v ∣ / ∣ S ∣ ) ∗ E n t r o p y ( S v ) Gain(S, A) Entropy(S) - ∑(|Sv| / |S|) * Entropy(Sv) Gain(S,A)Entropy(S)−∑(∣Sv∣/∣S∣)∗Entropy(Sv) 其中S是数据集A是要计算信息增益的特征Sv是特征A的某个取值对应的子集|Sv|是子集Sv的样本数量|S|是数据集S的样本数量。 通过这个子集数量控制其影响权重然后确定信息增益最大的即信息熵最小白话就是选择一个分类中更主流的特征更明显的 信息增益越大意味着使用特征A作为节点可以更好地分割数据集提高纯度。 在我们的例子中我们计算了每个特征的信息增益并选择了具有最大信息增益的特征作为根节点。然后我们根据根节点的取值将数据集分割成子集并对每个子集计算信息增益以选择下一个节点。这个过程一直持续到满足停止条件为止例如子集中的样本都属于同一类别或达到了预定的树的深度。 总结以下是基尼指数和信息增益的优缺点 优点 基尼指数基尼指数是一种衡量不纯度的指标它在计算上比信息增益更简单和高效。在处理大规模数据集时基尼指数的计算速度通常比信息增益快。单纯计算特征分类占比占比平方信息增益信息增益是一种衡量特征对于分类任务的贡献程度的指标。它基于信息论的概念可以更好地处理多分类问题。信息增益在处理不平衡数据集时表现较好能够更好地处理类别不均衡的情况。除了计算特征分类占比还添加了一个log函数log比例乘上占比使其贡献度分类占比大小情况得到增益 缺点 基尼指数基尼指数只考虑了特征的不纯度而没有考虑特征的取值个数。这意味着基尼指数可能会偏向具有更多取值的特征。在处理具有大量取值的特征时基尼指数可能会导致决策树偏向这些特征。基尼指数只要是要这个阈值节点能分出去的样本比例最大有多大最大越大越倾向于信息增益信息增益对于具有较多取值的特征有一定的偏好因为它倾向于选择具有更多分支的特征。这可能导致决策树过于复杂容易过拟合训练数据树的深度不要太深。信息增益根据一种信息学的信息熵根据其性质分类越平均越大分类占比大越小的一个性质来分节点。 综上所述基尼指数和信息增益在不同的情况下有不同的优劣。在实际应用中可以根据具体的问题和数据集的特点选择适合的指标。 接下来我们根据性别的取值男性或女性将数据集分割成两个子集。 对于男性子集 编号年龄收入购买12530,000否42010,000否55560,000是73050,000否 对于女性子集 编号年龄收入购买23540,000否34580,000是66090,000是84075,000是 对于男性子集我们可以看到购买的结果是是和否都有所以我们需要进一步划分。我们选择年龄作为下一个节点。 对于年龄的取值小于等于30岁和大于30岁 对于小于等于30岁的子集 编号收入购买130,000否410,000否750,000否 对于大于30岁的子集 编号收入购买560,000是 对于小于等于30岁的子集购买的结果都是否所以我们不需要再进行划分。 对于大于30岁的子集购买的结果都是是所以我们不需要再进行划分。 对于女性子集购买的结果都是是所以我们不需要再进行划分。 最终的决策树如下所示 性别 男性:年龄 30岁: 否年龄 30岁: 是 性别 女性: 是这就是一个简单的决策树的例子。根据输入的特征决策树可以根据特征的取值进行预测。请注意这只是一个简单的示例实际上决策树可以有更多的特征和更复杂的结构。 首先我们使用scikit-learn库来实现决策树 from sklearn import tree import numpy as np# 数据集 X np.array([[25, 1, 30000],[35, 0, 40000],[45, 0, 80000],[20, 1, 10000],[55, 1, 60000],[60, 0, 90000],[30, 1, 50000],[40, 0, 75000]])Y np.array([0, 0, 1, 0, 1, 1, 0, 1])# 创建决策树模型 clf tree.DecisionTreeClassifier()# 训练模型 clf clf.fit(X, Y)# 预测 print(clf.predict([[40, 0, 75000],[10, 0, 75000]])) # 输出[1, 0]然后我们不使用任何机器学习库来实现决策树 import numpy as npclass Node:def __init__(self, predicted_class):self.predicted_class predicted_class # 预测的类别self.feature_index 0 # 特征索引self.threshold 0 # 阈值self.left None # 左子树self.right None # 右子树class DecisionTree:def __init__(self, max_depthNone):self.max_depth max_depth # 决策树的最大深度def fit(self, X, y):self.n_classes_ len(set(y)) # 类别的数量self.n_features_ X.shape[1] # 特征的数量self.tree_ self._grow_tree(X, y) # 构建决策树def predict(self, X):return [self._predict(inputs) for inputs in X] # 对输入数据进行预测def _best_gini_split(self, X, y):m y.size # 样本的数量if m 1: # 如果样本数量小于等于1无法进行分割return None, Nonenum_parent [np.sum(y c) for c in range(self.n_classes_)] # 每个类别在父节点中的样本数量best_gini 1.0 - sum((n / m) ** 2 for n in num_parent) # 父节点的基尼指数best_idx, best_thr None, None # 最佳分割特征索引和阈值for idx in range(self.n_features_): # 遍历每个特征thresholds, classes zip(*sorted(zip(X[:, idx], y))) # 根据特征值对样本进行排序num_left [0] * self.n_classes_ # 左子节点中每个类别的样本数量num_right num_parent.copy() # 右子节点中每个类别的样本数量初始值为父节点的样本数量for i in range(1, m): # 遍历每个样本c classes[i - 1] # 样本的类别num_left[c] 1 # 更新左子节点中对应类别的样本数量num_right[c] - 1 # 更新右子节点中对应类别的样本数量gini_left 1.0 - sum((num_left[x] / i) ** 2 for x in range(self.n_classes_)) # 左子节点的基尼指数gini_right 1.0 - sum((num_right[x] / (m - i)) ** 2 for x in range(self.n_classes_)) # 右子节点的基尼指数gini (i * gini_left (m - i) * gini_right) / m # 加权平均的基尼指数if thresholds[i] thresholds[i - 1]: # 如果特征值相同则跳过特征阈值continueif gini best_gini: # 如果基尼指数更小则更新最佳分割特征索引和阈值 循环每个特征和每个阈值以求解最优分类best_gini ginibest_idx idxbest_thr (thresholds[i] thresholds[i - 1]) / 2return best_idx, best_thr # 返回最佳分割特征索引和阈值def _best_gain_split(self, X, y):m y.size # 样本的数量if m 1: # 如果样本数量小于等于1无法进行分割return None, Nonenum_parent [np.sum(y c) for c in range(self.n_classes_)] # 计算每个类别的样本数量best_gain -1 # 初始化最佳信息增益best_idx, best_thr None, None # 初始化最佳特征索引和阈值for idx in range(self.n_features_): # 遍历每个特征thresholds, classes zip(*sorted(zip(X[:, idx], y))) # 对每个特征值和类别标签进行排序num_left [0] * self.n_classes_ # 初始化左子树的类别数量 (左边都是0,为0时自动计算为0 num_right num_parent.copy() # 右子树的类别数量初始化为父节点的类别数量 (右边是全部for i in range(1, m): # 遍历每个样本c classes[i - 1] # 获取当前样本的类别num_left[c] 1 # 左子树的类别数量增加num_right[c] - 1 # 右子树的类别数量减少entropy_parent -sum((num / m) * np.log2(num / m) for num in num_parent if num ! 0) # 计算父节点的熵entropy_left -sum((num / i) * np.log2(num / i) for num in num_left if num ! 0) # 计算左子树的熵entropy_right -sum((num / (m - i)) * np.log2(num / (m - i)) for num in num_right if num ! 0) # 计算右子树的熵gain entropy_parent - (i * entropy_left (m - i) * entropy_right) / m # 计算信息增益分类后左右的信息熵最小if thresholds[i] thresholds[i - 1]: # 如果当前样本的特征值和前一个样本的特征值相同跳过不一样才能分界continueif gain best_gain: # 如果当前的信息增益大于最佳信息增益best_gain gain # 更新最佳信息增益best_idx idx # 更新最佳特征索引best_thr (thresholds[i] thresholds[i - 1]) / 2 # 更新最佳阈值 循环每个样本的值根据两份数据均值确定阈值一直循环return best_idx, best_thr # 返回最佳特征索引和阈值def _grow_tree(self, X, y, depth0):num_samples_per_class [np.sum(y i) for i in range(self.n_classes_)] # 计算每个类别的样本数量predicted_class np.argmax(num_samples_per_class) # 预测的类别为样本数量最多的类别 即确定分到该分支样本最多的记为该类node Node(predicted_classpredicted_class) # 创建节点if depth self.max_depth: # 如果当前深度小于最大深度idx, thr self._best_gain_split(X, y) # 计算最佳分割if idx is not None: # 如果存在最佳分割indices_left X[:, idx] thr # 左子树的样本索引 (第 idx特征中小于thr阈值的索引)X_left, y_left X[indices_left], y[indices_left] # 左子树的样本X_right, y_right X[~indices_left], y[~indices_left] # 右子树的样本node.feature_index idx # 设置节点的特征索引node.threshold thr # 设置节点的阈值node.left self._grow_tree(X_left, y_left, depth 1) # 构建左子树node.right self._grow_tree(X_right, y_right, depth 1) # 构建右子树return node # 返回节点def _predict(self, inputs):node self.tree_ # 获取决策树的根节点while node.left: # 如果存在左子树if inputs[node.feature_index] node.threshold: # 如果输入样本的特征值小于阈值node node.left # 到左子树else:node node.right # 到右子树return node.predicted_class # 返回预测的类别# 数据集 X [[25, 1, 30000],[35, 0, 40000],[45, 0, 80000],[20, 1, 10000],[55, 1, 60000],[60, 0, 90000],[30, 1, 50000],[40, 0, 75000]]Y [0, 0, 1, 0, 1, 1, 0, 1]# 创建决策树模型 clf DecisionTree(max_depth2)# 训练模型 clf.fit(np.array(X), np.array(Y))# 预测 print(clf.predict([[40, 0, 75000],[10, 0, 75000]])) # 输出[1, 0]请注意这个不使用任何机器学习库的决策树实现是一个基本的版本它可能无法处理所有的情况例如缺失值、分类特征等。在实际应用中我们通常使用成熟的机器学习库如scikit-learn因为它们提供了更多的功能和优化。 1.2 回归 当决策树用于回归任务时它被称为决策树回归模型。与分类树不同决策树回归模型的叶子节点不再表示类别标签而是表示一段连续区间或者一个数值。它同样基于树形结构通过对数据特征的逐步划分将数据集分成多个小的决策单元并在每个叶子节点上输出一个预测值。 以下是决策树回归模型的详细原理 划分过程 与分类树相似决策树回归模型也采用递归二分的方式进行划分。具体来说从根节点开始选择一个最优特征和该特征的最优划分点。然后将数据集按照该特征的取值分为两部分分别构建左右子树。重复以上步骤直到满足停止条件比如达到最大深度、划分后样本数少于阈值等。 叶子节点的输出值 当到达某个叶子节点时该叶子节点的输出值就是训练集中该叶子节点对应的所有样本的平均值或中位数等。 预测过程 对于一个测试样本从根节点开始按照各个特征的划分方式逐步匹配最终到达某个叶子节点并将该测试样本的预测值设为该叶子节点的输出值。 剪枝操作 与分类树一样决策树回归模型也容易出现过拟合问题因此需要进行剪枝操作。常用的剪枝方法包括预剪枝和后剪枝。 特点 决策树回归模型具有以下特点 1易于解释决策树回归模型能够直观地反映各个特征对目标变量的影响程度。 2非参数性决策树回归模型不对数据分布做任何假设适用于各种类型的数据。 3可处理多元特征决策树回归模型可以同时处理多个输入特征。 4不需要数据正态化决策树回归模型不需要对输入数据进行正态化等预处理。 到这里如果还有什么疑问欢迎私信博主问题哦博主会尽自己能力为你解答疑惑的如果对你有帮助你的赞是对博主最大的支持
http://www.hkea.cn/news/14518827/

相关文章:

  • 哪些网站可以做房产推广能自己在家做网站吗
  • j永久网站gta5买房子网站建设
  • 望京网站建设东营网站建设方案策划
  • wordpress建站说明解读网站建设
  • 用家里网络做网站外贸网站如何引流
  • 唐山地区网站开发公司建e网室内设计网官网vr全景
  • 网站改版建设征求意见书电脑培训网上课程
  • 简约门户网站源码修改wordpress代码
  • 唐山玉田网站建设微信小程序制作软件哪个好
  • 做爰全过程免费的视频99网站制作网站的难度
  • 怎么做交易平台网站吴江网站建设
  • 江苏建设标准网站高端品牌鞋子有哪些牌子
  • 北京模板网站建设公司网站建设汇报评估
  • 建个私人网站怎么做网络营销有哪些就业岗位
  • 软件开发流程有哪些阶段湖南seo网站设计
  • 常德市建设网站seo网络推广外包公司
  • 顺义深圳网站建设公司修改wordpress注册邮件
  • 东莞网站优化排名网站免费域名注册解析
  • 网站空间服务商查询国家工商营业执照查询官网
  • 怎样用服务器做网站电脑网速很慢但是wifi又很正常
  • 产业协会建设网站方案wordpress 评论者邮箱
  • 什么软件做网站比较好个人注册的网站可以做公司宣传用吗
  • 建立网站的服务器赚钱做任务的网站有哪些
  • 大兴企业官网网站建设咨询网站分页制作
  • 内部网站建设个人姓名最多备案多少个网站
  • 做网站要什么知识条件南阳网站运营
  • 想要网站推广版抖音小程序平台
  • 广昌建设局官方网站手机网站logo
  • 网站设计的公司运营接单东莞网络推广服务商
  • 大航母网站建设凡科网建站教程