zoukankan      html  css  js  c++  java
  • 机器学习(九) 逻辑回归 (上)

    一、什么是逻辑回归

    逻辑回归  Logistic Regression

    逻辑回归:解决分类问题

    回归问题怎么解决分类问题?

    将样本的特征和样本发生的概率联系起来,概率是一个数。

     

    二、逻辑回归的损失函数

    三、 逻辑回归损失函数的梯度

     

     

    四、实现逻辑回归算法

    LogisticRegression.py

    import numpy as np
    from .metrics import accuracy_score
    
    class LogisticRegression:
    
        def __init__(self):
            """初始化Logistic Regression模型"""
            self.coef_ = None
            self.intercept_ = None
            self._theta = None
    
        def _sigmoid(self, t):
            return 1. / (1. + np.exp(-t))
    
        def fit(self, X_train, y_train, eta=0.01, n_iters=1e4):
            """根据训练数据集X_train, y_train, 使用梯度下降法训练Logistic Regression模型"""
            assert X_train.shape[0] == y_train.shape[0], 
                "the size of X_train must be equal to the size of y_train"
    
            def J(theta, X_b, y):
                y_hat = self._sigmoid(X_b.dot(theta))
                try:
                    return - np.sum(y*np.log(y_hat) + (1-y)*np.log(1-y_hat)) / len(y)
                except:
                    return float('inf')
    
            def dJ(theta, X_b, y):
                return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)
    
            def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):
    
                theta = initial_theta
                cur_iter = 0
    
                while cur_iter < n_iters:
                    gradient = dJ(theta, X_b, y)
                    last_theta = theta
                    theta = theta - eta * gradient
                    if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
                        break
    
                    cur_iter += 1
    
                return theta
    
            X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
            initial_theta = np.zeros(X_b.shape[1])
            self._theta = gradient_descent(X_b, y_train, initial_theta, eta, n_iters)
    
            self.intercept_ = self._theta[0]
            self.coef_ = self._theta[1:]
    
            return self
    
        def predict_proba(self, X_predict):
            """给定待预测数据集X_predict,返回表示X_predict的结果概率向量"""
            assert self.intercept_ is not None and self.coef_ is not None, 
                "must fit before predict!"
            assert X_predict.shape[1] == len(self.coef_), 
                "the feature number of X_predict must be equal to X_train"
    
            X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
            return self._sigmoid(X_b.dot(self._theta))
    
        def predict(self, X_predict):
            """给定待预测数据集X_predict,返回表示X_predict的结果向量"""
            assert self.intercept_ is not None and self.coef_ is not None, 
                "must fit before predict!"
            assert X_predict.shape[1] == len(self.coef_), 
                "the feature number of X_predict must be equal to X_train"
    
            proba = self.predict_proba(X_predict)
            return np.array(proba >= 0.5, dtype='int')
    
        def score(self, X_test, y_test):
            """根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
    
            y_predict = self.predict(X_test)
            return accuracy_score(y_test, y_predict)
    
        def __repr__(self):
            return "LogisticRegression()"

     我写的文章只是我自己对bobo老师讲课内容的理解和整理,也只是我自己的弊见。bobo老师的课 是慕课网出品的。欢迎大家一起学习。

     我写的文章只是我自己对bobo老师讲课内容的理解和整理,也只是我自己的弊见。bobo老师的课 是慕课网出品的。欢迎大家一起学习。

     我写的文章只是我自己对bobo老师讲课内容的理解和整理,也只是我自己的弊见。bobo老师的课 是慕课网出品的。欢迎大家一起学习。

  • 相关阅读:
    python函数应用
    python文件操作
    设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)
    (二十四)解释器模式详解
    (二十三)原型模式详解(clone方法源码的简单剖析)
    (二十二)访问者模式详解(伪动态双分派)
    (二十一)状态模式详解(DOTA版)
    (二十)职责链模式详解(都市异能版)
    (十九)组合模式详解
    (十八)享元模式详解(都市异能版)
  • 原文地址:https://www.cnblogs.com/zhangtaotqy/p/9567988.html
Copyright © 2011-2022 走看看