Datawhale集成学习学习笔记——Task04分类

分类

  • 选择度量模型性能的指标。

    在这里插入图片描述

    • Sklearn函数
    • 准确率:分类正确的样本数占总样本的比例,即: A C C = T P + T N F P + F N + T P + T N ACC = \frac{TP+TN}{FP+FN+TP+TN} ACC=FP+FN+TP+TNTP+TN.
    • 精度:预测为正且分类正确的样本占预测值为正的比例,即: P R E = T P T P + F P PRE = \frac{TP}{TP+FP} PRE=TP+FPTP.
    • 召回率:预测为正且分类正确的样本占类别为正的比例,即: R E C = T P T P + F N REC = \frac{TP}{TP+FN} REC=TP+FNTP.
    • F1值:综合衡量精度和召回率,即: F 1 = 2 P R E × R E C P R E + R E C F1 = 2\frac{PRE\times REC}{PRE + REC} F1=2PRE+RECPRE×REC.
    • ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
  • 选择具体的模型并进行训练以优化模型。

    • 逻辑回归

      #  逻辑回归
      '''
      penalty       {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’正则化方式
      dual      bool, default=False   是否使用对偶形式,当n_samples> n_features时,默认dual = False。   
      C        float, default=1.0      
      solver       {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, default=’lbfgs’     
      l1_ratio         float, default=None           
      '''
      from sklearn.linear_model import LogisticRegression
      log_iris = LogisticRegression()
      log_iris.fit(X,y)
      log_iris.score(X,y)
      
    • 基于概率的分类模型

      • 线性判别分析

        • 基于贝叶斯公式
        • 降维分类思想
        # 线性判别分析
        '''
        参数:
        solver:{'svd','lsqr','eigen'},默认='svd'
        solver的使用,可能的值:
        'svd':奇异值分解(默认)。不计算协方差矩阵,因此建议将此求解器用于具有大量特征的数据。
        
        'lsqr':最小二乘解,可以与收缩结合使用。
        
        'eigen':特征值分解,可以与收缩结合使用。
        '''
        from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
        lda_iris = LinearDiscriminantAnalysis()
        lda_iris.fit(X,y)
        lda_iris.score(X,y)
        
      • 朴素贝叶斯

        # 朴素贝叶斯             
        from sklearn.naive_bayes import GaussianNB
        NB_iris = GaussianNB()
        NB_iris.fit(X, y)
        NB_iris.score(X,y)
        
    • 决策树

      # 使用决策树算法对iris分类:
      '''
      criterion:{“gini”, “entropy”}, default=”gini”
      max_depth:树的最大深度。
      min_samples_split:拆分内部节点所需的最少样本数
      min_samples_leaf :在叶节点处需要的最小样本数。
      
      '''
      from sklearn.tree import DecisionTreeClassifier
      tree_iris = DecisionTreeClassifier(min_samples_leaf=5)
      tree_iris.fit(X,y)
      tree_iris.score(X,y)
      
    • 支持向量机SVM

      from sklearn.pipeline import make_pipeline
      from sklearn.preprocessing import StandardScaler
      from sklearn.svm import SVC
      '''
      C:正则化参数。正则化的强度与C成反比。必须严格为正。惩罚是平方的l2惩罚。
      kernel:{'linear','poly','rbf','sigmoid','precomputed'},默认='rbf'
      degree:多项式和的阶数
      gamma:“ rbf”,“ poly”和“ Sigmoid”的内核系数。
      shrinking:是否软间隔分类,默认true
      
      '''
      svc_iris = make_pipeline(StandardScaler(), SVC(gamma='auto'))
      svc_iris.fit(X, y)
      svc_iris.score(X,y) 
      
    • 非线性支持向量机

