树模型与集成学习-Task03-集成模式

 练习1:下面式子第四个等号为何成立?

答:第个三个式子拆开的第四个等号部分,省略下面这部分期望为0的内容。

2E_{D}[(f-E_{D}[\widehat{f}_{D}])(E_{D}[\widehat{f}]-\widehat{f}_{D})]+2E_{D}[\varepsilon (f-E_{D}[\widehat{f}_{D}]) ] +2E_{D}[\varepsilon (E_{D}[\widehat{f}]-\widehat{f}_{D}) ]

 其中

E_{D}[(f-E_{D}[\widehat{f}_{D}])(E_{D}[\widehat{f}]-\widehat{f}_{D})]= E_{D}[(fE_{D}[\widehat{f}]-f\widehat{f}_{D}-(E_{D}[\widehat{f}])^{2})+E_{D}[\widehat{f}_{D}]*\widehat{f}_{D}]=E_{D}[f\widehat{f}_{D}-f\widehat{f}_{D}-\widehat{f}_{D}^{2}+\widehat{f}_{D}^{2}]=0E_{D}[\varepsilon (f-E_{D}[\widehat{f}_{D}]) ] +E_{D}[\varepsilon (E_{D}[\widehat{f}]-\widehat{f}_{D}) ] =\varepsilon \left ( E_{D}[f]-E_{D}[\widehat{f}]+E_{D}[\widehat{f}]- E_{D}[\widehat{f}] \right ) =\varepsilon (\widehat{f}_{D}-\widehat{f}_{D}+\widehat{f}_{D}-\widehat{f}_{D})=0gnj

 根据以上等式,得到练习第4个等式成立。

练习2

 答:不对,如果样本足够全,大,可以代表总体样本,而模型的拟合性,泛化性也比较好,此时预测值就很接近真实值,那么可以偏差方差都很小。

偏差通常是由于我们对学习算法做了错误的假设所导致的,如真实模型是某个二次函数,但我们假设的模型是一次函数。由偏差带来的误差通常在训练误差上就能体现出来

方差通常是由于模型的复杂度相对于训练样本数过高导致的,出现过拟合。
由方差带来的误差通常体现在测试误差相对于训练误差增量上

练习3

答:假设T为所有n个样本都至少被抽出一次的轮数,t_{i}表示已经抽到了i-1个不重复样本后,抽到第i个不重复样本所用的轮数。则有T=t_{1}+t_{2}+...+t_{n},对于t_{i},抽到一个新样本的概率为:

                                p_{i}=[n-(i-1)]/n =(n-i+1) /n

因此的期望为:   E(t_{i}) = \frac{1}{p_{i}}                            

由此可以得到:E(T) = E(t_{1}) + E(t_{2}) +...+E(t_{n}) =\frac{1}{p_{1}} + \frac{1}{p_{2}} +...+\frac{1}{p_{n}} = \frac{n}{n} + \frac{n}{n-1}+...+\frac{n}{1} =n(1+\frac{1}{2}+...+\frac{1}{n})=n*H(n)                  

因此100个样本全部抽出期望次数为100*H(100)。
 

练习4

 

 答:stacking :训练m*k+1次,预测2m*k+1次。

         blending:训练m+1次,预测2m+1次。

知识回顾

答:将预测数据产生的平均损失分解为三项。第一项为数据真实值与模型平均预测值的偏差,第二项为模型预测值的方差,第三项为数据中的原始噪声。

答:bagging利用多个低偏差的学习器进行集成来降低模型的方差。

       boosting利用多个低方差学习器进行集成来降低模型的偏差。

 答:1)Stacking将训练集数据运用m个基模型,每个基模型进行k折交叉验证训练,将每个基模型验证的结果记录为新的数据列,最后生成一个与原训练集有一样行数,m列的数据集,作为新训练集;

2)然后将测试集数据放到每个基每折训练进行测试,每个基模型结果取k折结果平均,记录为新数据列,最后生成一个与原测试集有一样行数,m列的数据集,作为新的测试数据集;

3)再运用一个新模型将前面记录的新训练数据还有原训练集一一对应Y值进行训练,前面记录的新验证数据进行测试。

blending相当于每个基进行1折验证,其他流程一样。

Stacking代码实现

from sklearn.model_selection import KFold
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
 
import numpy as np
import pandas as pd
 
m1=KNeighborsRegressor()
m2=DecisionTreeRegressor()
m3=LinearRegression()
 
models=[m1,m2,m3]
 
 
final_model=DecisionTreeRegressor()
 
k,m=4,len(models)
 
if  __name__=="__main__":
    X,y=make_regression(
        n_samples=1000,n_features=8,n_informative=4,random_state=0
    )
    final_X,final_y=make_regression(
        n_samples=500,n_features=8,n_informative=4,random_state=0
    )
    
    final_train=pd.DataFrame(np.zeros((X.shape[0],m)))
    final_test=pd.DataFrame(np.zeros((final_X.shape[0],m)))
    
    kf=KFold(n_splits=k)
    for model_id in range(m):
        model=models[model_id]
        for train_index,test_index in kf.split(X):
            X_train,X_test=X[train_index],X[test_index]
            y_train,y_test=y[train_index],y[test_index]
            model.fit(X_train,y_train)
            final_train.iloc[test_index,model_id]=model.predict(X_test)
            final_test.iloc[:,model_id]+=model.predict(final_X)
        final_test.iloc[:,model_id]/=k

    final_model.fit(final_train,y)
    res=final_model.predict(final_test)
 

 blending代码实现

from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
 
import numpy as np
import pandas as pd
 
m1=KNeighborsRegressor()
m2=DecisionTreeRegressor()
m3=LinearRegression()
 
models=[m1,m2,m3]
 
final_model=DecisionTreeRegressor()
 
m=len(models)
 
if  __name__=="__main__":
    X,y=make_regression(
        n_samples=1000,n_features=8,n_informative=4,random_state=0
    )
    final_X,final_y=make_regression(
        n_samples=500,n_features=8,n_informative=4,random_state=0
    )
    
 
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.5)
    
    final_train=pd.DataFrame(np.zeros((X_test.shape[0],m)))
    final_test=pd.DataFrame(np.zeros((final_X.shape[0],m)))
    
    for model_id in range(m):
        model=models[model_id]
        model.fit(X_train,y_train)
        final_train.iloc[:,model_id]=model.predict(X_test)
        final_test.iloc[:,model_id]+=model.predict(final_X)
        
    final_model.fit(final_train,y_train)
    res=final_model.predict(final_test)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值