逻辑回归|机器学习|分类算法

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归|机器学习|分类算法相关的知识,希望对你有一定的参考价值。


1.逻辑回归

1.1逻辑回归原理

∙ \\bullet 逻辑回归又叫对数几率回归,是一种对数几率模型,可以求解二分类问题。

∙ \\bullet 之前我们学习过线性回归模型,带入模型后每一个点都有一个对应的实数值,范围为整个实数域;但是由于逻辑回归是利用回归方法解决二分类问题,所以求得的结果只能有两个值,在这里我们使用概率来对这两类进行描述:
y ^ = { 0 p ^ < 0.5 1 p ^ > 0.5 \\color{Violet}\\begin{matrix} \\hat y & = & \\left\\{\\begin{matrix} 0 & \\hat p<0.5 \\\\ 1 & \\hat p>0.5 \\end{matrix}\\right. & \\end{matrix} y^={01p^<0.5p^>0.5

在上述式子中, y ^ \\color{Red}\\hat y y^ 代表最终输出的标签值,它只有两个取值,当概率 p ^ \\color{Red}\\hat p p^ 大于0.5时取值1;当概率 p ^ \\color{Red}\\hat p p^ 小于0.5时取值为0;

∙ \\bullet 所以我们现在的问题就是如何把输出限制在(0,1)之间,通过线性回归的学习我们知道在线性回归中输出结果为: y ^ = W T x + b \\color {Violet}\\hat y = W^{T}x+b y^=WTx+b

那么我们现在需要通过另外一个 σ \\sigma σ函数将其进行压缩,即 y ^ = σ ( W T + b ) \\color{Violet}\\hat y=\\sigma(W^{T}+b) y^=σ(WT+b),下面我们继续介绍 σ \\color{Red}\\sigma σ 函数。

1.2sigmoid函数

上面我们提到的 σ \\color{Red}\\sigma σ 函数表达式如下:
σ ( t ) = 1 1 + e − t \\color{Violet}\\sigma (t) =\\frac{1}{1+e^{-t}} σ(t)=1+et1

当 t 趋于无穷小时,函数值趋于 0;当 t 趋于无穷大时,函数值趋于 1;它是一条平滑的 S 型曲线,如下图所示:


所以我们将自变量整体带入后,就可以得到逻辑回归的预测函数为:
p ^ = 1 1 + e − W T x + b \\color{Violet}\\hat p=\\frac{1}{1+e^{-W^{T}x+b}} p^=1+eWTx+b1


2.相关代码

2.1LogisticsRegression类

import numpy as np
import warnings
warnings.filterwarnings("ignore")
#逻辑回归模型
class LogisticsRegression:
	#和线性回归模型一样,我们最后要求得还是θ向量
    def __init__(self):
        '''初始化逻辑回归模型'''
        self.theta = None
        
    #定义sigmoid函数,将结果压缩到(0,1)之间    
    def sigmoid(self,x):
        '''
        sigmoid函数
        :param x: 转换前的输入
        :return: 转换后的概率
        '''
        return 1/(1+np.exp(-x))

	#使用梯度下降法,不断更新θ值
    def fit(self,x,y,eta=1e-3,n_iters=1e4):
        '''
        训练逻辑回归模型
        :param x: 训练集特征数据,类型为ndarray
        :param y: 训练集标签,类型为ndarray
        :param eta: 学习率,类型为float
        :param n_iters: 训练轮数,类型为int,默认值为10000
        :return: 模型参数,类型为ndarray
        '''
        self.theta = np.zeros(x.shape[1])#给theta赋初值,原始值都为0
        i_iter = 0
        while i_iter < n_iters:
            print("训练轮次:", i_iter)
            gradient = (self.sigmoid(x.dot(self.theta))-y).dot(x)#求当出当前梯度
            self.theta = self.theta -eta*gradient#更新theta
            i_iter += 1

    # 预测函数
    def predict(self,x):
        '''
        :param x: 测试集特征数据,类型为ndarray
        :return: 与测试
        '''        
        a = self.sigmoid(x.dot(self.theta))#通过sigmoid函数,将预测值变为概率值
        return np.array(a >= 0.5, dtype='int')#当概率值大于0.5时,则认为是属于标签 1

# 求准确率
def score(label, predict):
    '''
    :param label: 测试集标签数据,类型为ndarray
    :param predict: 预测标签数据,类型为ndarray
    '''
    label=label.astype(np.int)#将label转换为numpy.int类型
    return np.mean(label == predict)  #该函数求的是平均值

2.2求解代码

from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
#读取数据,csv文件中最后一列为标签值,其他列都为特征值(这里带入自己的数据即可,注意每个变量代表的含义)
data = pd.read_csv('/data/shixunfiles/3efa9f920dd798c7a3c754a0f9e1da2d_1577432653240.csv')

#提取特征值和标签值
X = data.iloc[:,:-1]
y = data.iloc[:,-1]

#对数据进行标准化
#减去一列的平均值除以一列的标准差
X = (X-np.mean(X,axis=0))/np.std(X,axis=0)

#对特征值加一列x0,x0的所有值为1,相当于偏离值b的系数(前面线性回归模型说过)
X = np.hstack([np.ones(shape=(len(X),1)),X])

#划分训练集与测试集,参数test_size设为0.2,random_state设为21
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 21)

#建立模型,并训练模型
Lr = LogisticsRegression()
Lr.fit(x_train,y_train)

#用测试数据集进行预测
predict = Lr.predict(x_test)

#评估预测的准确率
score = score(y_test,predict)
print(score)

2.3输出结果


3.直接调库使用

∙ \\bullet 实际在使用时,不需要自己实现逻辑回归的模型,此时我们直接调库即可;

∙ \\bullet 格式为:from sklearn.linear_model import LogisticRegression

∙ \\bullet 常用方法如下:

方法格式含义
fit(X,y)拟合线性回归模型,X为特征值矩阵,y为标签向量
predict(X)得到模型预测的结果向量,X为输入特征值矩阵
score(X,y)得到正确率,X为测试用例预测标签,y为真实结果的标签

以上是关于逻辑回归|机器学习|分类算法的主要内容,如果未能解决你的问题,请参考以下文章

机器学习故事汇-逻辑回归算法

机器学习算法应用和学习_3_代码API篇3.2 M_分类_逻辑回归

机器学习系列——分类及回归问题

机器学习分类算法之逻辑回归

机器学习-对数几率回归(逻辑回归)算法

机器学习算法面试为什么逻辑回归的损失函数是交叉熵?