超参数调优

  • 超参数: 无法使用最优化算法优化出来的数
    • 模型参数是模型内部的配置变量,其值可以根据数据进行估计。
      • 进行预测时需要参数。
      • 它参数定义了可使用的模型。
      • 参数是从数据估计或获悉的。
      • 参数通常不由编程者手动设置。
      • 参数通常被保存为学习模型的一部分。
      • 参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。
    • 模型超参数是模型外部的配置,其值无法从数据中估计。
      • 超参数通常用于帮助估计模型参数。
      • 超参数通常由人工指定。
      • 超参数通常可以使用启发式设置。
      • 超参数经常被调整为给定的预测建模问题。
  • 调优方法
    • 网格搜索GridSearchCV()
    • 随即搜索RandomizedSearchCV(
      • 随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点:
      • 可以独立于参数数量和可能的值来选择计算成本。
      • 添加不影响性能的参数不会降低效率。
    • 贝叶斯优化

作业

在这里插入图片描述

  • 回归问题和分类问题的联系和区别, 如何利用回归问题理解分类问题

    • 区别在于预测值是否是连续的
    • 联系在于特征或部分算法相近
    • 如果将分类问题变成01二分类也可看成一种特殊的回归问题
  • 为什么分类问题的损失函数是交叉熵而不是均方误差

    • 均方误差在输出接近01时梯度较小, 学习速率会非常慢. 交叉熵没有这样的问题
  • 线性判别分析和逻辑回归在估计参数方面有什么异同点

  • 尝试从0推导SVM

  • 二次判别分析, 线性判别分析, 朴素贝叶斯之间的联系和区别

  • 使用python+numpy实现逻辑回归

    from numpy import *
    filename='...\\testSet.txt' #文件目录
    def loadDataSet():   #读取数据(这里只有两个特征)
        dataMat = []
        labelMat = []
        fr = open(filename)
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])   #前面的1,表示方程的常量。比如两个特征X1,X2,共需要三个参数,W1+W2*X1+W3*X2
            labelMat.append(int(lineArr[2]))
        return dataMat,labelMat
    
    def sigmoid(inX):  #sigmoid函数
        return 1.0/(1+exp(-inX))
    
    def gradAscent(dataMat, labelMat): #梯度上升求最优参数
        dataMatrix=mat(dataMat) #将读取的数据转换为矩阵
        classLabels=mat(labelMat).transpose() #将读取的数据转换为矩阵
        m,n = shape(dataMatrix)
        alpha = 0.001  #设置梯度的阀值,该值越大梯度上升幅度越大
        maxCycles = 500 #设置迭代的次数,一般看实际数据进行设定,有些可能200次就够了
        weights = ones((n,1)) #设置初始的参数,并都赋默认值为1。注意这里权重以矩阵形式表示三个参数。
        for k in range(maxCycles):
            h = sigmoid(dataMatrix*weights)
            error = (classLabels - h)     #求导后差值
            weights = weights + alpha * dataMatrix.transpose()* error #迭代更新权重
        return weights
    
    def stocGradAscent0(dataMat, labelMat):  #随机梯度上升,当数据量比较大时,每次迭代都选择全量数据进行计算,计算量会非常大。所以采用每次迭代中一次只选择其中的一行数据进行更新权重。
        dataMatrix=mat(dataMat)
        classLabels=labelMat
        m,n=shape(dataMatrix)
        alpha=0.01
        maxCycles = 500
        weights=ones((n,1))
        for k in range(maxCycles):
            for i in range(m): #遍历计算每一行
                h = sigmoid(sum(dataMatrix[i] * weights))
                error = classLabels[i] - h
                weights = weights + alpha * error * dataMatrix[i].transpose()
        return weights
    
    def stocGradAscent1(dataMat, labelMat): #改进版随机梯度上升,在每次迭代中随机选择样本来更新权重,并且随迭代次数增加,权重变化越小。
        dataMatrix=mat(dataMat)
        classLabels=labelMat
        m,n=shape(dataMatrix)
        weights=ones((n,1))
        maxCycles=500
        for j in range(maxCycles): #迭代
            dataIndex=[i for i in range(m)]
            for i in range(m): #随机遍历每一行
                alpha=4/(1+j+i)+0.0001  #随迭代次数增加,权重变化越小。
                randIndex=int(random.uniform(0,len(dataIndex)))  #随机抽样
                h=sigmoid(sum(dataMatrix[randIndex]*weights))
                error=classLabels[randIndex]-h
                weights=weights+alpha*error*dataMatrix[randIndex].transpose()
                del(dataIndex[randIndex]) #去除已经抽取的样本
        return weights
    
    def plotBestFit(weights):  #画出最终分类的图
        import matplotlib.pyplot as plt
        dataMat,labelMat=loadDataSet()
        dataArr = array(dataMat)
        n = shape(dataArr)[0]
        xcord1 = []; ycord1 = []
        xcord2 = []; ycord2 = []
        for i in range(n):
            if int(labelMat[i])== 1:
                xcord1.append(dataArr[i,1])
                ycord1.append(dataArr[i,2])
            else:
                xcord2.append(dataArr[i,1])
                ycord2.append(dataArr[i,2])
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
        ax.scatter(xcord2, ycord2, s=30, c='green')
        x = arange(-3.0, 3.0, 0.1)
        y = (-weights[0]-weights[1]*x)/weights[2]
        ax.plot(x, y)
        plt.xlabel('X1')
        plt.ylabel('X2')
        plt.show()
    
    def main():
        dataMat, labelMat = loadDataSet()
        weights=gradAscent(dataMat, labelMat).getA()
        plotBestFit(weights)
    
    if __name__=='__main__':
        main()
    
  • 了解梯度下降法, 牛顿法, 拟牛顿法与smo算法等优化算法

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值