一、随机森林
机器学习中有一种大类叫集成学习(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 树的最大深度
# 泰坦尼克号人员数据集 随机森林分类
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 pddata = 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)。
标称数据的特点:
-
无序性:标称数据的各个类别之间没有固有的顺序关系。例如,“性别”可以分为“男”和“女”,但“男”和“女”之间不存在大小、高低等顺序关系。
-
非数值性:标称数据不能进行数学运算,因为它们没有数值含义。你不能对“颜色”或“品牌”这样的标称数据进行加减乘除。
-
多样性:标称数据可以有很多不同的类别,具体取决于研究的主题或数据收集的目的。
-
比如西瓜的颜色,纹理,敲击声响这些数据就属于标称型数据,适用于西瓜分类。
连续型数据(Continuous Data)表示在某个范围内可以取任意数值的测量,这些数据点之间有明确的数值关系和距离。例如,温度、高度、重量等
连续型数据的特点包括:
-
可测量性:连续型数据通常来源于物理测量,如长度、重量、温度、时间等,这些量是可以精确测量的。
-
无限可分性:连续型数据的取值范围理论上是无限可分的,可以无限精确地细分。例如,你可以测量一个物体的长度为2.5米,也可以更精确地测量为2.53米,甚至2.5376米,等等。
-
数值运算:连续型数据可以进行数学运算,如加、减、乘、除以及求平均值、中位数、标准差等统计量。
回归,一般都是指线性回归(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_)
from sklearn.inear_model import LinearRegression
import numpy as npdata=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)