随机森林与线性回归

集成学习方法之随机森林

集成学习(Ensemble Learning)是一种通过组合多个分类器来提高预测性能的方法。主要分为三种类型:Bagging、Boosting和Stacking。以下是集成学习的基本步骤和概念:

1数据采样:从训练集中有放回地随机抽取多个子集。

2模型训练:在每个子集上训练一个子模型(例如决策树)。

3继承预测:对于分类问题,通过投票(选择得票最多的类别)来确定最终的预测结果。

随机森林是集成学习的一种应用。它通过构建多个决策树(通常称为基学习器或弱学习器),每棵树使用不同的数据和特征子集进行训练。最终,随机森林通过对所有决策树的预测结果进行投票来获得最终结果。随机森林不仅能提高预测精度,还能有效降低过拟合风险,并处理高纬度和大规模数据集。

1. 算法原理

  • 随机性

    • 样本:每次从训练集T中有放回地随机抽取n个样本用于训练一个决策树。

    • 特征:每棵树在训练时仅使用k(k<d)个随机选择的特征。

  • 森林:由多个决策树组成的集成分类器,通过引入随机性生成多个不同的决策树。

  • 优势:能够处理高维特征数据,无需降维,且通过平均或投票机制提高预测精度并控制过拟合。

2.API及其使用
class sklearn.ensemble.RandomForestClassifier
n_estimators: int, default=100
​
森林中树木的数量(即决策树的数量)。增加树木数量通常会提高模型的性能,但也会增加计算复杂度和内存使用。
​
criterion: {"gini", "entropy"}, default="gini"
​
决策树的分裂标准:
​
"gini":使用基尼不纯度(Gini impurity)来评估特征的分裂效果。
"entropy":使用信息增益(Information Gain)来评估特征的分裂效果。
max_depth: int, default=None
​
决策树的最大深度。限制树的深度可以防止过拟合。如果设置为 None,则树会被扩展到每个叶子节点包含最小样本数(由 min_samples_split 和 min_samples_leaf 控制)的条件下。

示例:坦尼克号乘客生存

import pandas as pd
from sklearn.model_selection import train_test_split
from skearn.freature_extraction import DictVectorizer
from sklearn.tree import export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
​
#加载数据
data=pd.read_csv('./src/titanic/titanic.csv')
x=data[["pclass","age","sex"]]
y=data["survived"]
​
#数据处理
x["age"].fillna(x["age"].mean(),inplace=True)#缺失值处理
x=x.to_dict(orient="records")#转换成字典
​
#数据划分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=44)
​
#字典特征抽取
transfer=DictVectorizer()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
​
#预估器:网格搜索与交叉验证
model=RandomForestClassifier()
predict={"n_estimators":[200,300,400,500,600],"max_depth":[5,6,7,8]}
model=GridSearchCV(model,param_grid=predict,cv=3)
​
#训练
model.fit(x_train,y_train)
​
#模型评估
y_predict=model.predict(x_test)
print("yield:\n",y_predict)
print("直接比对真实值与预测值:\n",y_test==y_predict)
​
#计算准确率
score=model.score(x_test,y_test)
print("准确率:\n",score)
​
print(model.best_estimator_)
print(model.best_score_)
print(model.cv_results_)

线性回归

标称型数据(Nominal Data)用于分类不同的类别,特点包括无序性、非数值性和多样性。例如,颜色、性别等分类数据。这类数据不能进行数学运算,适用于分类任务。

连续型数据(Continuous Data)是可测量的,具有明确的数值关系和距离,如温度、重量。其特点包括可测量性、无限可分性和支持数学运算。这类数据常用于回归分析和各种统计计算。

1.什么是回归?

回归的目的是预测数值型目标值 ( y )。最直接的方法是用输入 ( x ) 写出一个目标值 ( y ) 的计算公式。例如,要预测某机器学习的效果,可能使用如下公式:

y=0.015w1−0.69w2

这就是回归方程,其中 ( 0.015 ) 和 ( -0.69 ) 是回归系数。回归过程的核心在于求这些系数。一旦获得回归系数,预测值就可以通过将输入值乘以相应的系数并求和来得出。

2.线性回归

线性回归是机器学习中一种有监督学习的算法,回归问题主要关注的是因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。

因变量:即目标变量,target,y
自变量:影响目标变量的因素:X_1,X_2...X_n (连续值或离散值)
因变量与自变量之间的关系:即模型,model

