机器学习期末作业记录
题目:用from sklearn.datasets import make_circles, 命令获得数据,然后用SVM,adaboost,逻辑回归,3个分类器计算他们的分类效果(自己决定训练数据和验证数据的数量),画ROC曲线。
原理参考:link
Adaboost
from sklearn.datasets import make_circles
from numpy import *
from sklearn.model_selection import train_test_split
def loadDataSet():
dataMat = []
group, labels = make_circles()
m = shape(group)[0]
for i in range(m):
dataMat.append([1.0, group[i, 0], group[i, 1]])
return dataMat, labels
def stump_classify(data_matrix, dimen, thresh_val, thresh_ineq): # just classify the data
# 通过阈值比较,一边分成-1,一边为1,可以通过数组对比
ret_array = ones((shape(data_matrix)[0], 1))
# 看看是哪一边取-1
if thresh_ineq == 'lt':
ret_array[data_matrix[:, dimen] <= thresh_val] = -1.0
else:
ret_array[data_matrix[:, dimen] > thresh_val] = -1.0
return ret_array
# 这是一个弱决策器
def build_stump(data_arr, class_labels, d):
# 遍历所有可能的值到stump_classify种,找到最佳的单层决策树
# 这里的最佳是通过权重向量d来定义
data_matrix = mat(data_arr)
label_mat = mat(class_labels).T # 让它站起来
m, n = shape(data_matrix)
num_steps = 10.0 # 在特征所有可能值上遍历,超出也无所谓
best_stump = {} # 这个字典存储给定权重d时所得到的最佳决策树相关信息
best_clas_est = mat(zeros((m, 1)))
min_error = inf # init error sum, to +infinity,一开始被初始为无穷大
for i in range(n): # loop over all dimensions一层在所有特征上遍历
range_min = data_matrix[:, i].min() # 固定列的最小值
range_max = data_matrix[:, i].max()
step_size = (range_max - range_min) / num_steps # 设定步长
# 二层遍历所有当前特征
for j in range(-1, int(num_steps) + 1): # loop over all range in current dimension
# 在大于小于特征间切换不等式
for inequal in ['lt', 'gt']: # go over less than and greater than
thresh_val = (range_min + float(j) * step_size) # 阈值慢慢挪动
# 调用前面定义的分类函数
predicted_vals = stump_classify(data_matrix, i, thresh_val,
inequal) # call stump classify with i, j, lessThan