机器学习基础05_随机森林&线性回归

一、随机森林

机器学习中有一种大类叫集成学习(Ensemble Learning),集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法大致可以分为:Bagging,Boosting 和 Stacking 三大类型。

(1)每次有放回地从训练集中取出 n 个训练样本,组成新的训练集;

(2)利用新的训练集,训练得到M个子模型;

(3)对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别。

随机森林则是基于决策树的集成学习算法,是通过构建一个包含多个决策树(通常称为基学习器或弱学习器)的森林,每棵树都在不同的数据子集和特征子集上进行训练,最终通过投票或平均预测结果来产生更准确和稳健的预测。

这种方法不仅提高了预测精度,也降低了过拟合风险,并且能够处理高维度和大规模数据集。

思想步骤:

假设训练集 T 的大小为 N ,特征数目为 M ,随机森林的大小为 K;

遍历随机森林的大小 K 次:

从训练集 T 中有放回抽样的方式,取样N 次形成一个新子训练集 D

随机选择 m 个特征,其中 m < M

使用新的训练集 D 和 m 个特征,学习出一个完整的决策树,得到随机森林

m 的选择:对于分类问题,可以在每次划分时使用个特征,对于回归问题, 选择 但不少于 5 个特征
api

sklearn.ensemble.RandomForestClassifier

参数:

n_estimators int, default=100

森林中树木的数量。(决策树个数)

criterion {"gini", "entropy"}, default="gini" 决策树属性划分算法选择

当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树,

当criterion取值为 "entropy" 时采用信息增益( information gain)算法构造决策树.

max_depth int, default=None 树的最大深度

python 复制代码
# 泰坦尼克号人员数据集 随机森林分类
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pandas as pd

data = pd.read_csv('../src/titanic/titanic.csv')
data.fillna(data['age'].mode()[0],inplace=True)
# data.tail()
y = data[['survived']].to_numpy()
data.drop(['survived'],axis=1,inplace=True)

dict1 = data.to_dict(orient='records')
transfer = DictVectorizer(sparse=False)
x = transfer.fit_transform(dict1)
# print(x)

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=20)
# 标准化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 训练模型
estimator = RandomForestClassifier(n_estimators=100,max_depth=8,criterion='gini')
estimator.fit(x_train,y_train)
# 模型评估
score = estimator.score(x_test,y_test)
print(f'得分{score}')
# 得分0.8206686930091185

二、线性回归

回归分析在统计学中是研究多组变量间关系的方法,在机器学习中也应用广泛。前面介绍了很多分类算法,分类的目标变量是标称型数据 ,回归是对连续型数据做出预测。

标称型数据(Nominal Data)是统计学和数据分析中的一种数据类型,它用于分类或标记不同的类别或组别,数据点之间并没有数值意义上的距离或顺序。例如,颜色(红、蓝、绿)、性别(男、女)或产品类别(A、B、C)。

标称数据的特点:

  1. 无序性:标称数据的各个类别之间没有固有的顺序关系。例如,"性别"可以分为"男"和"女",但"男"和"女"之间不存在大小、高低等顺序关系。

  2. 非数值性:标称数据不能进行数学运算,因为它们没有数值含义。你不能对"颜色"或"品牌"这样的标称数据进行加减乘除。

  3. 多样性:标称数据可以有很多不同的类别,具体取决于研究的主题或数据收集的目的。

  4. 比如西瓜的颜色,纹理,敲击声响这些数据就属于标称型数据,适用于西瓜分类。

连续型数据(Continuous Data)表示在某个范围内可以取任意数值的测量,这些数据点之间有明确的数值关系和距离。例如,温度、高度、重量等

连续型数据的特点包括:

  1. 可测量性:连续型数据通常来源于物理测量,如长度、重量、温度、时间等,这些量是可以精确测量的。

  2. 无限可分性:连续型数据的取值范围理论上是无限可分的,可以无限精确地细分。例如,你可以测量一个物体的长度为2.5米,也可以更精确地测量为2.53米,甚至2.5376米,等等。

  3. 数值运算:连续型数据可以进行数学运算,如加、减、乘、除以及求平均值、中位数、标准差等统计量。

回归,一般都是指线性回归(linear regression)。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。线性回归是机器学习中一种有监督学习 的算法,回归问题 主要关注的是因变量 (需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。

1、损失函数

对于多个样本点,假设 ,代入:

...

则损失函数 loss:

先在 b=0 的情况下讨论:要使得 loss 最小,因为 已知,故求满足条件的 的值即可:

实际情况下,往往影响结果y的因素不止1个,这时x就从一个变成了n个:

2、最小二乘法

loss 表达优化为:

这就是最小二乘法公式, ||A||^2 是欧几里得范数的平方,也就是每个元素的平方相加。

将x,y,w 分别用矩阵表示,在矩阵形式下进行运算:

要求最小loss值,可求loss求导导数为0的w:

求导: 得:

链式方式求导:内部函数是 f(W) = XW - y ,外部函数是: ,其中 u = f(W) 。

外部函数的导数:

内部函数的导数:

链式方式:

api

sklearn.linear_model.LinearRegression()

功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法

参数:

fit_intercept bool, default=True

是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。

属性:

coef_ 回归后的权重系数

intercept_ 偏置

print("权重系数为:\n", estimator.coef_) #权重系数与特征数一定是同样的个数。

print("偏置为:\n", estimator.intercept_)

python 复制代码
from sklearn.inear_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:8]
y = data[:, -1:]

estimator = LinearRegression(fit_intercept=False)
estimator.fit(x,y)
print("权重系数为:\n", estimator.coef_)  # 权重系数与特征数一定是同样的个数
print("偏置为:\n", estimator.intercept_)

x_new = [[-4,10,6,4,-14,-2,-14,8]]
y_predict = estimator.predict(x_new)
print(f'y_predict:\n{y_predict}')
print(-4*0.4243965+10*7.32281732+6*15.05217218+4*3.5996297-14*12.05805264-2*1.76972959-14*17.0276393+8*11.31212591)
相关推荐
产品经理独孤虾6 小时前
人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像
人工智能·机器学习·ai·大模型·产品经理·商品画像·商品工业属性
胖达不服输9 小时前
「日拱一码」020 机器学习——数据处理
人工智能·python·机器学习·数据处理
吹风看太阳11 小时前
机器学习16-总体架构
人工智能·机器学习
AI生存日记13 小时前
AI 行业早报:微软发布诊断工具,上海聚焦四大应用场景
人工智能·microsoft·机器学习·open ai大模型
FF-Studio17 小时前
大语言模型(LLM)课程学习(Curriculum Learning)、数据课程(data curriculum)指南:从原理到实践
人工智能·python·深度学习·神经网络·机器学习·语言模型·自然语言处理
狗头大军之江苏分军17 小时前
疑似华为盘古AI大模型翻车造假风波【实时记录篇】
人工智能·机器学习·程序员
LucianaiB20 小时前
Chatbox➕知识库➕Mcp = 机器学习私人语音助手
机器学习·知识库·mcp·chatbox
SHIPKING3931 天前
【机器学习&深度学习】什么是下游任务模型?
人工智能·深度学习·机器学习
巴伦是只猫1 天前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
巴伦是只猫1 天前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习