人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计_第1页
人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计_第2页
人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计_第3页
人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计_第4页
人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能和机器学习之回归算法:梯度提升回归(GBR):数学基础:概率论与数理统计1概率论基础1.1随机变量与概率分布1.1.1随机变量随机变量是概率论中的基本概念,它将随机实验的结果映射到实数集上。随机变量可以分为离散型和连续型。离散型随机变量:取值为有限或可数无限个数的随机变量。例如,投掷一枚骰子,结果是一个离散型随机变量,可能的取值为1,2,3,4,5,6。连续型随机变量:取值为一个区间内的任意实数的随机变量。例如,测量一个物体的重量,结果是一个连续型随机变量。1.1.2概率分布概率分布描述了随机变量取值的概率。对于离散型随机变量,我们使用概率质量函数(PMF)来描述;对于连续型随机变量,我们使用概率密度函数(PDF)来描述。概率质量函数(PMF)对于离散型随机变量X,其概率质量函数PX=x表示X概率密度函数(PDF)对于连续型随机变量X,其概率密度函数fx表示X在x附近的概率密度,即X在x1.1.3示例:投掷一枚骰子importnumpyasnp

importmatplotlib.pyplotasplt

#定义离散型随机变量的取值和概率

values=np.arange(1,7)

probabilities=np.ones(6)/6

#绘制概率质量函数

plt.bar(values,probabilities)

plt.xlabel('骰子的点数')

plt.ylabel('概率')

plt.title('投掷一枚骰子的概率质量函数')

plt.show()1.2条件概率与贝叶斯定理1.2.1条件概率条件概率PA|B表示在事件B1.2.2贝叶斯定理贝叶斯定理是条件概率的一种应用,用于计算后验概率。贝叶斯定理公式为:P其中,PA|B是后验概率,PB|1.2.3示例:贝叶斯定理的应用假设一个疾病在人群中的患病率为1%,即PD=0.01。有一种检测方法,其准确率为99%,即如果患病,检测结果为阳性的概率PT+#定义先验概率、似然概率和边缘概率

P_D=0.01#患病率

P_T_plus_given_D=0.99#患病且检测为阳性的概率

P_T_minus_given_not_D=0.99#未患病且检测为阴性的概率

#计算边缘概率P(T_+)

P_T_plus=P_D*P_T_plus_given_D+(1-P_D)*(1-P_T_minus_given_not_D)

#应用贝叶斯定理计算后验概率P(D|T_+)

P_D_given_T_plus=(P_T_plus_given_D*P_D)/P_T_plus

print(f'患病的概率为:{P_D_given_T_plus:.4f}')1.3期望与方差1.3.1期望期望是随机变量的平均值,对于离散型随机变量X,其期望EXE对于连续型随机变量X,其期望定义为:E1.3.2方差方差是随机变量与其期望值的偏差的平方的期望,用于衡量随机变量的波动程度。对于随机变量X,其方差VaV1.3.3示例:计算随机变量的期望和方差假设随机变量X的取值为1,2,3,其概率分别为0.2,0.3,0.5。importnumpyasnp

#定义随机变量的取值和概率

values=np.array([1,2,3])

probabilities=np.array([0.2,0.3,0.5])

#计算期望

E_X=np.sum(values*probabilities)

print(f'期望值为:{E_X:.2f}')

#计算方差

Var_X=np.sum((values-E_X)**2*probabilities)

print(f'方差为:{Var_X:.2f}')以上内容详细介绍了概率论的基础概念,包括随机变量、概率分布、条件概率、贝叶斯定理以及期望与方差的计算。通过具体的代码示例,我们展示了如何在Python中实现这些概念的计算,帮助读者更好地理解和应用概率论的基础知识。2数理统计基础2.1参数估计:矩估计与最大似然估计2.1.1矩估计矩估计是一种参数估计方法,它基于样本的矩(如均值、方差等)来估计总体参数。假设我们有一个随机变量X,其概率密度函数为fx;θ,其中θ是未知参数。如果X的前k个矩存在,即EXi=μ例如,假设X服从正态分布Nμ,σ2,我们可以通过样本均值x来估计μ,通过样本方差示例代码假设我们有一组正态分布的样本数据,我们将使用矩估计来估计其均值和方差。importnumpyasnp

