Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scikit learn 加速预测_Scikit Learn - Fatal编程技术网

Scikit learn 加速预测

Scikit learn 加速预测,scikit-learn,Scikit Learn,使用5个特征和3000个样本(使用默认参数)创建的SVM模型进行预测所需的时间(超过1小时)出乎意料地长,其中5个特征和100000个样本。有没有办法加速预测 因为特征的数量相对较少,我将从减少惩罚参数开始。它控制对序列数据中错误标记样本的惩罚,并且由于您的数据包含5个特征,我猜它不是完全线性可分的 通常,此参数(C)允许分类器具有更高的精度(有关更多信息,请参阅) 默认情况下,C=1.0。从svm=SVC(C=0.1)开始,看看它是如何运行的。由于功能的数量相对较少,我将从减少惩罚参数开始。它

使用5个特征和3000个样本(使用默认参数)创建的SVM模型进行预测所需的时间(超过1小时)出乎意料地长,其中5个特征和100000个样本。有没有办法加速预测

因为特征的数量相对较少,我将从减少惩罚参数开始。它控制对序列数据中错误标记样本的惩罚,并且由于您的数据包含5个特征,我猜它不是完全线性可分的

通常,此参数(
C
)允许分类器具有更高的精度(有关更多信息,请参阅)


默认情况下,
C=1.0
。从svm=SVC(C=0.1)开始,看看它是如何运行的。

由于功能的数量相对较少,我将从减少惩罚参数开始。它控制对序列数据中错误标记样本的惩罚,并且由于您的数据包含5个特征,我猜它不是完全线性可分的

通常,此参数(
C
)允许分类器具有更高的精度(有关更多信息,请参阅)


默认情况下,
C=1.0
。从<代码> SVM = SVC(C=0.1)< /代码>看它是如何运行的。

