自主采样:即有放回的采样

在原数据集中经过m次有放回的随机采样,可以得到一个含m个样例的子数据集,使用这个子数据集进行训练,得到一个基学习器

我们对上述过程重复T次,就会得到T个基学习器,我们对这T个学习器的预测结果进行结合,就能够得到一个准确率更高的预测结果。一般使用简单投票的方法进行结合,即选择T个预测结果中预测最多的类,例如10次预测,其中7个预测为正类,3个预测为反类,我们就认为最终预测为正类。

我们以logistic线性回归模型为例,实现一下:

读取文件:

def load(filename):
	fp = open(filename)
	dataset = []
	labelset = []
	for i in fp.readlines():
		a = i.strip().split()
 
		#存储属性数据
		dataset.append([float(j) for j in a[:len(a)-1]])
 
		#存储标签数据
		labelset.append(int(float(a[-1])))
	return dataset, labelset

logistic线性模型(训练和测试过程):

def sigmoid(z):
	return 1.0 / (1 + np.exp(-z))
 
def train(dataset, labelset):
	#将列表转化为矩阵
	data = np.mat(dataset)
	label = np.mat(labelset).transpose()
 
	#初始化参数w
	w = np.ones((len(dataset[0])+1, 1))
 
	#属性矩阵最后添加一列全1列(参数w中有常数参数)
	a = np.ones((len(dataset), 1))
	data = np.c_[data, a]
 
	#步长
	n = 0.001
	for i in range(10000):
		#计算当前参数w下的预测值
		c = sigmoid(np.dot(data, w))
 
		#梯度下降的计算过程,对照着梯度下降的公式
		b = c - label
		change = np.dot(np.transpose(data), b)
		w = w - change * n
	return w
 
def test(dataset, labelset, w):
	label = []
	data = np.mat(dataset)
	a = np.ones((len(dataset), 1))
	data = np.c_[data, a]
 
	#使用训练好的参数w进行计算
	y = sigmoid(np.dot(data, w))
	b, c = np.shape(y)
 
	for i in range(b):
 
		#预测标签
		flag = -1
 
		#大于0.5的为正例
		if y[i, 0] > 0.5:
			flag = 1
 
		#小于等于0.5的为反例
		else:
			flag = 0
		label.append(flag)
	return label

随机选取m个样例形成子集:

def random_sampling(dataset, labelset, m):
	data = []
	label = []
	for i in range(m):
		a = random.randint(0, len(dataset) - 1)
		data.append(dataset[a])
		label.append(labelset[a])
	return data, label

 20个基学习器的训练过程:

W = []
for i in range(20):
	data, label = random_sampling(dataset, labelset, 150)
	w = train(data, label)
	W.append(w)

集成学习的测试过程:

def jicheng_test(w, test_dataset, test_labelset):
	flags = []
	for i in w:
		flag = test(test_dataset, test_labelset, i)
		flags.append(flag)
	flags = np.array(flags)
	a, b = np.shape(flags)
	rightcount = 0
	for i in range(b):
		n0 = list(flags[:,i].T).count(0)
		n1 = list(flags[:,i].T).count(1)
		if n0 > n1:
			flag_new = 0
		else:
			flag_new = 1
		if flag_new == test_labelset[i]:
			rightcount += 1
		print('预测为%d,真实为%d'%(flag_new, test_labelset[i]))
	print("正确率%f"%(rightcount / len(test_dataset)))

 通过集成的方式提高弱学习器的性能。