自主采样:即有放回的采样
在原数据集中经过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)))
通过集成的方式提高弱学习器的性能。