人工智能中的线性回归:数据集中,往往找不到一个完美的方程式来100%满足所有的y目标

我们就需要找出一个最接近真理的方程式

3.损失函数

用于衡量模型在训练集上的表现好坏,通常是一个非负数值,其值越小,表示模型的预测结果与真实结果之间的差距越小,即模型的表现越好。

数据: [[4.2, 3.8],[4.2, 2.7],[2.7, 2.4],[0.8, 1.0],[3.7, 2.8],[1.7, 0.9],[3.2, 2.9]]

我们假设 这个最优的方程是:

y=wx+b

这几条中,哪一条是比较好的呢?

有很多方式认为某条直线是最优的,其中一种方式:均方差

就是每个点到线的竖直方向的距离平方 求和 在平均 最小时 这条直接就是最优直线

总误差(也就是传说中的损失):

平均误差(总误差会受到样本点的个数的影响,样本点越多,该值就越大,所以我们可以对其平均化,求得平均值,这样就能解决样本点个数不同带来的影响)

这样就得到了传说中的损失函数:

4.多参数回归

参数回归通常涉及多个自变量(特征)和一个因变量(目标),例如房价预测、股票价格预测、天气预报等,并且可以使用多种回归模型来解决,如线性回归、岭回归、LASSO 回归等。

波士顿房价数据集包含了波士顿郊区的房屋信息,每个样本包含13个特征,以及一个目标值,即该地区的中位数房价。这些特征包括但不限于:

  • CRIM:城镇人均犯罪率

  • ZN:住宅用地超过2.5万平方英尺的比例

  • INDUS:城镇非零售商业用地比例

  • CHAS:虚拟变量,如果邻近查尔斯河则为1

  • NOX:一氧化氮浓度(每千万分之一)

  • RM:每个住宅的平均房间数

  • AGE:1940年前建造的自住单元比例

  • DIS:到波士顿五个就业中心的加权距离

  • RAD:径向公路的可达性指数

  • TAX:全额房产税率

  • PTRATIO:城镇师生比例

  • B:1000(Bk - 0.63)^2,其中Bk是黑人的比例

  • LSTAT:低社会地位人口的比例

目标是预测 MEDV,即自住房屋的中位数价值(以千美元计)。

5.最小二乘法MSE

矩阵相关公式:

最小二乘法

这就是传说中的最小二乘法公式

n为什么等于2,因为是一个常数,求最小值是n随便取哪个正数都不会影响w结果,但是n=2求导过程可以约掉前面的系数

1.二次方程导数为0时最小

2.先展开矩阵乘法

3.进行求导(注意X,y都是已知的,W是未知的)

4.令导数

5.矩阵没有除法,使用逆矩阵转化

第二种方式链式求导

内部函数:

外部函数:

其中

外部函数的导数:

内部函数的导数:

应用链式法则,我们得到最终的梯度:

API及其示例

sklearn.linear_model.LinearRegression()

最小二乘法线性回归,权重和偏置直接算出来的,不适合数据量大太

参数:

fit_intercept bool, default=True 是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。 属性: coef_ 回归后的权重系数 intercept_ 偏置

from sklearn.linear_model import LinearRegression
import numpy as np
​
data=np.array([[0,14,8,0,5,-2,9,-3,399],[-4,10,6,4,-14,-2,-14,8,-144],[-1,-6,5,-12,3,-3,2,-2,30],[5,-2,3,10,5,11,4,-8,126],[-15,-15,-8,-15,7,-4,-12,2,-395],[11,-10,-2,4,3,-9,-6,7,-87],[-14,0,4,-3,5,10,13,7,422],[-3,-7,-2,-8,0,-6,-5,-9,-309]])
x=data[:,0:-1]
y=data[:,-1]
​
model=LinearRegression(fit_intercept=False)
model.fit(x,y)
print("权重系数:\n",model.coef_)
print("偏置:\n",model.intercept_)
y_predict=model.predict([[-1,-6,5,-12,3,-3,2,-2],[5,-2,3,10,5,11,4,-8],[11,14,8,10,5,10,8,1]
])
print("预测值:\n",y_predict)
print(f"评估得分:{model.score(x,y)}")
6.梯度下降
梯度下降概念

核心思想是通过迭代的方式逐步调整参数,使目标函数的值不断减小,直至达到局部或全局最小值。

