机器学习基础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)
相关推荐
电子海鸥10 分钟前
迁移学习--fasttext概述
人工智能·机器学习·迁移学习
dwjf32121 分钟前
机器学习(三)-多项式线性回归
人工智能·机器学习·线性回归
愚者大大4 小时前
优化算法(SGD,RMSProp,Ada)
人工智能·算法·机器学习
dundunmm5 小时前
数据挖掘之认识数据
人工智能·机器学习·信息可视化·数据挖掘
梁小憨憨5 小时前
机器学习(Machine Learning)的安全问题
人工智能·安全·机器学习
liuming19926 小时前
Halcon中histo_2dim(Operator)算子原理及应用详解
图像处理·人工智能·深度学习·算法·机器学习·计算机视觉·视觉检测
海棠AI实验室7 小时前
机器学习基础算法 (一)-线性回归
人工智能·python·机器学习
星霜旅人7 小时前
均值聚类算法
人工智能·机器学习·支持向量机