• sklearn之逻辑分类


    '''
        逻辑分类:----底层为线性回归问题
            通过输入的样本数据,基于多元线型回归模型求出线性预测方程。
                y = w0+w1x1+w2x2
            但通过线型回归方程返回的是连续值,不可以直接用于分类业务模型,所以急需一种方式使得把连续的预测值->离散的预测值。
             [-oo, +oo]->{0, 1}
             逻辑函数(sigmoid):y = 1 / (1+e^(-x)), 该逻辑函数当x>0,y>0.5;当x<0, y<0.5;
            可以把样本数据经过线性预测模型求得的值带入逻辑函数的x,即将预测函数的输出看做输入被划分为1类的概率,
            择概率大的类别作为预测结果,可以根据函数值确定两个分类。这是连续函数离散化的一种方式。
    
        逻辑回归相关API:
                import sklearn.linear_model as lm
                # 构建逻辑回归器
                # solver:逻辑函数中指数的函数关系(liblinear为线型函数关系)
                # C:参数代表正则强度,为了防止过拟合。正则越大拟合效果越小。
                model = lm.LogisticRegression(solver='liblinear', C=正则强度)
                model.fit(训练输入集,训练输出集)
                result = model.predict(带预测输入集)
    
        案例:基于逻辑回归器绘制网格化坐标颜色矩阵。
    '''
    import numpy as np
    import matplotlib.pyplot as mp
    import sklearn.linear_model as lm
    
    x = np.array([[3, 1],
                  [2, 5],
                  [1, 8],
                  [6, 4],
                  [5, 2],
                  [3, 5],
                  [4, 7],
                  [4, -1]])
    y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
    # 根据找到的某些规律,绘制分类边界线
    l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
    b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
    n = 500
    grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
    # 构建逻辑回归模型,并训练模型
    model = lm.LogisticRegression(solver='liblinear', C=1)
    model.fit(x, y)
    # 把网格坐标矩阵中500*500做类别预测
    test_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))      # grid_x,grid_y撑平后合并为两列
    test_y = model.predict(test_x)
    grid_z = test_y.reshape(grid_x.shape)
    
    # 绘制样本数据
    mp.figure('Simple Classification', facecolor='lightgray')
    mp.title('Simple Classification')
    mp.xlabel('X')
    mp.ylabel('Y')
    # 绘制分类边界线(填充网格化矩阵)
    mp.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
    mp.scatter(x[:, 0], x[:, 1], s=80, c=y, cmap='jet', label='Samples')
    
    mp.legend()
    mp.show()

      

      

    '''
        多元逻辑分类:----底层为线性回归问题
            通过多个二元分类器解决多元分类问题。
                特征1    特征2    ==>    所属类别
                4        7        ==>     A
                3.5        8        ==>        A
                1.2        1.9     ==>     B
                5.4        2.2     ==>     C
            若拿到一组新的样本,可以基于二元逻辑分类训练出一个模型判断属于A类别的概率。
            再使用同样的方法训练出两个模型分别判断属于B、C类型的概率,最终选择概率最高的类别作为新样本的分类结果。
    
        逻辑回归相关API:
                import sklearn.linear_model as lm
                # 构建逻辑回归器
                # solver:逻辑函数中指数的函数关系(liblinear为线型函数关系)
                # C:参数代表正则强度,为了防止过拟合。正则越大拟合效果越小。
                model = lm.LogisticRegression(solver='liblinear', C=正则强度)
                model.fit(训练输入集,训练输出集)
                result = model.predict(带预测输入集)
    
        案例:基于逻辑分类模型的多元分类。
    '''
    import numpy as np
    import matplotlib.pyplot as mp
    import sklearn.linear_model as lm
    
    x = np.array([[4, 7],
                  [3.5, 8],
                  [3.1, 6.2],
                  [0.5, 1],
                  [1, 2],
                  [1.2, 1.9],
                  [6, 2],
                  [5.7, 1.5],
                  [5.4, 2.2]])
    y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
    # 根据找到的某些规律,绘制分类边界线
    l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
    b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
    n = 500
    grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
    # 构建逻辑回归模型,并训练模型
    model = lm.LogisticRegression(solver='liblinear', C=200)
    model.fit(x, y)
    # 把网格坐标矩阵中500*500做类别预测
    test_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))  # grid_x,grid_y撑平后合并为两列
    test_y = model.predict(test_x)
    grid_z = test_y.reshape(grid_x.shape)
    
    # 绘制样本数据
    mp.figure('Simple Classification', facecolor='lightgray')
    mp.title('Simple Classification')
    mp.xlabel('X')
    mp.ylabel('Y')
    # 绘制分类边界线(填充网格化矩阵)
    mp.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
    mp.scatter(x[:, 0], x[:, 1], s=80, c=y, cmap='jet', label='Samples')
    
    mp.legend()
    mp.show()

      

  • 相关阅读:
    codevs 1766 装果子
    codevs 1415 比那名居天子
    codevs 1388 砍树
    codevs 1373 射命丸文
    codevs 2867 天平系统3
    codevs 2866 天平系统2
    codevs 2865 天平系统1
    codevs 2832 6个朋友
    广搜优化题目总结
    Codeforces Round #578 (Div. 2)
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11186809.html
Copyright © 2020-2023  润新知