#生成正态分布的样本数据

np.random.seed(0)

data=np.random.normal(loc=5,scale=2,size=100)

#矩估计

mu_hat=np.mean(data)#估计均值

sigma_hat=np.var(data)#估计方差

print(f"估计的均值:{mu_hat}")

print(f"估计的方差:{sigma_hat}")2.1.2最大似然估计最大似然估计(MLE)是另一种参数估计方法,它基于使观察到的数据最有可能出现的参数值来估计参数。假设我们有一组独立同分布的样本数据x1,x2,..示例代码继续使用正态分布的样本数据,我们将使用最大似然估计来估计其均值和方差。importnumpyasnp

fromscipy.statsimportnorm

#生成正态分布的样本数据

np.random.seed(0)

data=np.random.normal(loc=5,scale=2,size=100)

#定义似然函数

deflikelihood(theta,data):

mu,sigma=theta

returnd(norm.pdf(data,mu,sigma))

#定义对数似然函数

deflog_likelihood(theta,data):

mu,sigma=theta

returnnp.sum(np.log(norm.pdf(data,mu,sigma)))

#使用scipy的optimize模块来求解最大似然估计

fromscipy.optimizeimportminimize

#初始估计值

initial_guess=(0,1)

#求解最大似然估计

result=minimize(lambdatheta:-log_likelihood(theta,data),initial_guess)

mu_hat_mle,sigma_hat_mle=result.x

print(f"最大似然估计的均值:{mu_hat_mle}")

print(f"最大似然估计的方差:{sigma_hat_mle}")2.2假设检验:t检验与F检验2.2.1t检验t检验用于检验一个样本的均值是否与已知的总体均值有显著差异,或者两个样本的均值是否有显著差异。t检验分为单样本t检验、独立样本t检验和配对样本t检验。示例代码假设我们有一组样本数据,我们将使用单样本t检验来检验其均值是否与已知的总体均值有显著差异。importnumpyasnp

fromscipy.statsimportttest_1samp

#生成样本数据

np.random.seed(0)

data=np.random.normal(loc=5,scale=2,size=100)

#已知的总体均值

mu_known=4

#单样本t检验

t_stat,p_value=ttest_1samp(data,mu_known)

print(f"t统计量:{t_stat}")

print(f"p值:{p_value}")2.2.2F检验F检验用于检验两个样本的方差是否有显著差异,或者在多元线性回归中检验模型的显著性。在多元线性回归中,F检验用于检验所有回归系数是否同时为零。示例代码假设我们有两个样本数据,我们将使用F检验来检验其方差是否有显著差异。importnumpyasnp

fromscipy.statsimportf_oneway

#生成两个样本数据

np.random.seed(0)

data1=np.random.normal(loc=5,scale=2,size=100)

data2=np.random.normal(loc=5,scale=3,size=100)

#F检验

f_stat,p_value=f_oneway(data1,data2)

print(f"F统计量:{f_stat}")

print(f"p值:{p_value}")2.3置信区间与预测区间2.3.1置信区间置信区间是参数估计的一种方法,它给出的是参数的可能范围,而不是一个具体的值。置信区间的计算基于样本数据和参数估计的抽样分布。例如,对于正态分布的样本均值,我们可以使用t分布来计算置信区间。示例代码假设我们有一组正态分布的样本数据,我们将计算其均值的95%置信区间。importnumpyasnp

fromscipy.statsimportt

#生成正态分布的样本数据

np.random.seed(0)

data=np.random.normal(loc=5,scale=2,size=100)

#样本均值

mu_hat=np.mean(data)

#样本标准差

sigma_hat=np.std(data,ddof=1)

#样本量

n=len(data)

#t分布的分位数

t_critical=t.ppf(0.975,df=n-1)

#置信区间的计算

lower_bound=mu_hat-t_critical*sigma_hat/np.sqrt(n)

upper_bound=mu_hat+t_critical*sigma_hat/np.sqrt(n)

print(f"95%置信区间的下限:{lower_bound}")

print(f"95%置信区间的上限:{upper_bound}")2.3.2预测区间预测区间用于预测新观察值的可能范围,而不是参数的可能范围。预测区间的计算基于模型的预测值和预测误差的抽样分布。例如,在线性回归中,我们可以使用t分布和残差的标准差来计算预测区间。示例代码假设我们有一个线性回归模型,我们将计算其预测值的95%预测区间。importnumpyasnp

