自助法是一种很好用的再抽样的方法,再数据量较小时可以起到很好的效果。假设你有n个数据作为样本,当使用自助法时,你需要从原有的数据中抽取k组,每组n个数据构成,构成新的样本,n组数据中每组数据都是重复抽样。再利用新获得的k组数据分别拟合模型,计算每组数据拟合出的模型的估计误差。具体的公式可以参考人大出版的大数据挖掘与统计机器学习,这里不赘述。
因为在自助法抽样中,原始的训练集中的某个样本点可能多次出现也可能一次都不出现,当样本足够大时每个样本点出现在第i组的概率约为0.632.
接下来给出具体代码:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import random
#产生随机数(重复抽样)
def dataint(down,up,k):
data=[]
for i in range(k):
temp = random.randint(down, up)
data.append(temp)
return data
collect=np.zeros((100,97))
for i in range(100):
collect[i,:]=dataint(0,97,97)
dt=pd.read_csv('C:/Users/Admin/Desktop/big data/prostate.csv',header = 0)
dt1=dt.loc[:,['lcavol','lweight','svi']]
linreg = LinearRegression()
#定义函数计算err,cv
def L (data,testloc):
model=linreg.fit(data.loc[:,['lcavol','lweight','svi']], data.loc[:,'lpsa'])
cv=sum((model.predict(data.loc[:,['lcavol','lweight','svi']])-np.asarray(data.loc[:,'lpsa']))**2)
pred=model.predict(testloc.loc[:,['lcavol','lweight','svi']])
err=np.mean((testloc.loc[:,'lpsa']-pred)**2)
return cv,err
MLC=[]
errs=[]
for i in range(100):
LC=0
notuse=[]
for j in range(97):
if j not in collect[i,:]:
notuse.append(j)
LC=L(data=dt,testloc=dt.loc[(notuse),['lcavol','lweight','svi','lpsa']])[0]
MLC.append(LC/len(notuse))
errs.append(L(data=dt,testloc=dt.loc[(notuse),['lcavol','lweight','svi','lpsa']])[1])
err=sum(MLC)/97
ERR1=np.mean(errs)
print(0.368*err+0.632*ERR1)