机器学习(九) 逻辑回归 (上)

一、什么是逻辑回归

逻辑回归  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老师的课 是慕课网出品的。欢迎大家一起学习。