importstatsmodels.apiassm

#生成线性回归的样本数据

np.random.seed(0)

x=np.random.uniform(low=0,high=10,size=100)

y=2*x+5+np.random.normal(loc=0,scale=2,size=100)

#构建线性回归模型

X=sm.add_constant(x)

model=sm.OLS(y,X)

results=model.fit()

#预测新观察值

x_new=np.array([11])

X_new=sm.add_constant(x_new)

y_pred=results.predict(X_new)

#预测误差的标准差

sigma_hat=np.sqrt(results.mse_resid)

#t分布的分位数

t_critical=t.ppf(0.975,df=len(x)-2)

#预测区间的计算

lower_bound=y_pred-t_critical*sigma_hat

upper_bound=y_pred+t_critical*sigma_hat

print(f"95%预测区间的下限:{lower_bound}")

print(f"95%预测区间的上限:{upper_bound}")以上代码和数据样例展示了数理统计基础中的矩估计、最大似然估计、t检验、F检验、置信区间和预测区间的具体应用。3机器学习概览3.1监督学习与非监督学习在机器学习领域,监督学习和非监督学习是两种基本的学习方式,它们在数据处理和模型训练上有着本质的区别。3.1.1监督学习监督学习是基于有标签数据集的学习方法。在训练过程中,算法不仅接收输入数据,还接收与输入数据相对应的正确输出(标签)。通过学习输入与输出之间的映射关系,模型可以预测新的、未见过的数据的输出。常见的监督学习任务包括回归和分类。示例:线性回归假设我们有一组房价数据,其中包含房屋的大小(平方米)和对应的价格(万元)。我们的目标是建立一个模型,根据房屋的大小预测其价格。importnumpyasnp

fromsklearn.linear_modelimportLinearRegression

fromsklearn.model_selectionimporttrain_test_split

#生成模拟数据

np.random.seed(0)

sizes=np.random.rand(100)*1000#房屋大小

prices=sizes*0.5+np.random.randn(100)*50+200#价格,假设每平方米5000元,加上一些随机噪声

#将数据分为训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(sizes.reshape(-1,1),prices,test_size=0.2,random_state=42)

#创建线性回归模型

model=LinearRegression()

#训练模型

model.fit(X_train,y_train)

#预测

predictions=model.predict(X_test)

#输出模型系数

print("模型系数:",model.coef_)3.1.2非监督学习非监督学习则是在没有标签的数据集上进行学习。算法试图从数据中发现内在的结构或模式,而不需要知道数据的正确输出。常见的非监督学习任务包括聚类和降维。示例:K-means聚类假设我们有一组客户数据,包括客户的年龄和收入,我们想要将客户分为不同的群体,以便进行市场细分。importnumpyasnp

fromsklearn.clusterimportKMeans

importmatplotlib.pyplotasplt

#生成模拟数据

np.random.seed(0)

ages=np.random.randint(20,60,size=100)

incomes=np.random.randint(30000,100000,size=100)

#将年龄和收入组合成二维数据

data=np.column_stack((ages,incomes))

#创建K-means模型

kmeans=KMeans(n_clusters=3)

#训练模型

kmeans.fit(data)

#预测数据点的聚类

labels=kmeans.predict(data)

#可视化聚类结果

plt.scatter(data[:,0],data[:,1],c=labels)

plt.xlabel('年龄')

plt.ylabel('收入')

plt.show()3.2回归问题与分类问题机器学习中的问题可以大致分为两大类:回归问题和分类问题。3.2.1回归问题回归问题的目标是预测一个连续值。例如,预测房价、股票价格或温度等。3.2.2分类问题分类问题的目标是预测一个离散的类别。例如,判断一封邮件是否为垃圾邮件,或者识别一张图片中的物体是猫还是狗。3.3损失函数与优化目标在机器学习中,损失函数(或代价函数)用于衡量模型预测的输出与实际输出之间的差异。优化目标是通过调整模型参数来最小化损失函数。3.3.1常见损失函数均方误差(MSE):回归问题中常用的损失函数,计算预测值与真实值之间的平方差的平均值。交叉熵损失:分类问题中常用的损失函数,衡量预测概率分布与真实概率分布之间的差异。示例:均方误差(MSE)假设我们有一个简单的线性回归模型,我们想要计算模型预测的房价与实际房价之间的MSE。fromsklearn.metricsimportmean_squared_error

