精华内容
下载资源
问答
  • 2018-09-27 14:10:43

    1.机器学习的一个主要任务就是分类

    2.学习如何分类需要做算法训练,为算法输入大量已分类数据作为算法的训练集

    3.分类问题中的目标向量称为类别,并假定分类问题只存在有限个数的类别。

    4.训练数据测试数据

    5.假定某一个算法,经过测试满足精确度要求,已经学会了如何分类,这部分工作称之为知识表示

    6.机器学习的另一个主要任务就是回归,主要用于预测数值型数据。

    7.分类和回归属于监督学习,之所以称为监督学习,是因为这类算法必须知道预测什么,即目标的分类信息。

    8.与监督学习对应的是无监督学习,在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;将寻找描述数据统计值的过程称之为密度估计

    9.分类:k-近邻算法、朴素贝叶斯算法、支持向量机、决策树

    回归:线性回归、局部加权线性回归、Ridge回归、Lasso最小回归系数估计

    聚类和密度估计:K-均值、最大期望算法、DBSCAN、Parzen窗设计

    10.选择实际可用的算法必须考虑:1)使用机器学习算法的目的,想要算法完成何种任务;2)需要分析或收集的数据是什么。

    11.学习和使用机器学习算法开发应用程序步骤:1)收集数据;2)准备输入数据;3)分析输入数据;4)训练算法;5)测试算法;6)使用算法。

    12.Python语言的优势:易于理解,丰富的函数库(尤其是矩阵操作)、活跃的开发者社区等。

    13.Python适用于机器学习算法:1)Python的语法清晰;2)易于操作纯文本文件;3)使用广泛,存在大量的开发文档。

    Python不足:性能问题。

    更多相关内容
  • Parzen窗

    千次阅读 2021-09-20 20:18:23
    Parzen窗法 1. 方法综述 假设x∈Rdx \in R^dx∈Rd是ddd维特征向量,并假设每个小舱是一个超立方体,它在每一维的棱长都为hhh,则小舱的体积是: V=hd(1) V=h^d \tag 1 V=hd(1)

    Parzen窗法

    1. 方法综述

    假设 x ∈ R d x \in R^d xRd d d d维特征向量,并假设每个小舱是一个超立方体,它在每一维的棱长都为 h h h,则小舱的体积是:
    V = h d (1) V=h^d \tag 1 V=hd(1)
    要计算每个小舱内落入的样本数目,可以定义如下的 d d d维单位方窗函数:
    φ ( [ u 1 , u 2 , . . . , u d ] T ) = { 1 若 ∣ u j ∣ ≤ 1 2 , j = 1 , 2 , . . . , d 0 其 他 (2) \varphi([u_1,u_2,...,u_d]^T) = \left\{ \begin{array}{cc} 1 & 若|u_j| \leq \frac{1}{2},j=1,2,...,d \\ 0 & 其他 \end{array} \right. \tag 2 φ([u1,u2,...,ud]T)={10uj21,j=1,2,...,d(2)
    该函数在以原点为中心的 d d d维单位超正方体内取值为1,而其他地方取值都为0。对于每个 x x x,要考查某个样本 x i x_i xi是否在这个 x x x为中心、 h h h为棱长的立方小舱内,就可以通过计算 φ ( x − x i h ) \varphi(\frac{x-x_i}{h}) φ(hxxi)来进行。现在共有 N N N个观测样本 { x 1 , x 2 , . . . , x N } \{x_1,x_2,...,x_N\} {x1,x2,...,xN},那么落入以 x x x为中心的超立方体内的样本数就可以写成:
    k N = ∑ i = 1 N φ ( x − x i h ) (3) k_N=\sum_{i=1}^{N} \varphi(\frac{x-x_i}{h}) \tag 3 kN=i=1Nφ(hxxi)(3)
    将上式代入 ρ ( x ) ^ = k N V \hat{\rho(x)}=\frac{k}{NV} ρ(x)^=NVk中有:
    ρ ( x ) ^ = 1 N V ∑ i = 1 N φ ( x − x i h ) (4) \hat{\rho(x)}=\frac{1}{NV} \sum_{i=1}^{N} \varphi(\frac{x-x_i}{h}) \tag 4 ρ(x)^=NV1i=1Nφ(hxxi)(4)
    或者写成:
    ρ ( x ) ^ = 1 N ∑ i = 1 N 1 V φ ( x − x i h ) (5) \hat{\rho(x)}=\frac{1}{N} \sum_{i=1}^{N} \frac{1}{V} \varphi(\frac{x-x_i}{h}) \tag 5 ρ(x)^=N1i=1NV1φ(hxxi)(5)
    定义核函数(也称窗函数)如下:
    K ( x , x i ) = 1 V φ ( x − x i h ) (6) K(x,x_i)=\frac{1}{V} \varphi(\frac{x-x_i}{h}) \tag 6 K(x,xi)=V1φ(hxxi)(6)
    它反映了一个观测样本 x i x_i xi对在 x x x处的概率密度估计的贡献,与样本 x i x_i xi x x x的距离有关,也可记作 K ( x − x i ) K(x-x_i) K(xxi)。概率密度估计就是在每一点上把所有观测样本的贡献进行平均:
    ρ ( x ) ^ = 1 N ∑ i = 1 N K ( x , x i ) (7) \hat{\rho(x)}=\frac{1}{N} \sum_{i=1}^{N} K(x,x_i) \tag 7 ρ(x)^=N1i=1NK(x,xi)(7)
    几种常见核函数
    (1)方窗
    k ( x , x i ) = { 1 h d 若 ∣ x j − x i j ∣ ≤ h 2 , j = 1 , 2 , . . . , d 0 其 他 (8) k(x,x_i)= \left\{ \begin{array}{cc} \frac{1}{h^d} & 若|x_j-x_i^j| \leq \frac{h}{2},j=1,2,...,d \\ 0 & 其他 \end{array} \right. \tag 8 k(x,xi)={hd10xjxij2h,j=1,2,...,d(8)
    其中, h h h为超立方体的棱长。
    (2)高斯窗(正态窗)
    k ( x , x i ) = 1 ( 2 π ) d ρ 2 d ∣ Q ∣ exp ⁡ { − 1 2 ( x − x i ) T Q − 1 ( x − x i ) ρ 2 } (9) k(x,x_i)=\frac{1}{\sqrt{(2\pi)^d\rho^{2d} |Q|}} \exp\{-\frac{1}{2} \frac{(x-x_i)^T Q^{-1} (x-x_i)}{\rho^2}\} \tag 9 k(x,xi)=(2π)dρ2dQ 1exp{21ρ2(xxi)TQ1(xxi)}(9)
    即以样本 x i x_i xi为均值、协方差矩阵为 Σ = ρ 2 Q \Sigma=\rho^2 Q Σ=ρ2Q的正态分布函数。一维情况下则为:
    ρ ( x ) = 1 2 π σ e − 1 2 ( x − μ σ ) 2 (10) \rho(x)=\frac{1}{\sqrt{2\pi \sigma}} e^{-\frac{1}{2} (\frac{x- \mu}{\sigma})^2} \tag {10} ρ(x)=2πσ 1e21(σxμ)2(10)
    (3)超球窗
    k ( x , x i ) = { V − 1 若 ∣ ∣ x − x i ∣ ∣ ≤ ρ 0 其 他 (11) k(x,x_i)= \left\{ \begin{array}{cc} V^{-1} & 若||x-x_i|| \leq \rho \\ 0 & 其他 \end{array} \right. \tag {11} k(x,xi)={V10xxiρ(11)
    其中 V V V是超球体的体积, ρ \rho ρ是超球体半径。

    2. 代码实战

    σ = h 1 / N \sigma=h_1/\sqrt{N} σ=h1/N h 1 h_1 h1为例子中可调节的参量。
    主函数

    function p = Parsen(Samples,H,N,interval)
    % Samples 表示总样本
    % h 表示Parsen窗口大小
    % N 是随机采样的样本大小(1,10,100)
    % x 是密度估计的点
    
    p = zeros(length(interval),1);
    h = (H/sqrt(N)); % 半径
    
    for i = 1 : length(interval)
        b = 0;
        for j = 1 : N
            u = (interval(i) - Samples(j))/h;
            b = b + exp(-u.^2/2)/(sqrt(2*pi)*h); % 一维高斯分布
        end
        p(i) = b / N;
    end
    end
    

    Parsen.m

    function p = Parsen(Samples,H,N,interval)
    % Samples 表示总样本
    % h 表示Parsen窗口大小
    % N 是随机采样的样本大小(1,10,100)
    % x 是密度估计的点
    
    p = zeros(length(interval),1);
    h = (H/sqrt(N)); % 半径
    
    for i = 1 : length(interval)
        b = 0;
        for j = 1 : N
            u = (interval(i) - Samples(j))/h;
            b = b + exp(-u.^2/2)/(sqrt(2*pi)*h); % 一维高斯分布
        end
        p(i) = b / N;
    end
    end
    

    图示
    在这里插入图片描述

    展开全文
  • 我在非参数技术——Parzen窗估计方法文章和非参数估计-Parzen窗口函数法文章里面整理出了算法基本过程:利用第一篇博客给出的样本数据对给定的数据进行分类。分类的方法就是根据公式分别求出对于三个类的数值。公式...

    自己计划实现一遍模式识别里的内容。

    Parzen窗估计是非参数估计。我在非参数技术——Parzen窗估计方法文章和非参数估计-Parzen窗口函数法文章里面整理出了算法基本过程:利用第一篇博客给出的样本数据对给定的数据进行分类。分类的方法就是根据公式分别求出对于三个类的数值。公式是

    求出来数值之后,比较大小,给定数据属于数值较大的一类。运算通过numpy包实现,通过循环得出数值,进行比较。

    代码实现如下,计算的结果和非参数技术——Parzen窗估计方法文中给的内容基本一致。

    import numpy as np

    import matplotlib.pyplot as plt

    from mpl_toolkits.mplot3d import Axes3D

    # parzen窗法

    # 原始数据

    # w1

    data1=[[0.28,1.31,-6.2],

    [0.07,0.58,-0.78],

    [1.54,2.01,-1.63],

    [-0.44,1.18,-4.32],

    [-0.81,0.21,5.73],

    [1.52,3.16,2.77],

    [2.20,2.42,-0.19],

    [0.91,1.94,6.21],

    [0.65,1.93,4.38],

    [-0.26,0.82,-0.96]

    ]

    w1=np.mat(data1)

    # w2

    data2=[[0.011,1.03,-0.21],

    [1.27,1.28,0.08],

    [0.13,3.12,0.16],

    [-0.21,1.23,-0.11],

    [-2.18,1.39,-0.19],

    [0.34,1.96,-0.16],

    [-1.38,0.94,0.45],

    [-0.12,0.82,0.17],

    [-1.44,2.31,0.14],

    [0.26,1.94,0.08]

    ]

    w2=np.mat(data2)

    # w3

    data3=[[1.36,2.17,0.14],

    [1.41,1.45,-0.38],

    [1.22,0.99,0.69],

    [2.46,2.19,1.31],

    [0.68,0.79,0.87],

    [2.51,3.22,1.35],

    [0.60,2.44,0.92],

    [0.64,0.13,0.97],

    [0.85,0.58,0.99],

    [0.66,0.51,0.88]

    ]

    w3=np.mat(data3)

    #得到Φ函数的结果

    # 要是用np.mat创建矩阵,np.array是不行的,是数组没有转置

    def get_phi(x, xi, h):

    x = np.mat(x)

    xi = np.mat(xi)

    phi = np.exp(-(x - xi) * (x - xi).T / (2 * h * h))

    return phi

    # 整体公式的算数

    def get_px(x, xi, h):

    phi = 0

    n = len(xi)

    for i in range(n):

    # print("xi[i]", xi[i])

    phi += get_phi(x, xi[i], h)

    px = phi / ( n * np.power(h, 3))

    return px

    # 利用parzen窗判断目标数据属于哪个类

    def parzen(h, test):

    # 数组用来比较结果属于哪一类

    px = [0, 0, 0]

    # h的取值

    print("h =", h)

    px[0] = get_px(test,w1,h)

    px[1] = get_px(test, w2, h)

    px[2] = get_px(test, w3, h)

    # 输出一下计算结果,用来和已知内容比较

    print("w1",px[0])

    print("w2",px[1])

    print("w3",px[2])

    # 加一个plt的图形展示,可以显示已经有的点和分类的点,正好自己不熟悉,练习一下

    fig = plt.figure()

    ax = fig.add_subplot(111, projection='3d')

    ax.scatter(w1[:, 0], w1[:, 1], w1[:, 2], s=20, c='r')

    ax.scatter(w2[:, 0], w2[:, 1], w2[:, 2], s=20, c='g')

    ax.scatter(w3[:, 0], w3[:, 1], w3[:, 2], s=20, c='y')

    if px[0] > px[1] :

    if px[0] > px[2] :

    print("属于第一类")

    ax.scatter(test[0], test[1], test[2], s=50, c='r')

    else :

    print("属于第三类")

    ax.scatter(test[0], test[1], test[2], s=50, c='y')

    else :

    if px[1] > px[2]:

    print("属于第二类")

    ax.scatter(test[0], test[1], test[2], s=50, c='g')

    else:

    print("属于第三类")

    ax.scatter(test[0], test[1], test[2], s=50, c='y')

    # xyz轴的名称

    ax.set_xlabel('X ')

    ax.set_ylabel('Y ')

    ax.set_zlabel('Z ')

    # 标题名称,有变量,向string一样%s处理

    plt.title("h=%s"%h)

    plt.show()

    # 计算

    def main():

    # 数组分别为 [0.5, 1.0, 0.0] [0.31, 1.51, -0.50] [-0.3, 0.44, -0.1]

    # 切换test的数组内容可以测试每一个数据

    test=[0.31, 1.51, -0.50]

    h1 = 1

    h2 = 0.1

    parzen(h1, test)

    parzen(h2, test)

    # 入口

    if __name__ == '__main__':

    main()

    除了利用parzen窗判断目标数据属于哪个类,还把这些点和目标点用pyplot展示了一下,目标点会放大效果如下

    展开全文
  • 本文旨在介绍当前被大家广为所知的超参自动优化方法,像网格搜索、随机搜索、贝叶斯优化和Hyperband,并附有相关的样例代码供大家学习。一、网格搜索(Grid Search)网格搜索是暴力...

    本文旨在介绍当前被大家广为所知的超参自动优化方法,像网格搜索、随机搜索、贝叶斯优化和Hyperband,并附有相关的样例代码供大家学习。

    一、网格搜索(Grid Search)

    网格搜索是暴力搜索,在给定超参搜索空间内,尝试所有超参组合,最后搜索出最优的超参组合。sklearn已实现该方法,使用样例如下:

    from sklearn import svm, datasets
    from sklearn.model_selection import GridSearchCV
    import pandas as pd
    
    
    # 导入数据
    iris = datasets.load_iris()
    # 定义超参搜索空间
    parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
    # 初始化模型
    svc = svm.SVC()
    # 网格搜索
    clf = GridSearchCV(estimator = svc,
                       param_grid = parameters,
                       scoring = 'accuracy',
                       n_jobs = -1,
                       cv = 5)
    clf.fit(iris.data, iris.target)
    返回:GridSearchCV(cv=5, estimator=SVC(), n_jobs=-1,
                       param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')},
                       scoring='accuracy')
    
    
    # 打印结果
    print('详细结果:\n', pd.DataFrame.from_dict(clf.cv_results_))
    print('最佳分类器:\n', clf.best_estimator_)
    print('最佳分数:\n', clf.best_score_)
    print('最佳参数:\n', clf.best_params_).
    返回:
    详细结果:
        mean_fit_time  std_fit_time  mean_score_time  std_score_time param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
    0       0.000788      0.000394         0.000194        0.000389       1  ...          0.966667               1.0         0.980000        0.016330                1
    1       0.000804      0.000402         0.000199        0.000399       1  ...          0.933333               1.0         0.966667        0.021082                4
    2       0.000593      0.000484         0.000593        0.000484      10  ...          0.966667               1.0         0.973333        0.038873                3
    3       0.000593      0.000484         0.000399        0.000489      10  ...          0.966667               1.0         0.980000        0.016330                1
    [4 rows x 15 columns]
    最佳分类器:
     SVC(C=1, kernel='linear')
    最佳分数:
    0.9800000000000001
    最佳参数:
     {'C': 1, 'kernel': 'linear'}
    

    sklearn.model_selection.GridSearchCV[1]的重要参数说明:

    • estimator: scikit-learn模型。

    • param_grid: 超参搜索空间,即超参数字典。

    • scoring: 在交叉验证中使用的评估策略。

    • n_jobs: 并行任务数,-1为使用所有CPU。

    • cv: 决定采用几折交叉验证。

    二、随机搜索(Randomized Search)

    随机搜索是在搜索空间中采样出超参组合,然后选出采样组合中最优的超参组合。随机搜索的好处如下图所示:

    图1: 网格搜索和随机搜索的对比[2]

    解释图1,如果目前我们要搜索两个参数,但参数A重要而另一个参数B并没有想象中重要,网格搜索9个参数组合(A, B),而由于模型更依赖于重要参数A,所以只有3个参数值是真正参与到最优参数的搜索工作中。反观随机搜索,随机采样9种超参组合,在重要参数A上会有9个参数值参与到搜索工作中,所以,在某些参数对模型影响较小时,使用随机搜索能让我们有更多的探索空间

    同样地,sklearn实现了随机搜索[3],样例代码如下:

    from sklearn import svm, datasets
    from sklearn.model_selection import RandomizedSearchCV
    import pandas as pd
    from scipy.stats import uniform
    
    
    
    
    # 导入数据
    iris = datasets.load_iris()
    # 定义超参搜索空间
    distributions = {'kernel':['linear', 'rbf'], 'C':uniform(loc=1, scale=9)}
    # 初始化模型
    svc = svm.SVC()
    # 网格搜索
    clf = RandomizedSearchCV(estimator = svc,
                             param_distributions = distributions,
                             n_iter = 4,
                             scoring = 'accuracy',
                             cv = 5,
                             n_jobs = -1,
                             random_state = 2021)
    clf.fit(iris.data, iris.target)
    返回:RandomizedSearchCV(cv=5, estimator=SVC(), n_iter=4, n_jobs=-1,
                             param_distributions={'C': <scipy.stats._distn_infrastructure.rv_frozen object at 0x000001F372F9A190>,
                                                  'kernel': ['linear', 'rbf']},
                             random_state=2021, scoring='accuracy')
    
    
    
    
    # 打印结果
    print('详细结果:\n', pd.DataFrame.from_dict(clf.cv_results_))
    print('最佳分类器:\n', clf.best_estimator_)
    print('最佳分数:\n', clf.best_score_)
    print('最佳参数:\n', clf.best_params_)
    返回:
    详细结果:
        mean_fit_time  std_fit_time  mean_score_time  std_score_time  param_C  ... split3_test_score split4_test_score  mean_test_score  std_test_score  rank_test_score
    0       0.000598      0.000489         0.000200        0.000400   6.4538  ...          0.966667               1.0         0.986667        0.016330                1
    1       0.000997      0.000002         0.000000        0.000000  4.99782  ...          0.966667               1.0         0.980000        0.026667                3
    2       0.000798      0.000399         0.000399        0.000488  3.81406  ...          0.966667               1.0         0.980000        0.016330                3
    3       0.000598      0.000488         0.000200        0.000399  5.36286  ...          0.966667               1.0         0.986667        0.016330                1
    [4 rows x 15 columns]
    最佳分类器:
     SVC(C=6.453804509266643)
    最佳分数:
    0.9866666666666667
    最佳参数:
     {'C': 6.453804509266643, 'kernel': 'rbf'}
    

    相比于网格搜索,sklearn随机搜索中主要改变的参数是param_distributions,负责提供超参值分布范围。

    三、贝叶斯优化(Bayesian Optimization)

    我写本文的目的主要是冲着贝叶斯优化来的,一直有所耳闻却未深入了解,所以我就来查漏补缺了。以下内容主要基于Duane Rich在《How does Bayesian optimization work?》[4]的回答。

    调优的目的是要找到一组最优的超参组合,能使目标函数f达到全局最小值。

    举个例子,若学习率设置过大,模型可能会在代价函数的全局最优点附近不断来回震荡,甚至跳出全局最优点,而设置过小,又可能会陷入局部最优,因此调学习率这一参数,是为了让模型能收敛到代价函数的全局最小值。可是在机器学习中,目标函数   常是被称作expensive blackbox function,计算开销大且不一定为凸函数。为此,贝叶斯优化出现了,它特别适合针对expensive blackbox function找到全局最优。

    假设我们的真实的目标函数   长下图这样:

    图2: 目标函数f(x)[4]

    注意: 目标函数   的   是指超参数,我们希望找到最优的超参   去得到最小的   。为什么用虚线表示   呢?因为它是黑箱函数(blackbox function)。

    现在,我们怎么找到   全局最小值点呢?我们能不能先在   上随机采样10个点,然后取它们的最小值呢?

    图3: 随机采样10个点的目标函数f(x)[4]

    图3里确实有个点挺靠近全局最优点的,那是不是在它附近再采样几个点,不断重复就行了?没那么简单,万一起始采样点在局部最小值附近,那这种方法会很容易陷入局部最优。关于“如何找到下一个合适的点”这个问题,我们先放一放,因为我们漏掉一个重点:每次尝试一种超参值   ,计算   的代价是昂贵的,为了减轻开销,贝叶斯优化采用了代理模型(surrogate model),代理模型可以被看作是一个简单模型去拟合原本复杂且不好理解的模型,简单来说,就是   计算太昂贵了,我们就用代理模型去代替它。

    贝叶斯优化使用了高斯过程(gasussian processes, GP)去构建代理模型,高斯过程的细节这里暂时不讲,有兴趣的小伙伴可以自行查阅资料了解。基于给定的输入和输出,GP会推断出一个模型(这里为代理模型)。假设我们从昂贵的   采样了4个点,然后我们把这4个点交给GP,它会返回一个代理模型,如下图所示:

    图4: 目标函数f(x)和代理模型[4]

    绿色实线就是GP猜的代理模型,绿色条带是输出分布的标准差(即为Uncertainty)。我们有了代理模型,后续我们去找下一个合适的超参值,就能带入到计算开销相对较小的代理模型中,评估给定超参值的情况。

    现在,我们来思考回之前提到的问题:"如何找到下一个合适的点?",这个问题本质是在问:“哪里有全局最小的点?”,为了解决这个问题,我们要关注两个地方:

    (1) 已开发区域: 在绿色实线上最低的超参点。因为很可能它附近存在全局最优点。

    (2) 未探索区域: 绿色实线上还未被探索的区域。比如图4,相比于0.15-0.25区间,0.65-0.75区间更具有探索价值(即该区间Uncertainty更大)。探索该区域有利于减少我们猜测的方差。

    为了实现以上探索和开发的平衡(exploration-exploitation trade-off),贝叶斯优化使用了采集函数(acquisition function),它能平衡好全局最小值的探索和开发。采集函数有很多选择,其中最常见的是expectated of improvement(EI)[5],我们先看一个utility function:

       是目前观察到的最小值,   是超参值,我们希望上述utility function输出越大越好(即找到的   能获得比当前最小值还小),基于   ,EI采集函数如下所示: 

    具有最高的EI的超参值   会被选择。EI有两部分:

    (1) 减少均值函数   ,提高EI。

    (2) 增加方差   ,提高EI。

    所以EI的提高是建立在均值和方差的trade-off,也是exploration和exploitation的trade-off。

    图5: 采集函数A(x)

    图5我们可以看到,   时EI最大,所以我们下一个超参值   应该选1。

    讲到这里,我们来看下完整的贝叶斯优化步骤是怎样的:

    图6: 贝叶斯优化-SMBO

    SMBO是简洁版的贝叶斯优化,伪代码如图6所示,具体如下:

    (1) 准备输入: expensive blackbox function    ,超参搜索空间   ,采样数据集   (超参组合   ,对应   输出值),采集函数   和用数据集   拟合的代理模型M。

    (2) 基于   和   ,采样得到数据集   。

    (3) 循环选   次参数:

    1. 用当前数据集   拟合代理模型   ,实现模型更新。

    2. 选择使采集函数   最大的超参组合   。

    3. 将   带入   中,得到输出值   。(注意这里   的计算开销大)

    4. 将新的   加入到现有数据集   中。

    目前,Hyperopt[6]开源代码库已实现基于TPE(Tree-structured Parzen Estimator Approach)的贝叶斯优化,图6我们能看到GP构建的概率模型是   ,而TPE是   和   ,关于TPE和GP的对比讨论,建议阅读论文[7]。TPE样例代码如下:

    from sklearn import svm, datasets
    from sklearn.model_selection import cross_val_score
    from hyperopt import hp, fmin, tpe, space_eval
    import pandas as pd
    
    
    # 导入数据
    iris = datasets.load_iris()
    
    
    # step1: 定义目标函数
    def objective(params):
          # 初始化模型并交叉验证
          svc = svm.SVC(**params)
          cv_scores = cross_val_score(svc, iris.data, iris.target, cv=5)
          # 返回loss = 1 - accuracy (loss必须被最小化)
          loss = 1 - cv_scores.mean()
          return loss
    
    
    # step2: 定义超参搜索空间
    space = {'kernel':hp.choice('kernel', ['linear', 'rbf']),
             'C':hp.uniform('C', 1, 10)}
    
    
    # step3: 在给定超参搜索空间下,最小化目标函数
    best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
    返回: best_loss: 0.013333333333333308(即accuracy为0.9866666666666667)
    
    
    # step4: 打印结果
    print(best)
    返回:{'C': 6.136181888987526, 'kernel': 1}(PS:kernel为0-based index,这里1指rbf)
    

    四、Hyperband

    除了格子搜索、随机搜索和贝叶斯优化,还有其它自动调参方式。例如Hyperband optimization[8],Hyperband本质上是随机搜索的一种变种,它使用早停策略和Sccessive Halving算法去分配资源,结果是Hyperband能评估更多的超参组合,同时在给定的资源预算下,比贝叶斯方法收敛更快,下图展示了Hyperband的早停和资源分配:

    图7: Hyperband的超参选择和评估

    在Hyperband之后,还出现了BOHB,它混合了贝叶斯优化和Hyperband。Hyperband和BOHB的开源代码可参考HpBandSter库[9],这里不展开细讲。

    五、总结

    上面我们用Iris鸢尾花数据集试了不同的超参自动调优方法,发现贝叶斯优化和随机搜索都比格子搜索好。从一些论文反映,贝叶斯优化是更香的,但是贝叶斯优化好像在实践中用的不是那么多,网上也有很多分享者,像Nagesh Singh Chauhan,说的那样:

    As a general rule of thumb, any time you want to optimize tuning hyperparameters, think Grid Search and Randomized Search! [10]

    Hyperparameter Optimization for Machine Learning Models - Nagesh Singh Chauhan

    为什么呢?我想原因是贝叶斯的开销太大了,前面有提到,在每次循环选超参值的时候,贝叶斯优化都需要将   带入昂贵的目标函数   中,去得到输出值y,当目标函数特别复杂时,这种情况的评估开销是很大的,更何况随着搜索空间和搜索次数的变大,计算会越发昂贵。在知乎《为什么基于贝叶斯优化的自动调参没有大范围使用?》[11]中,很多知乎主也给出了很认真的回复,建议有兴趣的朋友移步阅读。

    写这篇文章的过程中,我主要学到了2点,一是随机搜索在某些时候会比格子搜索好,二是了解贝叶斯优化的机理。这里,谈谈我比赛和个人实践中的体会,我很少会花过多时间在超参的调优上,因为它带来的收益是有限的,很多时候比起压榨模型来说,思考和挖掘数据特征能带来更多的收益,所以我想这也是为什么上面说:在任何想要调优超参时,先用格子搜索或随机搜索吧。总之,希望这篇文章对大家有帮助,我们下期再见~

    参考资料

    [1]  sklearn.model_selection.GridSearchCV, 官方文档: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

    [2] Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of machine learning research, 13(2).

    [3] sklearn.model_selection.RandomizedSearchCV, 官方文档: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV

    [4] Quora: How does Bayesian optimization work? - Duane Rich, 回答: https://www.quora.com/How-does-Bayesian-optimization-work

    [5] Bayesian Optimization (2018). - Cse.wustl.edu. 课程Note: https://www.cse.wustl.edu/~garnett/cse515t/spring_2015/files/lecture_notes/12.pdf

    [6] Hyperopt: Distributed Hyperparameter Optimization, 代码: https://github.com/hyperopt/hyperopt#getting-started

    [7] Bergstra, J., Bardenet, R., Bengio, Y., & Kégl, B. (2011, December). Algorithms for hyper-parameter optimization. In 25th annual conference on neural information processing systems (NIPS 2011) (Vol. 24). Neural Information Processing Systems Foundation.

    [8] Li, L., Jamieson, K., DeSalvo, G., Rostamizadeh, A., & Talwalkar, A. (2017). Hyperband: A novel bandit-based approach to hyperparameter optimization. The Journal of Machine Learning Research, 18(1), 6765-6816.

    [9] HpBandSter开源代码库, 代码: https://github.com/automl/HpBandSte

    [10] Hyperparameter Optimization for Machine Learning Models - Nagesh Singh Chauhan, 文章: [https://www.kdnuggets.com/2020/05/hyperparameter-optimization-machine-learning-models.html

    [11] 为什么基于贝叶斯优化的自动调参没有大范围使用?- 知乎, 问答: https://www.zhihu.com/question/33711002

    干货学习,三连

    展开全文
  • 今天我给大家总结超参自动优化方法:网格搜索、随机搜索、贝叶斯优化 和 Hyperband,并附有相关的样例代码供大家学习。喜欢简单收藏、关注、点赞。 完整资料、技术交流文末获取。 一、网格搜索(Grid Search) 网格...
  • 本文旨在介绍当前被大家广为所知的超参自动优化方法,像网格搜索、随机搜索、贝叶斯优化和Hyperband,并附有相关的样例代码供大家学习。一、网格搜索(Grid Search)网格搜索是暴力搜索,在给定超参搜索空间内,尝试...
  • mean shift

    千次阅读 2018-01-31 19:48:35
    核密度估计是一种通过非参数估计来估计变量的概率密度函数的方法,通常也被称为是Parzen窗技术。对于一维的密度函数的核密度估计公式为 , ,扩展到d维下的密度函数的估计用核密度估计时就为 ,d为x的维数,h是窗口...
  • 一文详解超参数调优方法

    千次阅读 2020-12-08 19:12:14
    ©PaperWeekly 原创 ·作者|王东伟单位|Cubiz研究方向|深度学习本文介绍超参数(hyperparameter)的调优方法。神经网络模型的参数可以分为两类:模型参数,在训...
  • 核密度估计Kernel Density Estimation(KDE)-代码详细解释

    万次阅读 多人点赞 2018-07-06 21:48:53
    解决这一问题的方法包括参数估计和非参数估计。(对于估计概率密度,如果确定数据服从的分布类型,可以使用参数拟合,否则只能使用非参数拟合) 参数估计又可分为参数回归分析和参数判别分析。在参数回归分析中,...
  • AutoML 系列 - TPE简介

    千次阅读 2020-05-19 16:20:06
    本文主要对 Tree-structured Parzen Estimator Approach (TPE) ...这里介绍一种基于这个框架的优化方法,Tree-structured Parzen Estimator Approach (TPE) TPE 该方法选择的评价标准SSS为 Expected Improvement (E.
  • 伪代码: def objective(hyperparameters): """ Returns validation score from hyperparameters """ model = Classifier(hyperparameters) validation_loss = cross_validation(model, training_data...
  • 图像分类基准的最新进展来自于现有技术的更好配置,而不是新的特征学习方法。传统上,超参数优化一直是人类的工作,因为在只有少量试验的情况下,人类的工作会非常有效。目前,计算机集群和GPU处理器可以运行更多的...
  • 本手册引入了一种新的度量方法,用于量化大量越来越复杂的数据是否会增强、降低或改变它们在特定任务中的信息内容和效用。我们提出了一种新的信息论度量,称为数据价值度量(DVM),它量化了大型异构数据集的有用...
  • 从一个高度抽象的层次上说(以伪代码的形式),我们的目标函数可以表示为: 在对最终的模型进行评价时,我们需要注意的是,不要使用测试集上的损失,因为我们只能使用一次测试集。相对地,我们对验证集上的超参数进行...
  • peig: 基于特征向量方法谱; periodogram: 基于周期图的功率谱密度估计; pmcov: 基于修正协方差方法的功率谱密度估计; pmtm: 基于MTM方法的功率谱密度估计; pmusic: 基于MUSIC算法的功率谱密度估计; pwelch...
  • 下:凸集、凸函数与凸优化,优化算法(优化器),过拟合与欠拟合,正则化&归一化、标准化,损失函数和标签等。 文章目录 概念补充(上) 1. 极大似然估计 MLE 1.1 概念 1.2 公式 1.3 计算步骤 1.4 特点及应用 2. ...
  • 在这里记录下第一篇文章~下文附有该算法详细的中文介绍,步骤,实验,matlab R2016a / python 3.7代码,以及使用到的所有数据集。欢迎大家引用~ 主动学习的样本选择策略 主动学习在训练集中已标注数据上学习得
  • INT104人工智能笔记

    千次阅读 多人点赞 2021-05-24 15:23:12
    高斯混合模型 Gaussian Mixture Model (GMM) 最大期望算法EM 评价GMM Lec11 非参数模型 非参数模型Non-parametric Modelling k-NN邻近算法(k-nearest neighbors algorithm k-NN) 样题 Parzen窗(Parzen Window)核密度...
  • pycaret的具体使用流程

    千次阅读 2021-12-30 09:46:45
    PyCaret是Python中的一个开源、低代码机器学习库,旨在减少从数据处理到模型部署的周期时间。PyCaret库只需几行代码就可以完成从准备数据到部署模型,其中包括有数据处理,模型训练,参数搜索,模型可解释性,模型...
  • 在我们的CNN方法中实现了两个分支的体系结构,其中,在种植行中获得的信息被更新为植物检测分支,并向行分支进行逆向输入,然后通过多阶段优化方法对其进行优化。在具有成年和成熟两个生长阶段的玉米种植数据集中,...
  • 从一个高度抽象的层次上说(以伪代码的形式),我们的目标函数可以表示为: defobjective(hyperparameters): """Returns validation score from hyperparameters""" model = Classifier(hyperparameters) validation...
  • 错题本 - 机器学习

    千次阅读 2020-02-22 14:11:14
    A 是一种监督式学习的方法 B 可用于多分类的问题 C 是一种生成式模型 D 支持非线性的核函数 答案:C 解析: SVM是判别式模型 SVM 支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其...
  • 传统的方法还是优化方法(optimization,只要是DL的方法都会这么一说),所以很慢。 deep learning的方法是学习一个全局函数,加速配准过程。不过一般专注于单模配准。 引言: 不同的成像技术对体内组织有不同的...
  • 完美指标应该带来 real-real 和 real-fake 曲线之间的巨大差距,以利用尽可能少的样本区分真实分布和分布。与 Wasserstein 距离相比,MMD 和 1-NN accuracy 判别真实图像和生成图像所需的样本量更少,而 RIS 在 ...
  • 自动机器学习AutoML

    千次阅读 多人点赞 2020-11-01 09:24:09
    M:是对数据集D进行拟合得到的模型,可以用来假设的模型有很多种,例如随机森林,Tree Parzen Estimators等。 常用工具 (1)hyperopt: 是一个Python库,可以用来寻找实数,离散值,条件维度等搜索空间的最佳值,几乎...
  • 在一个很是高的级别(伪代码)中,我们的目标函数应该是: def objective(hyperparameters): """Returns validation score from hyperparameters""" model = Classifier(hyperparameters) validation_loss = cross_...
  • 2018个人笔记

    2018-09-17 22:31:00
    Parzen窗法是另外一种在取值空间中进行取样估计的方法,或者说可以看作是用核函数对样本在取值空间中进行插值。Parzen窗估计方法的主题思想是固定窗口区域容积,去看有多少个样本点在里面。 核密度估计是...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
热门标签
关键字:

parzen窗方法伪代码