目标函数:机器学习中,通常时损失函数或代价函数,衡量模型预测与实际值的差异。目标是找到一组参数,是目标函数的值最小。 梯度:梯度是一个向量,表示目标函数在某一点处的斜率,即各个方向上的变化率。梯度的方向指向了函数增长最快的方向。(梯度表示损失函数对于模型参数的偏导数迭代更新:梯度下降通过迭代的方式更新参数,每次更新都朝着梯度的负方向移动一定步长。

梯度下降步骤
  1. 初始化参数

  2. 计算梯度

  3. 更新参数

  4. 检查停止条件

详细步骤解释

1. 初始化参数

  • 选择初始点:选择一组初始参数 w0。这可以是随机选择的,也可以是基于某些先验知识。

  • 设置超参数:选择学习率 α和最大迭代次数 T。学习率 α 控制每次更新的步长,而最大迭代次数 T控制迭代的上限。

2. 计算梯度

  • 目标函数:确定你要最小化的目标函数 J(w)。在机器学习中,这通常是损失函数或代价函数。

  • 梯度:计算目标函数在当前参数 wt 处的梯度 ∇J(wt)。梯度是一个向量,表示目标函数在各个方向上的变化率。梯度的方向指向了函数值增加最快的方向。

3. 更新参数

  • 梯度更新:根据梯度和学习率更新参数:

    wt+1=wt−α∇J(wt)

    这里的wt+1是更新后的参数,wt是当前参数,α是学习率∇J(wt)是目标函数在当前参数处的梯度。

4. 检查停止条件

  • 停止条件:检查是否满足停止条件。常见的停止条件包括:

    • 梯度接近零:当梯度的模长小于某个阈值(例如 ∥∇J(wt)∥<ϵ)时停止迭代。

    • 达到最大迭代次数:当迭代次数达到预设的最大值时停止迭代。

    • 变化量很小:当参数的变化量小于某个阈值时停止迭代,即 ∥wt+1−wt∥<δ。

梯度下降公式

示例:

假设我们的学习率 α=0.01α=0.01,并且我们的目标函数是 f(w)=12w2f(w)=21w2,那么梯度就是 f′(w)=wf′(w)=w

  1. 初始化:w0=0.2

  2. 第一次更新

    • 计算梯度: f′(w0)=0.2

    • 更新参数: w1=w0−αf′(w0)=0.2−0.01×0.2=0.2−0.002=0.198

  3. 第二次更新

    • 计算梯度: f′(w1)=0.198

    • 更新参数: w2=w1−αf′(w1)=0.198−0.01×0.198=0.198−0.00198=0.19602

  4. 第三次更新

    • 计算梯度: f′(w2)=0.19602

    • 更新参数: w3=w2−αf′(w2)=0.19602−0.01×0.19602=0.19602−0.0019602=0.1940598

依此类推,每一步都将使 ww 更接近于 0,即抛物线的最低点。

学习率

学习率(Learning Rate)是梯度下降算法中的一个重要超参数,它决定了每次迭代时参数更新的步长大小。选择合适的学习率对于模型的收敛速度和最终性能至关重要。学习率的选择不当可能会导致算法无法收敛,或者收敛速度非常缓慢。

学习率的作用

学习率 α 决定了每次梯度更新的幅度:

wt+1=wt−α∇J(wt)

  • 如果学习率太大,步长可能会过大,导致参数更新跳跃过大,可能会越过最小值点,甚至导致发散。

  • 如果学习率太小,虽然能更精细地逼近最小值点,但会导致收敛速度非常慢。

通常,学习率设置为小数值(如0.1、0.01、0.001等)是比较常见的做法。在实际应用中,我们可以使用以下策略来优化学习率的设置:

  • 学习率衰减:随着迭代次数的增加,逐渐减小学习率,这样可以在接近最优点时使步长变小,从而提高模型的收敛精度,避免在最优点附近震荡。

  • 自适应学习率优化算法:一些高级优化算法(如Adam、RMSprop等)可以自动调整学习率,根据梯度的历史信息来更新学习率,从而在训练过程中动态优化步长。

自己实现梯度下降

1.假设损失函数是只有一个w1特征的抛物线:

要求解抛物线最小值时的横坐标w1的值

import numpy as np 
import matplotlib.pyplot as plt
def fn1(w):return (w-3.5)**2-4.5*w+20
w=np.linspace(1,10,100)
plt.plot(w,fn1(w))
plt.show()
​
np.random.seed(18)
w1=np.random.randint(1,10)
print("随机初始化一个w1:\n",w1)
def fn2(w1):return 2*(w1-3.5)-4.5
​
#学习率
a=0.01
w2=w1-a*fn2(w1)
print("沿着梯度方向的反方向更新后w2:",w2)
w3=w2-a*fn2(w2)
print("沿着梯度方向的反方向更新后w3:",w3)
sklearn梯度下降
  1. 批量梯度下降 (BGD, Batch Gradient Descent):

    • 在每次更新参数时,使用整个训练集来计算梯度。

    • 优点:每次参数更新都会朝着全局最小值的方向前进,因为它是基于所有数据点的梯度平均。

    • 缺点:计算量大,尤其是在大数据集上,每次迭代都需要计算所有数据点的梯度;而且如果数据很大,则可能导致内存不足的问题。

  2. 小批量梯度下降 (MBGD, Mini-Batch Gradient Descent):

    • 每次更新参数时,从训练集中随机选择一个小批量的数据子集(通常几十到几百个样本)来估计梯度。

    • 优点:结合了BGD和平滑性的优势,并且计算效率比BGD高得多,因为它不需要使用全部数据;同时相比于SGD更加稳定。

    • 缺点:需要选择合适的批量大小,而且在某些情况下可能仍然需要较大的内存来存储批量数据。

  3. 随机梯度下降 (SGD, Stochastic Gradient Descent):

    • 每次更新参数时只使用单个训练样本来估计梯度。

    • 优点:非常快,因为它只需要处理一个样本;适合于大规模数据集。

    • 缺点:由于每次更新都仅基于一个样本,所以更新路径会更不稳定,可能会导致更多的波动,从而使得收敛过程更慢或者更难找到全局最小值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渗透测试】ATTCK靶场一,phpmyadmin,域渗透,内网横向移动攻略

前言 博客主页&#xff1a;h0ack1r丶羽~ 从0到1~ VulnStack&#xff0c;作为红日安全团队匠心打造的知识平台&#xff0c;其独特优势在于全面模拟了国内企业的实际业务场景&#xff0c;涵盖了CMS、漏洞管理及域管理等核心要素。这一设计理念源于红日安全团队对ATT&CK红队评…

斯坦福大学cs231n (图像分类)

1.介绍 当作图像分类时&#xff0c;分类系统接收一些分类图像&#xff0c;比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么&#xff0c;计算机的工作就是根据图片&#xff0c;给他分配一些固定的分类或者标签。 对于一个计算机来说&#xff0c;这是一个非常…

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 SecurityContextHolder用来获取登录之后用户信息。Spring Security 会将登录用户数据保存在Session中。但是&#xff0c;为了使用方便,Spring Security在此基础上还做了一些改进&#xff0c;其中最主要的一个变化就是线程绑定。当用户登录成功…

FastGPT如何增减用户

背景 开源版本的FastGPT默认只有一个超级用户root&#xff0c;为了更好地管理应用和知识库&#xff0c;可以通过操作MongoDB数据库来增加新的用户和团队。 所需环境 已安装并运行的FastGPT实例MongoDB客户端工具&#xff08;如Mongo Shell或Robo 3T等&#xff09; 操作步骤…

数据库三大范式

三大范式 一种数据库设计理念&#xff0c;意义在于降低耦合 写代码 高内聚 低耦合 一个表只有一个主键 一个主键可以是多列 ‌第一范式&#xff08;1NF&#xff09;‌&#xff1a;要求数据库表的每一列都是不可分割的原子数据项&#xff0c;即列中存储的数据是最小的数据单元&…

并发服务器

一、服务器 1.单循环服务器&#xff1a;同一时刻&#xff0c;只能处理一个客户端的任务&#xff1b; 2.并发服务器&#xff1a;同一时刻&#xff0c;可以处理多个客户端的任务&#xff1b; 3.TCP并发服务器&#xff1a; &#xff08;1&#xff09;多进程: &#xff08;2&a…

搭建面向切面编程项目

此项目在整合Mybatis基础上修改&#xff0c;可参考主页的整合Mybatis文章 注解版本 第一步 引入maven坐标 <!-- 切面编程所需jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>…

Windows 11系统 Eclipse 2024版本安装教程和环境搭建

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Eclipse 是一个开源的集成开发环境 (IDE)&#xff0c;主要用于 Java 开发&#xff0c;但也支持其他编程语言如 C、Python 和 PHP。它提供了丰富的工具和插件&#xff0c;用于编写、调试和管理代码&#x…

安卓13 背光反向 亮度反向 android13 backlight reverse

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 有些设备,在调整背光的时候,会发现,背光调大,显示亮度反而变暗,背光调小,亮度变亮。这是由于PWM背光本身并没有一个标准去决定怎么样算是高亮度,怎么算是低亮度。因…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…

Onnx使用预训练的 ResNet18 模型对输入图像进行分类,并将分类结果显示在图像上

目录 一、整体功能概述 二、函数分析 2.1 resnet() 函数&#xff1a; 2.2 pre_process(img_path) 函数&#xff1a; 2.3 loadOnnx(img_path) 函数&#xff1a; 三、代码执行流程 一、整体功能概述 这段代码实现了一个图像分类系统&#xff0c;使用预训练的 ResNet18 模型对…

设计模式26-解析器模式

设计模式26-解析器模式 动机定义与结构定义结构 C代码推导代码说明 优缺点应用总结 动机 在软件构建过程中&#xff0c;如果某一特定领域的问题比较复杂&#xff0c;类似结构会不断重复的出现。如果使用普通的编程方式来实现&#xff0c;将面临非常频繁的变化。 在这种情况下&…

无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能

无人机 PX4 飞控 | ROS应用层开发&#xff1a;指令&#xff08;字符串&#xff09;订阅功能 指令&#xff08;字符串&#xff09;订阅功能代码测试 指令&#xff08;字符串&#xff09;订阅功能 为了通过键盘触发mavros 的不同功能&#xff0c;需要实现一个订阅字符串的功能 该…

【国外比较权威的免费的卫星数据网站】

国外比较权威的免费卫星数据网站有多个&#xff0c;它们各自在数据覆盖范围、分辨率、以及数据种类等方面具有不同的特点和优势。以下是一些推荐的网站&#xff1a; NASA Worldview 网址&#xff1a;https://worldview.earthdata.nasa.gov/简介&#xff1a;NASA Worldview显示…

p10 容器的基本命令

首先先拉取一个centos的镜像 命令&#xff1a;docker pull centos 新建容器并且启动 这里直接参考老师的命令吧 接下来是启动并且进入到容器当中去输入docker run -it centos /bin/bash这里是以交互的方式进入到容器中可以看到接下来的ls命令输出的东西就是一个Linux系统最…

Python和MATLAB和R对比敏感度函数导图

&#x1f3af;要点 深度学习网络两种选择的强制选择对比度检测贝叶斯自适应估计对比敏感度函数空间观察对比目标量化视觉皮质感知差异亮度、红/绿值、蓝/黄值色彩空间改变OpenCV图像对比度对比敏感度函数模型空间对比敏感度估计眼球运动医学研究空间时间颜色偏心率对比敏感度函…

mysql 不同版本安装不同端口

安装版本为Mysql8.0.11 先解压&#xff0c;解压后&#xff0c;包下创建my.ini文件内容如下&#xff1a; 注意&#xff1a;端口不能给别的mysql一样 [mysqld]# 设置3306端口port3307 # 自定义设置mysql的安装目录&#xff0c;即解压mysql压缩包的目录basedirD:\\rj\\mysql8.0.…

模型 SPIN销售法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。探需挖痛&#xff0c;引导成交。 1 SPIN销售法的应用 1.1 提升工作效率的软件销售应用SPIN模型 一家制造企业正在寻求提升工作效率的解决方案。他们注意到员工在处理文件和任务时存在效率问题&#…

【Docker】Linux系统以及威联通QNAP部署思源笔记的通用教程

本文首发于 ❄️慕雪的寒舍 本文测试的是旧版本v2.11.4的部署方式&#xff0c;实测当前&#xff08;2024.08.15&#xff09;最新的v3.1.3版本也可以用相同的方式部署。本文的部署方式共写了三种&#xff0c;非qnap的linux系统也可以参考本文部署思源笔记。 阅读本文之前&#…

新审视零阶优化在内存高效大模型微调中的应用

人工智能咨询培训老师叶梓 转载标明出处 随着大模型模型规模的增大&#xff0c;反向传播&#xff08;BP&#xff09;所需的内存开销也日益增加&#xff0c;这对内存效率提出了挑战。尤其是在设备上训练等内存效率至关重要的应用场景中&#xff0c;解决这一问题变得尤为迫切。 …