查询样本,把数据集分80%训练集20%测试集,训练集80%有标记20%无标记,通过查询策略在无标记中选取样本放入有标记集中更新训练model
def __init__instance_selection(self):
"""
初始化一些参数
"""
"""===================================="""
# 初始化中间变量,这里为了简便,很多参数直接给定了
"""===================================="""
# 初始化工具箱
self._tool = ap.ToolBox(X=self._X, y=self._Y, query_type='AllLabels', saving_path='.')
# 初始化划分
self._tool.split_AL(test_ratio=0.2, initial_label_rate=0.2, split_count=2)
# 初始化模型,default model is 线性
#self._model = self._tool.get_default_model()
#self._model = GaussianNB()
#self._model = svm.SVC()
self._model = MLPClassifier(solver='lbfgs', alpha=1e-5,hidden_layer_sizes = (5, 2), random_state = 1)
# 初始化停止标准
self._criterion_stop = self._tool.get_stopping_criterion("num_of_queries", 8)
# 初始化性能度量
self._metric = "accuracy_score"
self._performance = lambda Y, Y_pre: \
self._tool.calc_performance_metric(Y, Y_pre, performance_metric=self._metric)
# 初始化批次大小
self._batch_size = 1
# 初始化主循环次数
self._loops = 5
def __loop(self, strategy_query, loop, *data):
"""
每一轮的实验
"""
# 获取划分结果
idx_tr, idx_te, idx_lab, idx_unlab = data
# 获取中间结果保存器
saver = self._tool.get_stateio(loop)
# 模型的首次训练,用的已有标记的训练集
self._model.fit(X=self._X[idx_lab, :], y=self._Y[idx_lab.index])
# 对测试集进行预测
pred_te = self._model.predict(self._X[idx_te, :])
# 获取准确率
pred_acc = self._performance(self._Y[idx_te], pred_te)
# 保存首次结果
saver.set_initial_point(pred_acc)
# 开始查询,当然停止标准自己给定也行,例如循环多少次之类的
while not self._criterion_stop.is_stop():
# 在无标签集中查询实例
idx_query = strategy_query.select(label_index=idx_lab, unlabel_index=idx_unlab, batch_size=1)
# 更新已有标签集合
idx_lab.update(idx_query)
# 删去无标签集中的已查询实例
idx_unlab.difference_update(idx_query)
# 使用更新后的有标签集训练模型
self._model.fit(X=self._X[idx_lab, :], y=self._Y[idx_lab])
pred_te = self._model.predict(self._X[idx_te, :])
pred_acc = self._performance(self._Y[idx_te], pred_te)
# 保存中间结果
st = self._tool.State(select_index=idx_query, performance=pred_acc)
saver.add_state(st)
# 更新停止标准
self._criterion_stop.update_information(saver)
# 重设存储器
self._criterion_stop.reset()
return saver
最开始的实验.png
self._model = GaussianNB()
GaussianNB.png
self._model = svm.SVC()
1638416002(1).png
多层感知机
1638416869(1).png
1638428735(1).png