#假设predictions是模型预测的房价,y_test是实际的房价

mse=mean_squared_error(y_test,predictions)

print("均方误差:",mse)通过上述示例和解释,我们深入了解了机器学习中的监督学习、非监督学习、回归与分类问题,以及损失函数的概念。这些基础知识对于理解和应用更复杂的机器学习算法,如梯度提升回归(GBR),至关重要。4梯度提升回归(GBR)原理4.1GBR的数学模型梯度提升回归(GradientBoostingRegression,GBR)是一种迭代的机器学习技术,用于预测连续值。它基于决策树构建,通过逐步减小预测误差来优化模型。GBR的核心思想是将多个弱学习器组合成一个强学习器,每个弱学习器专注于纠正前一个学习器的错误。4.1.1模型迭代过程GBR模型的迭代过程可以表示为:F其中,F0x是初始预测,γ是常数,L是损失函数,yi对于m次迭代,模型更新为:F其中,hmx是第m次迭代中添加的弱学习器(决策树),4.1.2损失函数损失函数L用于衡量模型预测值与实际值之间的差距。常见的损失函数包括平方损失、绝对损失和Huber损失。GBR通过最小化损失函数来优化模型。4.2梯度提升树的构建梯度提升树(GradientBoostingTree,GBT)是GBR中使用的弱学习器。构建GBT的过程涉及以下步骤:初始化预测值:使用初始模型F0计算残差:对于每个样本,计算损失函数关于当前预测值的负梯度,即残差。拟合弱学习器:使用残差作为目标,拟合一个决策树。更新预测值:将新决策树的预测值乘以学习率λ,然后加到当前预测值上,形成新的预测值。重复迭代:重复步骤2至4,直到达到预定的迭代次数或模型收敛。4.2.1示例代码importnumpyasnp

fromsklearn.datasetsimportmake_regression

fromsklearn.ensembleimportGradientBoostingRegressor

#生成回归数据集

X,y=make_regression(n_samples=1000,n_features=10,n_informative=5,random_state=42)

#创建GBR模型

gbr=GradientBoostingRegressor(n_estimators=100,learning_rate=0.1,max_depth=3,random_state=42)

#训练模型

gbr.fit(X,y)

#预测

y_pred=gbr.predict(X)

#计算模型的均方误差

mse=np.mean((y-y_pred)**2)

print(f"MeanSquaredError:{mse}")4.3损失函数的梯度计算在GBR中,损失函数的梯度计算是关键步骤。梯度是损失函数关于预测值的偏导数,用于指导模型的更新方向。对于平方损失函数,梯度计算如下:∂对于绝对损失函数,梯度计算为:∂4.3.1示例代码defgradient_square_loss(y_true,y_pred):

return-2*(y_true-y_pred)

defgradient_absolute_loss(y_true,y_pred):

return-np.sign(y_true-y_pred)

#假设y_true和y_pred是numpy数组

y_true=np.array([1,2,3,4,5])

y_pred=np.array([1.5,2.5,2.5,4.5,5.5])

#计算梯度

grad_square=gradient_square_loss(y_true,y_pred)

grad_abs=gradient_absolute_loss(y_true,y_pred)

print(f"GradientofSquareLoss:{grad_square}")

print(f"GradientofAbsoluteLoss:{grad_abs}")通过以上步骤,GBR能够构建一个强大的回归模型,有效处理复杂的数据关系,提高预测精度。5GBR的数学推导5.1前向分步算法前向分步算法是梯度提升回归(GBR)的核心组成部分,它通过迭代地添加弱学习器来逐步改进模型的预测能力。在GBR中,弱学习器通常是决策树,但也可以是其他模型。算法从一个简单的初始模型开始,然后在每一步中,通过最小化损失函数来训练一个新的弱学习器,以修正当前模型的预测错误。5.1.1算法步骤初始化模型F0对于m=1到计算当前模型的负梯度,作为新的残差。使用负梯度作为目标,训练一个决策树hm计算步长γm更新模型Fm输出最终模型FM5.1.2代码示例importnumpyasnp

