机器学习 | 对数几率回归

机器学习 | 对数几率回归

名词解释

回归:预测连续的值,例如预测气温
分类:预测离散的值,例如垃圾分类
线性回归:通过一个线性组合预测连续的值,是回归模型
对数几率回归:用Sigmoid函数将线性模型预测的值映射到1和0,实现二分类,是一个分类模型

对数几率回归

这里采用了十折交叉验证的方法,利用对数几率回归对鸢尾花数据集进行分类。由于鸢尾花数据集是一个三分类的数据集,若用对数几率回归,需要转化成三次二分类问题,这里仅展示分一次。
(1)读取数据并打乱

def read_file(filename):  # 读取鸢尾花数据
    random.seed(255)
    f = open(filename, "r")
    dataset = []
    for line in f.readlines():
        line = line.strip().split(",")
        dataset.append([float(line[1]), float(line[2]), float(line[3]), float(line[4]), trans(line[-1])])
    f.close()
    dataset = np.array(dataset)
    np.random.shuffle(dataset)
    return dataset

(2)处理数据集标签
这一步是关键,对于三种类别的鸢尾花,进行而二分类时需要对标签进行转换,将其中一类设为0,其他两类设为1,才能进行二分类。

def trans(s):  # 用字典将鸢尾花类别映射成数字
    dict = {"Iris-setosa": 0, "Iris-versicolor": 1, "Iris-virginica": 2}
    value = dict[s]
    return value
def data_label_split(dataset, catagory):  # 分离数据与标签,并将3类标签转换为2类,catagory表示分类目标是第几类别
    data = dataset[:, 0:-1]
    label = dataset[:, -1].reshape(150, 1)
    label = np.where(label == catagory, 1, 0)
    return data, label

(3)模型训练
训练时才有梯度下降求解

def logistic_model(z):
    return 1.0 / (1 + np.exp(-z))


def calculate(data, label, w):
    a = np.ones((data.shape[0], 1))
    data = np.c_[data, a]
    # 使用训练好的参数w进行计算
    y = logistic_model(np.dot(data, w))
    row, col = np.shape(y)
    # 记录预测正确的个数,用于计算正确率
    rightcount = 0
    for i in range(row):
        # 预测标签
        flag = -1
        # 大于0.5的为正例
        if y[i] > 0.5:
            flag = 1
        # 小于等于0.5的为反例
        else:
            flag = 0
        # 记录预测正确的个数
        if label[i] == flag:
            rightcount += 1
    # 正确率
    rightrate = rightcount / data.shape[0]
    return rightrate


def ten_fold_train(data, label, max_iter, index):
    print("trainning")
    label_test = copy.deepcopy(label[0+index*15: 15+index*15])  #
    label_train = copy.deepcopy(np.delete(label, [x for x in range(0+index*15,15+index*15)],axis=0))
    data_test = copy.deepcopy(data[0+index*15: 15+index*15])
    data_train = copy.deepcopy(np.delete(data, [x for x in range(0+index*15,15+index*15)],axis=0))
    w = np.ones((data_train.shape[1]+1, 1))  # 初始化w
    a = np.ones((data_train.shape[0], 1))
    data = np.c_[data_train, a]
    # 梯度下降法求w
    n = 0.001  # 步长
    iteration = 0
    # 每次迭代计算一次正确率
    acc = 0
    while iteration <= max_iter:
        # 计算当前参数w下的预测值
        pred = logistic_model(np.dot(data, w))
        # 梯度下降
        loss = pred - label_train.reshape(data_train.shape[0],1)
        grad = np.dot(np.transpose(data), loss)
        w = w - grad * n
        # 预测,更新正确率
        rightrate = calculate(data_train, label_train, w)
        print("iter:{} train_accuracy:{}".format(iteration,rightrate))
        rightrate2 = calculate(data_test, label_test, w)
        print("        test_accuracy:{}".format(rightrate2))
        acc = rightrate2
        iteration += 1
    return acc

完整代码:https://github.com/robin-hlt/Machine-Learning-Logistic-Regression

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值