当前位置: 首页 > news >正文

免费的写作网站服装网站建设平台

免费的写作网站,服装网站建设平台,如何识别html5网站,中国石化工程建设公司网站这篇文章相当长#xff0c;您可以添加至收藏夹#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么#xff0c;什么是超参数优化呢#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集… 这篇文章相当长您可以添加至收藏夹以便在后续有空时候悠闲地阅读。 有了优秀的模型就有了优化超参数以获得最佳得分模型的难题。那么什么是超参数优化呢假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集你直接应⽤⼀个模型然后得到结 果。模型在这⾥的参数被称为超参数即控制模型训练/拟合过程的参数。如果我们⽤ SGD 训练线性回归模型的参数是斜率和偏差超参数是学习率。你会发现我在本章和本书中交替使⽤这些术语。假设模型中有三个参数 a、b、c所有这些参数都可以是 1 到 10 之间的整数。这些参数 的 正确 组合将为您提供最佳结果。因此这就有点像⼀个装有三拨密码锁的⼿提箱。不过三拨密码锁只有⼀个正确答案。⽽模型有很多正确答案。那么如何找到最佳参数呢⼀种⽅法是对所有组合进⾏评估看哪种组合能提⾼指标。让我们看看如何做到这⼀点。 best_accuracy 0 best_parameters {a: 0, b: 0, c: 0} for a in range(1, 11):for b in range(1, 11):for c in range(1, 11):model MODEL(a, b, c)model.fit(training_data)preds model.predict(validation_data)accuracy metrics.accuracy_score(targets, preds)if accuracy best_accuracy:best_accuracy accuracybest_parameters[a] abest_parameters[b] bbest_parameters[c] c 在上述代码中我们从 1 到 10 对所有参数进⾏了拟合。因此我们总共要对模型进⾏ 1000 次10 x 10 x 10拟合。这可能会很昂贵因为模型的训练需要很⻓时间。不过在这种情况下应 该没问题但在现实世界中并不是只有三个参数每个参数也不是只有⼗个值。 ⼤多数模型参 数都是实数不同参数的组合可以是⽆限的。 让我们看看 scikit-learn 的随机森林模型。 RandomForestClassifier(n_estimators100,criteriongini,max_depthNone,min_samples_split2,min_samples_leaf1,min_weight_fraction_leaf0.0,max_featuresauto,max_leaf_nodesNone,min_impurity_decrease0.0,min_impurity_splitNone,bootstrapTrue,oob_scoreFalse,n_jobsNone,random_stateNone,verbose0,warm_startFalse,class_weightNone,ccp_alpha0.0,max_samplesNone,) 有 19 个参数⽽所有这些参数的所有组合以及它们可以承担的所有值都将是⽆穷⽆尽的。通常情况下我们没有⾜够的资源和时间来做这件事。因此我们指定了⼀个参数⽹格。在这个⽹格上寻找最佳参数组合的搜索称为⽹格搜索。我们可以说n_estimators 可以是 100、200、250、300、400、500max_depth 可以是 1、2、5、7、11、15criterion 可以是 gini 或 entropy。这些参数看起来并不多但如果数据集过⼤计算起来会耗费⼤量时间。我们可以像之前⼀样创建三个 for 循环并在验证集上计算得分这样就能实现⽹格搜索。还必须注意的是如果要进⾏ k 折交叉验证则需要更多的循环这意味着需要更多的时间来找到完美的参数。因此⽹格搜索并不流⾏。让我们以根据 ⼿机配置预测⼿机价格范围 数据集为例看看它是如何实现的。 图 1 ⼿机配置预测⼿机价格范围数据集展⽰ 训练集中只有 2000 个样本。我们可以轻松地使⽤分层 kfold 和准确率作为评估指标。我们将使⽤ 具有上述参数范围的随机森林模型并在下⾯的⽰例中了解如何进⾏⽹格搜索。 # rf_grid_search.py import numpy as np import pandas as pd from sklearn import ensemble from sklearn import metrics from sklearn import model_selectionif __name__ __main__:df pd.read_csv(./input/mobile_train.csv)X df.drop(price_range, axis1).valuesy df.price_range.valuesclassifier ensemble.RandomForestClassifier(n_jobs-1)param_grid {n_estimators: [100, 200, 250, 300, 400, 500],max_depth: [1, 2, 5, 7, 11, 15],criterion: [gini, entropy]}model model_selection.GridSearchCV(estimatorclassifier,param_gridparam_grid,scoringaccuracy,verbose10,n_jobs1,cv5)model.fit(X, y)print(fBest score: {model.best_score_})print(Best parameters set:)best_parameters model.best_estimator_.get_params()for param_name in sorted(param_grid.keys()):print(f\t{param_name}: {best_parameters[param_name]}) 这⾥打印了很多内容让我们看看最后⼏⾏。 [ CV ] criterion entropy , max_depth 15 , n_estimators 500 , score 0.895 , total 1.0 s [ CV ] criterion entropy , max_depth 15 , n_estimators 500 ............... [ CV ] criterion entropy , max_depth 15 , n_estimators 500 , score 0.890 , total 1.1 s [ CV ] criterion entropy , max_depth 15 , n_estimators 500 ............... [ CV ] criterion entropy , max_depth 15 , n_estimators 500 , score 0.910 , total 1.1 s [ CV ] criterion entropy , max_depth 15 , n_estimators 500 ............... [ CV ] criterion entropy , max_depth 15 , n_estimators 500 , score 0.880 , total 1.1 s [ CV ] criterion entropy , max_depth 15 , n_estimators 500 ............... [ CV ] criterion entropy , max_depth 15 , n_estimators 500 , score 0.870 , total 1.1 s [ Parallel ( n_jobs 1 )]: Done 360 out of 360 | elapsed : 3.7 min finished Best score : 0.889 Best parameters set : criterion : entropy max_depth : 15 n_estimators : 500 最后我们可以看到5折交叉检验最佳得分是 0.889我们的⽹格搜索得到了最佳参数。我们可 以使⽤的下⼀个最佳⽅法是 随机搜索 。在随机搜索中我们随机选择⼀个参数组合然后计算交 叉验证得分。这⾥消耗的时间⽐⽹格搜索少因为我们不对所有不同的参数组合进⾏评估。我们 选择要对模型进⾏多少次评估这就决定了搜索所需的时间。代码与上⾯的差别不⼤。除了GridSearchCV 外我们使⽤ RandomizedSearchCV。 if __name__ __main__:classifier ensemble.RandomForestClassifier(n_jobs-1)param_grid {n_estimators: np.arange(100, 1500, 100),max_depth: np.arange(1, 31),criterion: [gini, entropy]}model model_selection.RandomizedSearchCV(estimatorclassifier,param_distributionsparam_grid,n_iter20,scoringaccuracy,verbose10,n_jobs1,cv5)model.fit(X, y)print(fBest score: {model.best_score_})print(Best parameters set:)best_parameters model.best_estimator_.get_params()for param_name in sorted(param_grid.keys()):print(f\t{param_name}: {best_parameters[param_name]}) 我们更改了随机搜索的参数⽹格结果似乎有了些许改进。 Best score : 0.8905 Best parameters set : criterion : entropy max_depth : 25 n_estimators : 300 如果迭代次数较少随机搜索⽐⽹格搜索更快。使⽤这两种⽅法你可以为各种模型找到最优参 数只要它们有拟合和预测功能这也是 scikit-learn 的标准。有时你可能想使⽤管道。例如假设我们正在处理⼀个多类分类问题。在这个问题中训练数据由两列⽂本组成你需要建⽴⼀个模型来预测类别。让我们假设你选择的管道是⾸先以半监督的⽅式应⽤ tf-idf然后使⽤SVD 和SVM 分类器。现在的问题是我们必须选择 SVD 的成分还需要调整 SVM 的参数。下⾯的代段展⽰了如何做到这⼀点。 import numpy as np import pandas as pd from sklearn import metrics from sklearn import model_selection from sklearn import pipeline from sklearn.decomposition import TruncatedSVD from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.preprocessing import StandardScaler from sklearn.svm import SVCdef quadratic_weighted_kappa(y_true, y_pred):return metrics.cohen_kappa_score(y_true, y_pred, weightsquadratic)if __name__ __main__:train pd.read_csv(./input/train.csv)idx test.id.values.astype(int)train train.drop(id, axis1)test test.drop(id, axis1)y train.relevance.valuestraindata list(train.apply(lambda x:%s %s % (x[text1], x[text2]), axis1))testdata list(test.apply(lambda x:%s %s % (x[text1], x[text2]), axis1))tfv TfidfVectorizer(min_df3,max_featuresNone,strip_accentsunicode,analyzerword,token_patternr\w{1,},ngram_range(1, 3),use_idf1,smooth_idf1,sublinear_tf1,stop_wordsenglish)tfv.fit(traindata)X tfv.transform(traindata)X_test tfv.transform(testdata)svd TruncatedSVD()scl StandardScaler()svm_model SVC()clf pipeline.Pipeline([(svd, svd),(scl, scl),(svm, svm_model)])param_grid {svd__n_components: [200, 300],svm__C: [10, 12]}kappa_scorer metrics.make_scorer(quadratic_weighted_kappa,greater_is_betterTrue)model model_selection.GridSearchCV(estimatorclf,param_gridparam_grid,scoringkappa_scorer,verbose10,n_jobs-1,refitTrue,cv5)model.fit(X, y)print(Best score: %0.3f % model.best_score_)print(Best parameters set:)best_parameters model.best_estimator_.get_params()for param_name in sorted(param_grid.keys()):print(\t%s: %r % (param_name, best_parameters[param_name]))best_model model.best_estimator_best_model.fit(X, y)preds best_model.predict(X_test) 这⾥显⽰的管道包括 SVD奇异值分解、标准缩放和 SVM⽀持向量机模型。请注意由于没有训练数据您⽆法按原样运⾏上述代码。当我们进⼊⾼级超参数优化技术时我们可以使⽤ 不同类型的 最⼩化算法 来研究函数的最⼩化。这可以通过使⽤多种最⼩化函数来实现如下坡单 纯形算法、内尔德-梅德优化算法、使⽤⻉叶斯技术和⾼斯过程寻找最优参数或使⽤遗传算法。 我将在 集合与堆叠ensembling and stacking ⼀章中详细介绍下坡单纯形算法和 NelderMead 算法的应⽤。⾸先让我们看看⾼斯过程如何⽤于超参数优化。这类算法需要⼀个可以优化的函数。⼤多数情况下都是最⼩化这个函数就像我们最⼩化损失⼀样。因此⽐⽅说你想找到最佳参数以获得最佳准确度显然准确度越⾼越好。现在我们不能最⼩化精确度但我们可以将精确度乘以-1。这样我们是在最⼩化精确度的负值但事实上我们是在最⼤化精确度。 在⾼斯过程中使⽤⻉叶斯优化可以使⽤ scikit-optimize (skopt) 库中的 gp_minimize 函数。让我们看看如何使⽤该函数调整随机森林模型的参数。 # rf_gp_minimize.py import numpy as np import pandas as pd from functools import partial from sklearn import ensemble from sklearn import metrics from sklearn import model_selection from skopt import gp_minimize from skopt import spacedef optimize(params, param_names, x, y):params dict(zip(param_names, params))model ensemble.RandomForestClassifier(**params)kf model_selection.StratifiedKFold(n_splits5)accuracies []for idx in kf.split(Xx, yy):train_idx, test_idx idx[0], idx[1]xtrain x[train_idx]ytrain y[train_idx]xtest x[test_idx]ytest y[test_idx]model.fit(xtrain, ytrain)preds model.predict(xtest)fold_accuracy metrics.accuracy_score(ytest, preds)accuracies.append(fold_accuracy)return -1 * np.mean(accuracies)if __name__ __main__:df pd.read_csv(./input/mobile_train.csv)X df.drop(price_range, axis1).valuesy df.price_range.valuesparam_space [space.Integer(3, 15, namemax_depth),space.Integer(100, 1500, namen_estimators),space.Categorical([gini, entropy], namecriterion),space.Real(0.01, 1, prioruniform, namemax_features)]param_names [max_depth,n_estimators,criterion,max_features]optimization_function partial(optimize,param_namesparam_names,xX,yy)result gp_minimize(optimization_function,dimensionsparam_space,n_calls15,n_random_starts10,verbose10)best_params dict(zip(param_names,result.x))print(best_params) 这同样会产⽣⼤量输出最后⼀部分如下所⽰。 Iteration No : 14 started . Searching for the next optimal point . Iteration No : 14 ended . Search finished for the next optimal point . Time taken : 4.7793 Function value obtained : - 0.9075 Current minimum : - 0.9075 Iteration No : 15 started . Searching for the next optimal point . Iteration No : 15 ended . Search finished for the next optimal point . Time taken : 49.4186 Function value obtained : - 0.9075 Current minimum : - 0.9075 { max_depth : 12 , n_estimators : 100 , criterion : entropy , max_features : 1.0 } 看来我们已经成功突破了 0.90的准确率。这真是太神奇了 我们还可以通过以下代码段查看绘制我们是如何实现收敛的。 from skopt . plots import plot_convergence plot_convergence ( result ) 收敛图如图 2 所⽰。 图 2随机森林参数优化的收敛图 Scikit- optimize 就是这样⼀个库。 hyperopt 使⽤树状结构帕岑估计器TPE来找到最优参数。请看下⾯的代码⽚段我在使⽤ hyperopt 时对之前的代码做了最⼩的改动。 import numpy as np import pandas as pd from functools import partial from sklearn import ensemble from sklearn import metrics from sklearn import model_selection from hyperopt import hp, fmin, tpe, Trials from hyperopt.pyll.base import scopedef optimize(params, x, y):model ensemble.RandomForestClassifier(**params)kf model_selection.StratifiedKFold(n_splits5)accuracies []for idx in kf.split(Xx, yy):train_idx, test_idx idx[0], idx[1]xtrain x[train_idx]ytrain y[train_idx]xtest x[test_idx]ytest y[test_idx]model.fit(xtrain, ytrain)preds model.predict(xtest)fold_accuracy metrics.accuracy_score(ytest, preds)accuracies.append(fold_accuracy)return -1 * np.mean(accuracies)if __name__ __main__:df pd.read_csv(./input/mobile_train.csv)X df.drop(price_range, axis1).valuesy df.price_range.valuesparam_space {max_depth: scope.int(hp.quniform(max_depth, 1, 15, 1)),n_estimators: scope.int(hp.quniform(n_estimators, 100, 1500, 1)),criterion: hp.choice(criterion, [gini, entropy]),max_features: hp.uniform(max_features, 0, 1)}optimization_function partial(optimize,xX,yy)trials Trials()hopt fmin(fnoptimization_function,spaceparam_space,algotpe.suggest,max_evals15,trialstrials)print(hopt) 正如你所看到的这与之前的代码并⽆太⼤区别。你必须以不同的格式定义参数空间还需要改 变实际优化部分⽤ hyperopt 代替 gp_minimize。结果相当不错 ❯ python rf_hyperopt . py 100 %| ██████████████████ | 15 / 15 [ 0 4 : 38 0 0 : 0 0 , 18.57 s / trial , best loss : - 0.9095000000000001 ] { criterion : 1 , max_depth : 11.0 , max_features : 0.821163568049807 , n_estimators : 806.0 } 我们得到了⽐以前更好的准确度和⼀组可以使⽤的参数。请注意最终结果中的标准是 1。这意味着选择了 1即熵。 上述调整超参数的⽅法是最常⻅的⼏乎适⽤于所有模型线性回归、逻辑回归、基于树的⽅法、梯度提升模型如 xgboost、lightgbm甚⾄神经⽹络 虽然这些⽅法已经存在但学习时必须从⼿动调整超参数开始即⼿⼯调整。⼿动调整可以帮助 你学习基础知识例如在梯度提升中当你增加深度时你应该降低学习率。如果使⽤⾃动⼯ 具就⽆法学习到这⼀点。请参考下表了解应如何调整。RS* 表⽰随机搜索应该更好. ⼀旦你能更好地⼿动调整参数你甚⾄可能不需要任何⾃动超参数调整。创建⼤型模型或引⼊⼤ 量特征时也容易造成训练数据的过度拟合。为避免过度拟合需要在训练数据特征中引⼊噪声 或对代价函数进⾏惩罚。这种惩罚称为 正则化 有助于泛化模型。在线性模型中最常⻅的正则 化类型是 L1 和 L2。L1 也称为 Lasso 回归L2 称为 Ridge 回归。说到神经⽹络我们会使⽤ dropout、添加增强、噪声等⽅法对模型进⾏正则化。利⽤超参数优化还可以找到正确的惩罚⽅法。
http://www.hkea.cn/news/14593728/

