• sklearn实现多分类逻辑回归


    sklearn实现多分类逻辑回归

    #二分类逻辑回归算法改造适用于多分类问题
    1、对于逻辑回归算法主要是用回归的算法解决分类的问题,它只能解决二分类的问题,不过经过一定的改造便可以进行多分类问题,主要的改造方式有两大类:
    (1)OVR/A(One VS Rest/ALL)
    (2)OVO(One VS One)

    2、对于OVR的改造方式,主要是指将多个分类结果(假设为n)分成是其中一种分类结果的和(其他),这样便可以有n种分类的模型进行训练,最终选择得分最高的的(预测率最高的的)便为分类结果即可。它所训练的时间是原来分类时间的n倍

    图1
    3、对于OVO的方式,主要是将n个数据分类结果任意两个进行组合,然后对其单独进行训练和预测最终在所有的预测种类中比较其赢数最高的即为分类结果,这样的分类方式最终将训练分为n(n-1)/2个模型计算时间相对较长,不过这样的方式每次训练各个种类之间不混淆也不影响,因此比较准确。

    图2
    4、sklearn中含有将逻辑回归进行多分类的函数封装,可以直接进行调用,当然也可以自己进行底层实现,都是比较方便的。在sklearn中实现逻辑回归的多分类任务具体实现代码如下所示:

    #OVR-OVO改造二分类算法实现多分类方式
    import numpy as np
    import matplotlib.pyplot as plt
    def plot_decision_boundary(model,axis): #两个数据特征基础下输出决策边界函数
    x0,x1=np.meshgrid(
    np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
    np.linspace(axis[2],axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1,1)
    )
    x_new=np.c_[x0.ravel(),x1.ravel()]
    y_pre=model.predict(x_new)
    zz=y_pre.reshape(x0.shape)
    from matplotlib.colors import ListedColormap
    cus=ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])
    plt.contourf(x0,x1,zz,cmap=cus)

    #采用iris数据集的两个数据特征进行模型训练与验证
    from sklearn import datasets
    d=datasets.load_iris()
    x=d.data[:,:2] #选取特征数据集的前两个数据特征,方便输出决策出边界进行训练结果的对比
    y=d.target
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=666)
    from sklearn.linear_model import LogisticRegression

    #OVR方式的调用-默认方式
    log_reg=LogisticRegression() #不输入参数时,默认情况下是OVR方式
    log_reg.fit(x_train,y_train)
    print(log_reg.score(x_test,y_test))
    plot_decision_boundary(log_reg,axis=[4,9,1,5])
    plt.scatter(x[y==0,0],x[y==0,1],color="r")
    plt.scatter(x[y==1,0],x[y==1,1],color="g")
    plt.scatter(x[y==2,0],x[y==2,1],color="b")
    plt.show()

    #OVO的方式进行逻辑回归函数参数的定义,结果明显好于OVR方式
    log_reg1=LogisticRegression(multi_class="multinomial",solver="newton-cg")
    log_reg1.fit(x_train,y_train)
    print(log_reg1.score(x_test,y_test))
    plot_decision_boundary(log_reg1,axis=[4,9,1,5])
    plt.scatter(x[y==0,0],x[y==0,1],color="r")
    plt.scatter(x[y==1,0],x[y==1,1],color="g")
    plt.scatter(x[y==2,0],x[y==2,1],color="b")
    plt.show()

    #采用iris数据的所有特征数据
    x=d.data
    y=d.target
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=666)
    from sklearn.linear_model import LogisticRegression

    #OVR方式的调用-默认胡方式
    log_reg=LogisticRegression() #不输入参数时,默认情况下是OVR方式
    log_reg.fit(x_train,y_train)
    print(log_reg.score(x_test,y_test))

    #采用OVO的方式进行逻辑回归函数参数的定义,结果明显好于OVR方式
    log_reg1=LogisticRegression(multi_class="multinomial",solver="newton-cg")
    log_reg1.fit(x_train,y_train)
    print(log_reg1.score(x_test,y_test))

    实现结果如下所示:

    
    
    
  • 相关阅读:
    4g内存装64位WIN7好还是32位好(遇到问题,百度后解除疑惑)
    Windows Phone 7.5 “Mango”消息泄露 支持HTML5和Silverlight
    Tiobe发布2010年12月开发语言排名
    Adobe:Flash 10.2将全面提升性能
    ADO.NET Entity Framework使用实体数据
    使用GPU.NET针对GPU编程
    ADO.NET Entity Framework入门(实体框架)
    完美程序员的10种品质
    ADO.NET Entity Framework(实体框架)
    不适合当一名开发人员的10种迹象
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/11350468.html
Copyright © 2020-2023  润新知