fromsklearn.datasetsimportmake_regression

fromsklearn.treeimportDecisionTreeRegressor

fromsklearn.ensembleimportGradientBoostingRegressor

#生成回归数据

X,y=make_regression(n_samples=100,n_features=1,noise=0.1)

#初始化模型

F=np.mean(y)

#梯度提升回归参数

M=100#迭代次数

learning_rate=0.1#步长

#手动实现GBR

forminrange(M):

#计算负梯度

residuals=y-F

#训练决策树

tree=DecisionTreeRegressor(max_depth=1)

tree.fit(X,residuals)

#更新模型

F+=learning_rate*tree.predict(X)

#使用sklearn的GBR进行比较

gbr=GradientBoostingRegressor(n_estimators=M,learning_rate=learning_rate)

gbr.fit(X,y)

predictions=gbr.predict(X)

#打印手动实现和sklearn实现的最终预测值

print("手动实现GBR的最终预测值:",F)

print("sklearn实现GBR的最终预测值:",predictions)5.2梯度提升的损失函数优化GBR通过优化损失函数来训练模型,损失函数衡量了模型预测值与实际值之间的差距。常见的损失函数包括平方损失(用于回归问题)和对数损失(用于分类问题)。在每一步中,GBR通过计算当前模型预测值的负梯度来确定新的弱学习器应该修正的方向。5.2.1平方损失函数平方损失函数定义为Ly,Fx5.2.2代码示例#平方损失函数的负梯度计算

defneg_gradient_square_loss(y,F):

returny-F

#使用平方损失函数的负梯度

residuals=neg_gradient_square_loss(y,F)5.3基学习器的选择在GBR中,基学习器的选择对模型的性能至关重要。决策树是常用的基学习器,因为它们能够捕捉到数据中的复杂模式,同时避免过拟合。通过限制决策树的深度和叶子节点数量,可以控制模型的复杂度,从而平衡拟合能力和泛化能力。5.3.1代码示例#选择基学习器:决策树

tree=DecisionTreeRegressor(max_depth=3,max_leaf_nodes=10)

#训练基学习器

tree.fit(X,residuals)

#预测

predictions=tree.predict(X)5.3.2参数调整max_depth:决策树的最大深度,控制模型复杂度。max_leaf_nodes:决策树的最大叶子节点数,进一步控制模型复杂度。通过调整这些参数,可以优化GBR模型的性能,避免过拟合或欠拟合。以上示例代码展示了GBR的前向分步算法、损失函数优化以及基学习器的选择和训练过程。通过手动实现和使用sklearn库的比较,可以更深入地理解GBR的工作原理和实现细节。6GBR的实践应用6.1数据预处理与特征选择在应用梯度提升回归(GBR)模型之前,数据预处理和特征选择是至关重要的步骤。这包括处理缺失值、异常值、数据标准化或归一化,以及选择对模型预测能力有贡献的特征。6.1.1处理缺失值importpandasaspd

fromsklearn.imputeimportSimpleImputer

#假设df是包含缺失值的DataFrame

df=pd.DataFrame({

'A':[1,2,np.nan,4],

'B':[5,np.nan,np.nan,8],

'C':[9,10,11,12]

})

#使用均值填充缺失值

imputer=SimpleImputer(strategy='mean')

df_imputed=pd.DataFrame(imputer.fit_transform(df),columns=df.columns)6.1.2数据标准化fromsklearn.preprocessingimportStandardScaler

#假设X是特征矩阵

scaler=StandardScaler()

X_scaled=scaler.fit_transform(X)6.1.3特征选择fromsklearn.feature_selectionimportSelectKBest,f_regression

#假设X是特征矩阵,y是目标变量

selector=SelectKBest(score_func=f_regression,k=2)

X_new=selector.fit_transform(X,y)6.2模型训练与参数调优GBR模型的训练涉及多个决策树的迭代构建,每个决策树都试图纠正前一个树的错误。参数调优是通过调整模型参数来优化模型性能的过程。6.2.1模型训练fromsklearn.ensembleimportGradientBoostingRegressor

fromsklearn.model_selectionimporttrain_test_split

#假设X是特征矩阵,y是目标变量

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#创建GBR模型

gbr=GradientBoostingRegressor(n_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论