相关文章:

  • 网站qq临时会话代码主播网站怎么建设
  • 温州建设工程信息网站网络营销软件哪个好用
  • 免费网站建设多少钱怎么查询企业邮箱账号
  • 零库存品牌童装杭州网站建设企业网站策划书
  • 建设单位到江川区住房和城乡建设局网站苏州网站优化排名推广
  • 注册免费微网站广州室内装修设计
  • 怎么样推广自己的网站网络网站建设10大指标
  • 怎么查询网站是否收录wordpress建站费用
  • 网站放音乐代码网站建设投标方案
  • 最新互联网项目平台网站wordpress 判断页面id
  • 网站开发员一月多少工资win7做系统网站哪个好
  • 林州网站建设制作做网站项目计划书
  • 比较大的做网站的公司推广计划书范文
  • 人与狗做的网站谁有那个网站的公众后推广做的好
  • 广西城乡住房建设厅网站中讯科技-运城网站建设
  • 网站建设开票多少个点长沙网站网站建设
  • 厦门网站推广怎么为一个网站做外链
  • 网站模板下载 免费c mvc网站开发实例教程
  • 深圳线运营是网站建设提升学历报名入口
  • 网站改版是什么建筑工程公司有哪些岗位
  • wordpress带轮播企业站主题网站建设风险管理
  • app与微网站的区别是什么意思重庆市特种作业证报名
  • 做情网站服务器做网站好
  • 静海网站建设西宁做网站的公司捌君博力请
  • 邢台在百度上做个网站网站建站建设上海黔文信息科技有限公司30
  • 定制网站温州网站制作建设
  • wordpress短代码开发怎样建设网站优化
  • 国外注册公司流程及费用seo关键词怎么优化
  • 传统网站与营销型网站昆明建设局官方网站
  • 直接在原备案号下增加新网站白云免费网站建设