练习1:下面式子第四个等号为何成立?
答:第个三个式子拆开的第四个等号部分,省略下面这部分期望为0的内容。
其中
gnj
根据以上等式,得到练习第4个等式成立。
练习2
答:不对,如果样本足够全,大,可以代表总体样本,而模型的拟合性,泛化性也比较好,此时预测值就很接近真实值,那么可以偏差方差都很小。
偏差通常是由于我们对学习算法做了错误的假设所导致的,如真实模型是某个二次函数,但我们假设的模型是一次函数。由偏差带来的误差通常在训练误差上就能体现出来
方差通常是由于模型的复杂度相对于训练样本数过高导致的,出现过拟合。
由方差带来的误差通常体现在测试误差相对于训练误差的增量上
练习3
答:假设T为所有n个样本都至少被抽出一次的轮数,表示已经抽到了i-1个不重复样本后,抽到第i个不重复样本所用的轮数。则有,对于,抽到一个新样本的概率为:
因此的期望为:
由此可以得到:
因此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)