这里要考虑的几个问题:

  • 你把你的输入矩阵X标准化了吗?SVM不是尺度不变性的,因此如果算法在没有适当尺度的情况下接受大量原始输入,则很难进行分类

  • 参数
    C
    的选择:较高的
    C
    允许更复杂的非光滑决策边界,并且在这种复杂性下需要更多的时间来适应。因此,将值
    C
    从默认值1减小到一个较低的值可以加快该过程

  • 还建议选择适当的值
    gamma
    。这可以通过网格搜索交叉验证来完成

  • 下面是执行网格搜索交叉验证的代码。为了简单起见,我忽略了这里的测试集

    import numpy as np
    from sklearn.datasets import make_classification
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC
    from sklearn.pipeline import make_pipeline
    from sklearn.grid_search import GridSearchCV
    from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer
    
    # generate some artificial data
    X, y = make_classification(n_samples=3000, n_features=5, weights=[0.1, 0.9])
    
    # make a pipeline for convenience
    pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))
    
    # set up parameter space, we want to tune SVC params C and gamma
    # the range below is 10^(-5) to 1 for C and 0.01 to 100 for gamma
    param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))
    
    # choose your customized scoring function, popular choices are f1_score, accuracy_score, recall_score, roc_auc_score
    my_scorer = make_scorer(roc_auc_score, greater_is_better=True)
    # construct grid search
    gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)
    gscv.fit(X, y)
    # what's the best estimator
    gscv.best_params_
    
    Out[20]: {'svc__C': 1.0, 'svc__gamma': 0.21544346900318834}
    
    # what's the best score, in our case, roc_auc_score
    gscv.best_score_
    
    Out[22]: 0.86819366014152421
    
    注意:SVC的运行速度仍然不是很快。计算50个可能的参数组合需要40多秒

    %time gscv.fit(X, y)
    CPU times: user 42.6 s, sys: 959 ms, total: 43.6 s
    Wall time: 43.6 s
    

    <>这里要考虑的几个问题:

  • 你把你的输入矩阵X标准化了吗?SVM不是尺度不变性的,因此如果算法在没有适当尺度的情况下接受大量原始输入,则很难进行分类

  • 参数
    C
    的选择:较高的
    C
    允许更复杂的非光滑决策边界,并且在这种复杂性下需要更多的时间来适应。因此,将值
    C
    从默认值1减小到一个较低的值可以加快该过程

  • 还建议选择适当的值
    gamma
    。这可以通过网格搜索交叉验证来完成

  • 下面是执行网格搜索交叉验证的代码。为了简单起见,我忽略了这里的测试集

    import numpy as np
    from sklearn.datasets import make_classification
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC
    from sklearn.pipeline import make_pipeline
    from sklearn.grid_search import GridSearchCV
    from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer
    
    # generate some artificial data
    X, y = make_classification(n_samples=3000, n_features=5, weights=[0.1, 0.9])
    
    # make a pipeline for convenience
    pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))
    
    # set up parameter space, we want to tune SVC params C and gamma
    # the range below is 10^(-5) to 1 for C and 0.01 to 100 for gamma
    param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))
    
    # choose your customized scoring function, popular choices are f1_score, accuracy_score, recall_score, roc_auc_score
    my_scorer = make_scorer(roc_auc_score, greater_is_better=True)
    # construct grid search
    gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)
    gscv.fit(X, y)
    # what's the best estimator
    gscv.best_params_
    
    Out[20]: {'svc__C': 1.0, 'svc__gamma': 0.21544346900318834}
    
    # what's the best score, in our case, roc_auc_score
    gscv.best_score_
    
    Out[22]: 0.86819366014152421
    
    注意:SVC的运行速度仍然不是很快。计算50个可能的参数组合需要40多秒

    %time gscv.fit(X, y)
    CPU times: user 42.6 s, sys: 959 ms, total: 43.6 s
    Wall time: 43.6 s
    

    一个原因可能是参数
    gamma
    不同

    默认情况下,
    sklearn.svm.SVC
    使用RBF核,
    gamma
    为0.0,在这种情况下,将使用1/n_特征。因此,给定不同数量的特征,
    gamma
    是不同的


    就建议而言,我同意。

    一个原因可能是参数
    gamma
    不同

    默认情况下,
    sklearn.svm.SVC
    使用RBF核,
    gamma
    为0.0,在这种情况下,将使用1/n_特征。因此,给定不同数量的特征,
    gamma
    是不同的


    就建议而言,我同意。

    其他分类器的情况并非如此,例如随机林,所以我要问。有趣的是……您使用的惩罚参数C是哪一个?@omerbp我不知道-我只是使用了clf=SVC();clf.fit(X,y);和clf.predict()@Borys我修改了我的答案,加入了一些代码来演示如何使用网格搜索交叉验证为
    SVC
    algo选择最佳参数。如果你觉得这有帮助,请接受我的答案并投票表决。非常感谢。:)其他分类器的情况并非如此,例如随机林,所以我要问。有趣的是……您使用的惩罚参数C是哪一个?@omerbp我不知道-我只是使用了clf=SVC();clf.fit(X,y);和clf.predict()@Borys我修改了我的答案,加入了一些代码来演示如何使用网格搜索交叉验证为
    SVC
    algo选择最佳参数。如果你觉得这有帮助,请接受我的答案并投票表决。非常感谢。:)谢谢你的回答。您能告诉我如何通过网格搜索交叉验证使用gamma吗?@Borys@yangjie,Jianxun Li我试图使用您的解决方案获取DT分类器的参数。但是,我得到了以下错误:ValueError:估计器管道的参数max_depth无效。它对不同的分类器不起作用吗?@Borys如果您想指定管道中某个特定步骤的参数,您需要使用以下语法
    \u
    ,其中有一个
    双下划线来链接这两个部分。对于您看到的错误,请尝试以下
    “decisiontreeclassifier\uuu max\u depth”:np.array([1,2,3,4,5])
    @yangjie我在与多类一起使用时出错。我如何才能使它与多类案件的工作?谢谢你的回答。您能告诉我如何通过网格搜索交叉验证使用gamma吗?@Borys@yangjie,Jianxun Li我试图使用您的解决方案获取DT分类器的参数。但是,我得到了以下错误:ValueError:估计器管道的参数max_depth无效。它对不同的分类器不起作用吗?@Borys如果您想指定管道中某个特定步骤的参数,您需要使用以下语法
    \u
    ,其中有一个
    双下划线来链接这两个部分。对于您看到的错误,请尝试此
    'decision