我想比较不同的机器学习算法.作为其中的一部分,我需要能够执行网格搜索以获得最佳超参数.但是,我并没有真正想到为每个固定算法和其超参数的固定子集编写单独的网格搜索实现.相反,我希望它看起来更像是在scikit-learn中,但可能没有那么多功能(例如我不需要多个网格)并且用MATLAB编写.
到目前为止,我试图理解尚未编写的逻辑 grid_search.m
function model = grid_search(algo, data, labels, varargin)
p = inputParser;
% here comes the list of all possible hyperparameters for all algorithms
% I will just leave three for brevity
addOptional(p, 'kernel_function', {'linear'});
addOptional(p, 'rbf_sigma', {1});
addOptional(p, 'C', {1});
parse(p, algo, data, labels, varargin{:});
names = fieldnames(p.Results);
values = struct2cell(p.Results); % a cell array of cell arrays
argsize = 2 * length(names);
args = cell(1, argsize);
args(1 : 2 : argsize) = names; …Run Code Online (Sandbox Code Playgroud) 我正在使用PySpark 2.0进行Kaggle比赛。我想知道模型(RandomForest)的行为,具体取决于不同的参数。ParamGridBuilder()允许为单个参数指定不同的值,然后执行(我想)整个参数集的笛卡尔积。假设我DataFrame已经定义:
rdc = RandomForestClassifier()
pipeline = Pipeline(stages=STAGES + [rdc])
paramGrid = ParamGridBuilder().addGrid(rdc.maxDepth, [3, 10, 20])
.addGrid(rdc.minInfoGain, [0.01, 0.001])
.addGrid(rdc.numTrees, [5, 10, 20, 30])
.build()
evaluator = MulticlassClassificationEvaluator()
valid = TrainValidationSplit(estimator=pipeline,
estimatorParamMaps=paramGrid,
evaluator=evaluator,
trainRatio=0.50)
model = valid.fit(df)
result = model.bestModel.transform(df)
Run Code Online (Sandbox Code Playgroud)
好的,现在我可以使用手工功能检索简单的信息:
def evaluate(result):
predictionAndLabels = result.select("prediction", "label")
metrics = ["f1","weightedPrecision","weightedRecall","accuracy"]
for m in metrics:
evaluator = MulticlassClassificationEvaluator(metricName=m)
print(str(m) + ": " + str(evaluator.evaluate(predictionAndLabels)))
Run Code Online (Sandbox Code Playgroud)
现在我想要几件事:
print(model.validationMetrics)显示(似乎)包含每个模型准确性的列表,但是我不知道要引用哪个模型。如果我可以检索所有这些信息,则应该能够显示图形,条形图,并且可以像使用Panda和一样工作sklearn。
python machine-learning hyperparameters pyspark apache-spark-ml
我会完全承认我可能在这里设置了错误的条件空间,但是由于某种原因,我根本无法使它发挥作用。我正在尝试使用hyperopt来调整逻辑回归模型,并且取决于求解器,还需要探索其他一些参数。如果选择liblinear解算器,则可以选择惩罚,根据惩罚,您还可以选择对偶。但是,当我尝试在此搜索空间上运行hyperopt时,它一直给我一个错误,因为它通过了整个字典,如下所示。有任何想法吗?我得到的错误是'ValueError:Logistic回归仅支持liblinear,newton-cg,lbfgs和sag求解器,得到了{'solver':'sag'}'这种格式在设置随机森林搜索空间时有效,所以我米茫然。
import numpy as np
import scipy as sp
import pandas as pd
pd.options.display.max_columns = None
pd.options.display.max_rows = None
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set(style="white")
import pyodbc
import statsmodels as sm
from pandasql import sqldf
import math
from tqdm import tqdm
import pickle
from sklearn.preprocessing import RobustScaler, OneHotEncoder, MinMaxScaler
from sklearn.utils import shuffle
from sklearn.cross_validation import KFold, StratifiedKFold, cross_val_score, cross_val_predict, train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold as StratifiedKFoldIt
from sklearn.feature_selection import RFECV, …Run Code Online (Sandbox Code Playgroud) python scikit-learn logistic-regression hyperparameters hyperopt
所以,我有一个看起来像的分类器
clf = VotingClassifier(estimators=[
('nn', MLPClassifier()),
('gboost', GradientBoostingClassifier()),
('lr', LogisticRegression()),
], voting='soft')
Run Code Online (Sandbox Code Playgroud)
我想基本上调整每个估算器的超参数.
有没有办法调整分类器的这些"组合"?谢谢
python machine-learning scikit-learn hyperparameters grid-search
在卷积神经网络(CNN)中,选择滤波器用于权重共享.例如,在以下图片中,选择具有步幅(相邻神经元之间的距离)1的3×3窗口.
所以我的问题是:如何选择窗口大小?如果我使用4x4,步幅是2,它会产生多大的差异?非常感谢提前!
machine-learning deep-learning hyperparameters conv-neural-network data-science
有没有办法在对象检测API的配置文件中指定Hyperopt等超参数优化来微调模型?
object-detection hyperparameters tensorflow object-detection-api
我目前想在我拥有的简单Keras神经网络上进行超参数搜索。我目前的计划是使用sklearn GridSearchCV功能,并使用keras.utils.multi_gpu_model将其拆分到我可以访问的2个GPU中。我相信这会很好,但是可能仍需要很长时间才能完成搜索。
有没有更有效的方法可以做到这一点?我似乎无法将GridSearch中的n_jobs标志设置为-1,这将使作业并行运行,我只是无法在GPU上执行此操作?
我想在R(mlrMBO)的mlr-Package中使用基于模型的优化来调整我的超参数.这里推荐多少次迭代?我已经读过MBO中必要的迭代次数取决于超参数的数量,应该乘以某个因子?
要在不使用Keras 的情况下记录 hparams ,我正在按照此处的 tf 代码中的建议执行以下操作:
with tf.summary.create_file_writer(model_dir).as_default():
hp_learning_rate = hp.HParam("learning_rate", hp.RealInterval(0.00001, 0.1))
hp_distance_margin = hp.HParam("distance_margin", hp.RealInterval(0.1, 1.0))
hparams_list = [
hp_learning_rate,
hp_distance_margin
]
metrics_to_monitor = [
hp.Metric("metrics_standalone/auc", group="validation"),
hp.Metric("loss", group="train", display_name="training loss"),
]
hp.hparams_config(hparams=hparams_list, metrics=metrics_to_monitor)
hparams = {
hp_learning_rate: params.learning_rate,
hp_distance_margin: params.distance_margin,
}
hp.hparams(hparams)
Run Code Online (Sandbox Code Playgroud)
请注意,params这里是一个字典对象,我将传递给估算器。
然后我像往常一样训练估计器,
config = tf.estimator.RunConfig(model_dir=params.model_dir)
estimator = tf.estimator.Estimator(model_fn, params=params, config=config)
train_spec = tf.estimator.TrainSpec(...)
eval_spec = tf.estimator.EvalSpec(...)
tf.estimator.train_and_evaluate(estimator, train_spec=train_spec, eval_spec=eval_spec)
Run Code Online (Sandbox Code Playgroud)
训练后,当我启动 tensorboard 时,我确实记录了 hparams,但我没有看到任何针对它们记录的指标
我进一步确认它们在scalars页面中显示为具有相同标签名称的训练和验证 ie …
我希望为不同的神经网络配置运行一个非常大的网格搜索。就其完整性而言,使用我当前的硬件运行是不切实际的。我知道可能有比朴素网格搜索(例如随机、贝叶斯优化)更好的技术,但是我的问题是我们可以对首先包含的内容做出哪些合理的假设。具体来说,就我而言,我希望在
我有一个想法是将(1)标识的网络结构c通过运行AC网格搜索,(2)选择 c具有最低(例如MSE)误差(对测试数据集),和(3)的运行与配置网络c通过DF 上的单独网格搜索,以确定最合适的正则化策略。
在这种情况下,这是一种明智的方法,还是理论上我可以通过使用在第一次网格搜索(即 AC)中显示更高错误的网络配置来获得更低的最终错误(即在正则化之后)?
hyperparameters ×10
python ×4
scikit-learn ×3
tensorflow ×2
algorithm ×1
data-science ×1
gpu ×1
grid-search ×1
hyperopt ×1
keras ×1
matlab ×1
mlr ×1
performance ×1
pyspark ×1
r ×1
regularized ×1
tensorboard ×1