zoukankan      html  css  js  c++  java
  • logistic回归模型

    logistic 回归算法

    是分类模型不是回归模型
    一种常见的分类算法,输出值在0,1之间
    是:1
    否:0
    即找到满足下面条件的最优参数
    (0 leq h_{ heta}(x) leq 1)
    假设函数的表示方法:
    (h_{ heta}(x)=gleft( heta^{T} x ight))
    其中:
    (g(z)=frac{1}{1+e^{-z}})
    因此,(g(z))带入假设函数之后,假设函数的表示为
    (h_{ heta}(x)=frac{1}{1+e^{- heta^{T} x}})

    如果我们想要结果总是在0到1之间,那么就可以使用sigmoid函数,它能保证数据在0-1之间。并且越趋近于无穷大,数据越趋近于1。
    sigmoid函数==logistic函数
    其函数图像如下:

    注意到z趋向于负无穷大时,值越接近0;z趋向于正无穷大时,值越接近1。这样就可以使输出值在0到1之间。有了这个假设函数,就可以拟合数据了,根据给定的θ参数值,假设会做出预测

    假设一个问题,如果肿瘤是依赖于大小来判断良性恶性,如果超过0.7*平均值,就判断是恶性的,那么平均来算30%的是恶性的,70%是良性的,他们相加总会是100%。再来看看上面的sigmoid的图像,每个点都表示它属于1的概率是x,属于0的概率是1-x。这样一个分类的问题,就变成了曲线值得问题了。

    如果想让y=1,即g(z)的值要大于0.5,那么z的值就需要大于0;相反,y=0,就是z的值小于0。因此整个分类问题,就变成了寻找决策边界的问题了。

    决策边界:

    一个可以进行分类的拟合函数,函数的未知数是( heta),不同的参数决定不同的决策边界

    一般是用训练集来自动求解( heta)

    那么如何确定逻辑回归的损失函数呢?如果使用均方误差,由于最终的值都是0和1,就会产生震荡,此时是无法进行求导的。

    因此需要寻找一个方法,使得代价函数变成凸函数,从而易于求解。

    logistic回归的代价函数

    (J( heta)=frac{1}{m} sum_{i=1}^{m} operatorname{cost}left(h_{ heta}left(x^{(i)} ight), y^{(i)} ight))

    如果这里使用梯度下降法,不能保证能得到全局收敛的值,这个函数就是所谓的非凸函数。因此我们需要找一个不同的代价函数,并且是个凸函数,使得我们可以使用好的算法并找到全局最小值

    (operatorname{cost}left(h_{ heta}(x), y ight)=left{egin{aligned}-log left(h_{ heta}(x) ight) & ext { if } y=1 \-log left(1-h_{ heta}(x) ight) & ext { if } y=0 end{aligned} ight.)

    y=0 or 1

    其简写的形式,也就是化为一项的形式
    (egin{aligned} J( heta) &=frac{1}{m} sum_{i=1}^{m} operatorname{cost}left(h_{ heta}left(x^{(i)} ight), y^{(i)} ight) \ &=-frac{1}{m}left[sum_{i=1}^{m} y^{(i)} log h_{ heta}left(x^{(i)} ight)+left(1-y^{(i)} ight) log left(1-h_{ heta}left(x^{(i)} ight) ight) ight] end{aligned})

    这里使用梯度下降法进行求导

    梯度下降求导的实质就是反复求导,知道最优解。
    Repeat ( heta_{j}:= heta_{j}-frac{alpha}{m} sum_{i=1}^{m}left(h_{ heta}left(x^{(i)} ight)-y^{(i)} ight) x_{j}^{(i)})
    [
    1
    ]
    }
    依然是同步更新所有的( heta)

    比梯度下降算法优化一点的算法

    jianshu

    对于二分类问题和多分类的问题,就是找到最优的分类器
    至于分类器如何确定,还是多见例子

    复现代码

    # Import the necessary modules
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import confusion_matrix ,classification_report
    
    # Create training and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4, random_state=42)
    
    # Create the classifier: logreg
    logreg = LogisticRegression()
    
    # Fit the classifier to the training data
    logreg.fit(X_train,y_train)
    
    # Predict the labels of the test set: y_pred
    y_pred = logreg.predict(X_test)
    
    # Compute and print the confusion matrix and classification report
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    
    #<script.py> output:
        [[176  30]
         [ 35  67]]
                     precision    recall  f1-score   support
        
                  0       0.83      0.85      0.84       206
                  1       0.69      0.66      0.67       102
        
        avg / total       0.79      0.79      0.79       308
    
  • 相关阅读:
    基于Dubbo框架构建分布式服务(一)
    大型网站架构系列:消息队列
    Redis Cluster 分区实现原理
    Redis五种数据结构简介
    Java中创建对象的5种方式
    Netty 系列之 Netty 高性能之道
    Java 抽象类与接口
    谈iOS抓包:Mac下好用的HTTP/HTTPS抓包工具Charles
    Web系统大规模并发——电商秒杀与抢购
    [转]MS SQL Server 数据库连接字符串详解
  • 原文地址:https://www.cnblogs.com/gaowenxingxing/p/12232552.html
Copyright © 2011-2022 走看看