机器学习day5-随机森林和线性代数1最小二乘法
十 集成学习方法之随机森林
集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。大致可以分为:Bagging,Boosting 和 Stacking 三大类型。
(1)每次有放回地从训练集中取出 n 个训练样本,组成新的训练集;
(2)利用新的训练集,训练得到M个子模型;
(3)对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别;(取众数?平均数?)
随机森林属于集成学习,通过构建一个包含多个决策树(通常称为基学习器或弱学习器)的森林,每棵树都在不同的数据子集和特征子集上进行训练,最终通过投票或平均预测结果(取结果最多的数据作为预测数据)来产生更准确和稳健的预测。
优点:提高了预测精度,降低了过拟合风险,能够处理高维度和大规模数据集
1算法原理
-
随机: 特征随机,训练集随机(分类器是一样的,模型不一样)
-
样本:对于一个总体训练集T,T中共有N个样本,每次有放回地随机选择n个样本。用这n个样本来训练一个决策树。
-
特征:假设训练集的特征个数为d,每次仅选择k(k<d)个来构建决策树。
-
-
森林: 多个决策树分类器构成的分类器, 因为随机,所以可以生成多个决策树
-
处理具有高维特征的输入样本,而且不需要降维 (在进行训练集分类的时候就相当于已经进行了降维)
-
使用平均或者投票来提高预测精度和控制过拟合
2API
class 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 树的最大深度。
eg1
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
#数据导入
data = pd.read_csv('./src/titanic/titanic.csv')
# print(data["age"].mode()[0])
#数据预处理
data["age"].fillna(data["age"].mode()[0],inplace=True)
# print(data.tail())
y=data[["survived"]].to_numpy()
# print(y)
data.drop(["survived"],axis=1,inplace=True)
# print(data.tail())
x=data[["age","sex","pclass"]]
#数据转换
dict1=x.to_dict(orient='records')
# dict1
vec=DictVectorizer(sparse=False)
x=vec.fit_transform(dict1)
# print(x)
# print(y)
# 数据集划分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25,random_state=666)
# 标准化
scaler=StandardScaler()
x_train=scaler.fit_transform(x_train)
# 训练模型
model=RandomForestClassifier(n_estimators=100,max_depth=8,criterion='gini')
model.fit(x_train,y_train)
# 模型评估
x_test=scaler.transform(x_test)
rank=model.score(x_test,y_test)
print("综合得分:\n",rank)
十一 线性回归(重点)
标称型数据(Nominal Data)是统计学和数据分析中的一种数据类型,它用于分类或标记不同的类别或组别,数据点之间并没有数值意义上的距离或顺序。
特点:
-
无序性:标称数据的各个类别之间没有固有的顺序关系。例如,“性别”可以分为“男”和“女”,但“男”和“女”之间不存在大小、高低等顺序关系。
-
非数值性:标称数据不能进行数学运算,因为它们没有数值含义。
-
多样性:标称数据可以有很多不同的类别,具体取决于研究的主题或数据收集的目的。
-
比如西瓜的颜色,纹理,敲击声响这些数据就属于标称型数据,适用于西瓜分类
连续型数据(Continuous Data)表示在某个范围内可以取任意数值的测量,这些数据点之间有明确的数值关系和距离。
特点:
-
可测量性:连续型数据通常来源于物理测量,如长度、重量、温度、时间等,这些量是可以精确测量的。
-
无限可分性:连续型数据的取值范围理论上是无限可分的,可以无限精确地细分。
-
数值运算:连续型数据可以进行数学运算,如加、减、乘、除以及求平均值、中位数、标准差等统计量。
在数据分析中,连续型数据的处理和分析方式非常丰富,常见的有:
-
描述性统计:计算均值、中位数、众数、标准差、四分位数等,以了解数据的中心趋势和分布情况。
-
概率分布:通过拟合概率分布模型,如正态分布、指数分布、伽玛分布等,来理解数据的随机特性。
-
图形表示:使用直方图、密度图、箱线图、散点图等来可视化数据的分布和潜在的模式。
-
回归分析:建立连续型变量之间的数学关系,预测一个或多个自变量如何影响因变量。
-
比如西瓜的甜度,大小,价格这些数据就属于连续型数据,可以用于做回归
1回归
回归的目的是预测数值型的目标值y,求回归系数的过程就是回归,根据回归系数可以得到预测值。
2线性回归
线性回归是机器学习中一种有监督学习的算法,回归问题主要关注的是因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。
因变量(需要预测的值):目标变量,target/y
自变量(影响目标变量的因素):离散值/连续值
模型:因变量和自变量之间的关系
人工智能中的线性回归:数据集中很难找到一个完美的方程式完全满足所有的目标值,通过给出的数据集去拟合一条直线尽可能满足所要求的模型关系,从而得到对应的尽可能准确的目标值。
3损失函数
均方差:就是每个点到线的竖直方向的距离平方 求和 ,再平均, 这个数值最小时的直线就是最优直线
1.给出数据集,
和对应的真实值
在坐标轴上画出对应的点(离散或者连续),如果是离散的点,需要找一条直线使得这些点尽可能多地在这条直线上,或者能够尽可能均匀地分布在这条直线的两边,达到损失值最小的目标,使其尽可能地接近能够进行准确预测的目标函数(最优直线)
2.假设该目标函数为:
已知
将x带入目标函数得到预测值:
那么得到真实值和预算值的误差:
总误差(总损失值)为:
平方是因为真实值和预算值的误差有可能为负数,正数和负数直接相加会抵消。
然后求平均误差(总误差会受到样本点的个数的影响,样本点越多,该值就越大,对其平均化求得平均值,这样就能解决样本点个数不同带来的影响),由此得到损失函数:
要求使得损失值最小时候的w值,则:
先假设b=0方便计算:
求得w=0.795时损失函数取得最小值
那么在b=0时,最优解函数为:
4多参数回归
实际情况下,影响目标y的因素不止一个,此时x就从1个变成了n个,对应的w也变成了n个,那么所求的目标函数就从一元线性回归变成了多元线性回归函数
假设:
那么损失函数为:
需要求当
=?时
loss的最小值
5最小二乘法MSE
1.矩阵相关知识
:一个矩阵的转置的转置等于原矩阵。
:两个矩阵和的转置等于它们各自转置的和。
:一个矩阵乘以一个标量的转置等于该矩阵的转置乘以该标量。
:两个矩阵乘积的转置等于它们各自转置的乘积,但顺序相反。
2.最小二乘法
假设有8个不同属性的x得到一个真实的y值,要求其中对应的w的值,那么对应的目标函数为:
可以将数据对应的x和y转换为对应的矩阵X和y,所要求的w则转换为对应的矩阵W,我们要求的是w对应哪些数值时的误差/损失最小。
对应的损失函数为:
此时就得到最小二乘法公式
其中:
是欧几里得范数的平方\,也就是每个元素的平方相加
推导1:
推导2:链式求导
3.最小二乘法API
sklearn.linear_model.LinearRegression()
功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法
参数:
fit_intercept bool, default=True
是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。
属性:
coef_ 回归后的权重系数
intercept_ 偏置
print("权重系数为:\n", estimator.coef_) #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)
eg2
#最小二乘法
from sklearn.linear_model import LinearRegression
import numpy as np
model=LinearRegression(filter=True,)
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]#1:7==>123456
y=data[:,-1]
model.fit(x,y)
print("权重参数:\n",model.coef_)
print("截距:\n",model.intercept_)
#预测
y_pred=model.predict([[-4,10,6,4,-14,-2,-14,8,-144]])
print("推理结果:\n",y_pred)