本文重点阐述了xgboost和lightgbm的主要参数和调参技巧,其理论部分可见集成学习,以下内容主要来自xgboostLightGBM的官方文档。

xgboost

Xgboost参数主要分为三大类:

General Parameters(通用参数):设置整体功能

Booster Parameters(提升参数):选择你每一步的booster(树or回归)

Learning Task Parameters(学习任务参数):指导优化任务的执行

General Parameters(通用参数)

  • booster [default=gbtree]

    选择每次迭代过程中需要运行的模型,一共有两种选择:gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree
  • silent [default=0]

    取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0
  • nthread [default to maximum number of threads available if not set]

    XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数

剩余两个参数是Xgboost自动指定的,无需设置。

Booster Parameters(提升参数)

虽然有两种类型的booster,但是我们这里只介绍tree。因为tree的性能比线性回归好得多,因此我们很少用线性回归。

  • eta [default=0.3]

    学习率,可以缩减每一步的权重值,使得模型更加健壮:

    典型值一般设置为:0.01-0.2

    取值范围为:[0,1]
  • gamma [default=0]

    这个指定了一个结点被分割时,所需要的最小损失函数减小的大小。这个值一般来说需要根据损失函数来调整。

    range: [0,∞]
  • max_depth [default=6]

    数的最大深度。缺省值为6

    这个可以用来控制过拟合,典型值是3-10。

    取值范围为:[1,∞]
  • min_child_weight [default=1]

    孩子节点中最小的样本权重和。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该值越大算法越保守

    取值范围为: [0,∞]
  • subsample [default=1]

    用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的冲整个样本集合中随机的抽取出50%的子样本建立树模型,这能够防止过拟合。

    取值范围为:(0,1]
  • colsample_bytree [default=1]

    在建立树时对特征采样的比例。缺省值为1

    取值范围:(0,1]
  • lambda [default=1, alias: reg_lambda]

    L2正则化。
  • alpha [default=0, alias: reg_alpha]

    L1正则化,主要用在数据维度很高的情况下,可以提高运行速度。
  • scale_pos_weight, [default=1]

    在类别高度不平衡的情况下,将参数设置大于0,可以加快收敛。

Learning Task Parameters(学习任务参数)

  • objective [ default=reg:linear ]

    定义学习任务及相应的学习目标,可选的目标函数如下:

    “reg:linear” –线性回归。

    “reg:logistic” –逻辑回归。

    “binary:logistic” –二分类的逻辑回归问题,输出为概率。

    “binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。

    “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。

    “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)

    “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。每行数据表示样本所属于每个类别的概率。

  • eval_metric [ default according to objective ]

    评估方法,主要用来验证数据,根据一个学习目标会默认分配一个评估指标

    “rmse”:均方根误差(回归任务)

    “logloss”:

    “error”

    “mlogloss”

    “merror”

    “auc”

  • seed [ default=0 ]

    随机数的种子。缺省值为0

调参方法

调参的通用方法:

选择一个相对较高的学习率。通常来说学习率设置为0.1。但是对于不同的问题可以讲学习率设置在0.05-0.3。通过交叉验证来寻找符合学习率的最佳树的个数。

当确定好学习率与最佳树的个数时,调整树的某些特定参数。比如:max_depth, min_child_weight, gamma, subsample, colsample_bytree

调整正则化参数 ,比如: lambda, alpha。这个主要是为了减少模型复杂度和提高运行速度的。适当地减少过拟合。

降低学习速率,选择最优参数

import xgboost as xgb
params={
'booster':'gbtree',
'objective': 'multi:softmax', #多分类的问题
'num_class':10, # 类别数,与 multisoftmax 并用
'gamma':0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
'max_depth':12, # 构建树的深度,越大越容易过拟合
'lambda':2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
'subsample':0.7, # 随机采样训练样本
'colsample_bytree':0.7, # 生成树时进行的列采样
'min_child_weight':3,
# 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
'silent':0 ,#设置成1则没有运行信息输出,最好是设置为0.
'eta': 0.007, # 如同学习率
'seed':1000,
'nthread':7,# cpu 线程数
#'eval_metric': 'auc'
}
model = xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds=100)
model.save_model('./model/xgb.model') # 用于存储训练出的模型
print "best best_ntree_limit",model.best_ntree_limit #Grid seach on subsample and max_features param_test1 = {
'max_depth':list(range(3,10,2)),
'min_child_weight':list(range(1,6,2))
}
"""
参数说明;
n_estimators:基学习器的个数(第一步得到)
scoring:得分排名依据,因为是越高越好,这是mean_squared_error取负 """ gsearch1 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=33, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1, seed=27),
param_grid = param_test1, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch1.fit(X,y)
print(gsearch1.cv_results_, gsearch1.best_params_, gsearch1.best_score_) #进一步探索参数max_depth,min_child_weight(前面得到最好的是{‘max_depth’: 5, ‘min_child_weight’: 1})
#Grid seach on subsample and max_features param_test2 = {
'max_depth':[4,5,6],
'min_child_weight':[0,1,2] #范围: [0,∞]
}
gsearch2 = GridSearchCV(estimator = XGBRegressor( learning_rate=0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test2, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch2.fit(X,y)
print(gsearch2.cv_results_, gsearch2.best_params_, gsearch2.best_score_)
#继续搜索参数min_child_weight {‘max_depth’: 5, ‘min_child_weight’: 2}
#Grid seach on subsample and max_features
#-3775.018211540544
param_test2b = {
'min_child_weight':[2,4,6,8]
}
gsearch2b = GridSearchCV(estimator = XGBRegressor( learning_rate=0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test2b, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch2b.fit(X,y)
print(gsearch2b.cv_results_, gsearch2b.best_params_, gsearch2b.best_score_)
#调整参数gamma,range: [0,∞],default=0
#Grid seach on subsample and max_features
#在树的叶子节点上进行进一步划分所需的最小损失。越大,算法就越保守。
param_test3 = {
'gamma':[i/10.0 for i in range(0,5)]
}
gsearch3 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=33, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test3, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
gsearch3.fit(X,y)
print(gsearch3.cv_results_, gsearch3.best_params_, gsearch3.best_score_)
#调整参数subsample,colsample_bytree
#Grid seach on subsample and max_features
param_test4 = {
'subsample':[i/10.0 for i in range(6,10)],
'colsample_bytree':[i/10.0 for i in range(6,10)]
}
gsearch4 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, n_estimators=53, max_depth=5,
min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'gpu:reg:linear', nthread=4, scale_pos_weight=1,seed=27),
param_grid = param_test4, scoring='neg_mean_squared_error',n_jobs=1,iid=False, cv=5)
a=gsearch4.fit(train[predictors],train[target])
print(a)
gsearch4.fit(X,y)
print(gsearch4.cv_results_, gsearch4.best_params_, gsearch4.best_score_)

LightGBM

LightGBM中的主要调节的参数包括核心参数、学习控制参数、IO 参数、目标参数、度量参数等。

Core Parameters(核心参数)

  • task [default=train]

    数据的用途 选择 train,predict或者convert_model(将模型文件转换成 if-else 格式):
  • objective [default=regression]

    模型的用途

    ‘regression’表示回归任务,但是使用L2损失函数。

    ‘regression_l1’:表示回归任务,但是使用L1损失函数。

    ‘huber’: 表示回归任务,但是使用huber 损失函数。

    ‘fair’: 表示回归任务,但是使用fair 损失函数。

    ‘binary’: 表示二分类任务,使用对数损失函数作为目标函数。

    ‘multiclass’: 表示多分类任务,使用softmax 函数作为目标函数。必须设置num_class 参数

    ‘multiclassova’ : 表示多分类任务,使用one-vs-all 的二分类目标函数。必须设置num_class 参数

    ‘xentropy’: 目标函数为交叉熵(同时具有可选择的线性权重)。要求标签是[0,1] 之间的数值。

    ‘xentlambda’ : 替代了参数化的cross_entropy 。要求标签是[0,1]之间的数值。
  • boosting [default=gbdt]

    给出基学习器模型算法。可以为:

    ‘gbdt’: 表示传统的梯度提升决策树。默认值为’gbdt’

    ‘rf’: 表示随机森林。

    ‘dart’: 表示带dropout 的gbdt

    goss:表示Gradient-based One-Side Sampling 的gbdt (基于梯度的单侧采样)
  • data, [default=""]

    训练数据, LightGBM 将会使用这个数据进行训练
  • valid, [default=""]

    验证/测试 数据, LightGBM 将输出这些数据的度量
  • num_iterations, [default=100]

    boosting的迭代次数。

    • 对于python/R包,该参数是被忽略的。对于python,使用train()/cv()的输入参数num_boost_round来代替。
  • learning_rate, [default=0.1]

    学习率
  • num_leaves, [default=31]

    一棵树上的叶子数。
  • tree_learner,[default=serial]

    主要用于并行学习。 默认为’serial’单台机器。
  • num_threads, [default=OpenMP_default]

    LightGBM 的线程数
  • device, [default=cpu]

    指定计算设备。默认为’cpu’。 可以为’gpu’,’cpu’。

    • 为了加快学习速度,GPU 默认使用32位浮点数来求和。你可以设置gpu_use_dp=True 来启动64位浮点数,但是它会使得训练速度降低。

Learning Control Parameters(学习控制参数)

  • max_depth, [default=-1]

    限制树模型的最大深度。如果小于0,则表示没有限制。
  • min_data_in_leaf, [default=20]

    一个叶子上数据的最小数量. 可以用来处理过拟合.
  • min_sum_hessian_in_leaf, [default=1e-3]

    一个叶子上的最小 hessian 和也就是叶节点样本权重之和的最小值), 类似于 min_data_in_leaf, 可以用来处理过拟合.
  • feature_fraction, [default=1.0]

    如果小于1.0,则lightgbm 会在每次迭代中随机选择部分特征。如0.8 表示:在每棵树训练之前选择80% 的特征来训练。
  • feature_fraction_seed, [default=2]

    feature_fraction 的随机数种子
  • bagging_fraction, [default=1]

    类似于 feature_fraction, 但是它将在不进行重采样的情况下随机选择部分数据

    • Note: 为了启用 bagging, bagging_freq 应该设置为非零值
  • bagging_freq, [default=0]

    bagging 的频率, 0 意味着禁用 bagging. k 意味着每 k 次迭代执行bagging
  • bagging_seed , [default=3]

    bagging 随机数种子
  • early_stopping_round, [default=0]

    如果一个验证集的度量在 early_stopping_round 循环中没有提升, 将停止训练
  • lambda_l1, [default=0]

    L1 正则
  • lambda_l2, [default=0]

    L2 正则
  • min_split_gain, [default=0]

    执行切分的最小增益
  • lambda_l1, [default=0]

    L1 正则
  • feature_fraction_seed, [default=2]

    feature_fraction 的随机数种子
  • feature_fraction_seed, [default=2]

    feature_fraction 的随机数种子
  • feature_fraction_seed, [default=2]

    feature_fraction 的随机数种子

IO Parameters(IO 参数)

  • max_bin, [default=255]

    表示最大的桶的数量。lightgbm 会根据它来自动压缩内存。如max_bin=255 时,则lightgbm 将使用uint8 来表示特征的每一个值。

  • min_data_in_bin, [default=3]

    表示每个桶的最小样本数。该方法可以避免出现一个桶只有一个样本的情况。

  • data_random_seed, [default=1]

    表示并行学习数据分隔中的随机数种子。默认为1它不包括特征并行。

  • output_model, [default=LightGBM_model.txt]

    表示训练中输出的模型被保存的文件的文件名。

  • input_model, [default=""]

    表示输入模型的文件的文件名。默认空字符串。对于prediction任务,该模型将用于预测数据,对于train任务,训练将从该模型继续

  • output_result, [default=LightGBM_predict_result.txt]

    prediction 任务的预测结果文件名

  • pre_partition, [default=false]

    用于并行学习(不包括功能并行). 如果为true,则不同的机器使用不同的partition 来训练。

  • is_sparse, [default=true]

    用于 enable/disable 稀疏优化. 设置 false 就禁用稀疏优化

  • two_round, [default=false]

    一个布尔值,指示是否启动两次加载。默认值为False,表示只需要进行一次加载。默认情况下,lightgbm 会将数据文件映射到内存,然后从内存加载特征,这将提供更快的数据加载速度。但是当数据文件很大时,内存可能会被耗尽。如果数据文件太大,则将它设置为True

  • save_binary, [default=1]

    表示是否将数据集(包括验证集)保存到二进制文件中。默认值为False。如果为True,则可以加快数据的加载速度。

  • verbosity, [default=1]

    表示是否输出中间信息。默认值为1。如果小于0,则仅仅输出critical 信息;如果等于0,则还会输出error,warning 信息; 如果大于0,则还会输出info 信息。

  • header, [default=false]

    如果输入数据有标识头, 则在此处设置 true

  • label , [default=""]

    表示标签列。默认为空字符串。你也可以指定一个整数,如label=0 表示第0列是标签列。你也可以为列名添加前缀,如label=prefix:label_name

  • weight , [default=""]

    一个字符串,表示样本权重列。默认为空字符串。你也可以指定一个整数,如weight=0 表示第0列是权重列。注意:它是剔除了标签列之后的索引。假如标签列为0,权重列为1,则这里weight=0。你也可以为列名添加前缀,如weight=prefix:weight_name

  • query, [default=""]

    表示query/group ID 列。

  • ignore_column , [default=""]

    表示训练中忽略的一些列,默认为空字符串。可以用数字做索引,如ignore_column=0,1,2 表示第0,1,2 列将被忽略。注意:它是剔除了标签列之后的索引。

  • categorical_feature, [default=""]

    指定category 特征的列。默认为空字符串。可以用数字做索引,如categorical_feature=0,1,2 表示第0,1,2 列将作为category 特征。注意:它是剔除了标签列之后的索引。你也可以为列名添加前缀,如categorical_feature=prefix:cat_name1,cat_name2 在categorycal 特征中,负的取值被视作缺失值。

  • predict_leaf_index[default=false]

    表示是否预测每个样本在每棵树上的叶节点编号。默认为False。在预测时,每个样本都会被分配到每棵树的某个叶子节点上。该参数就是要输出这些叶子节点的编号。该参数只用于prediction 任务。

  • bin_construct_sample_cnt [default=200000]

    表示用来构建直方图的样本的数量。默认为200000。如果数据非常稀疏,则可以设置为一个更大的值,如果设置更大的值,则会提供更好的训练效果,但是会增加数据加载时间。

  • num_iteration_predict[default=-1]

    表示在预测中使用多少棵子树。默认为-1。小于等于0表示使用模型的所有子树。该参数只用于prediction 任务。

Objective Parameters(目标参数)

  • sigmoid[default=1]

    sigmoid 函数的参数. 将用于 binary 分类 和 lambdarank。
  • scale_pos_weight[default=1]

    用于调整正样本的权重,默认值为0,用于二分类任务。
  • is_unbalance[default=false]

    指示训练数据是否均衡的。默认为True。用于二分类任务。
  • num_class[default=1]

    指示了多分类任务中的类别数量。默认为1,用于多分类任务。
  • reg_sqrt[default=false]

    一个布尔值,默认为False。如果为True,则拟合的结果为:\(\sqrt{label}\)。同时预测的结果被自动转换为:\({pred}^2\)。它用于回归任务。

Metric Parameters(度量参数)

  • metric[default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}]

    度量的指标,默认为:对于回归问题,使用l2 ;对于二分类问题,使用binary_logloss;对于lambdarank 问题,使用ndcg。如果有多个度量指标,则用逗号, 分隔。

    • ‘l1’ 或者 mean_absolute_error或者 mae或者 regression_l1: 表示绝对值损失
    • ‘l2’ 或者mean_squared_error或者 mse或者 regression_l2或者 regression:表示平方损失
    • ‘l2_root’ 或者root_mean_squared_error或者 rmse:表示开方损失
    • ‘quantile’: 表示Quantile 回归中的损失
    • ‘mape’ 或者 ‘mean_absolute_percentage_error’ :表示MAPE 损失
    • ‘map’ 或者’mean_average_precision’: 表示平均的精度
    • ‘auc’: 表示AUC
    • ‘binary_logloss’或者’binary’: 表示二类分类中的对数损失函数
    • ‘binary_error’: 表示二类分类中的分类错误率
    • ‘multi_logloss’或者 ‘multiclass’或者 ‘softmax’或者 ‘multiclassova’或者 ‘multiclass_ova’,或者’ova’或者 ‘ovr’: 表示多类分类中的对数损失函数
    • ‘multi_error’: 表示多分类中的分类错误率
    • ‘xentropy’或者’cross_entropy’: 表示交叉熵
    • ‘xentlambda’ 或者’cross_entropy_lambda’: 表示intensity 加权的交叉熵
    • ‘kldiv’或者’kullback_leibler’: 表示KL 散度
  • metric_freq[default=1]

    每隔多少次输出一次度量结果。默认为1。
  • train_metric [default=false]

    如果为True,则在训练时就输出度量结果。

调参方法

针对 leaf-wise 树的参数优化

  • num_leaves:控制了叶节点的数目。它是控制树模型复杂度的主要参数。

如果是level-wise,则该参数为\(2^{depth}\),其中\(depth\)为树的深度。但是当叶子数量相同时,leaf-wise的树要远远深过level-wise树,非常容易导致过拟合。因此应该让num_leaves小于\(2^{depth}\)。在leaf-wise树中,并不存在\(depth\)的概念。因为不存在一个从\(leaves\)到\(depth\)的合理映射。

  • min_data_in_leaf:每个叶节点的最少样本数量。它是处理leaf-wise树的过拟合的重要参数。将它设为较大的值,可以避免生成一个过深的树。但是也可能导致欠拟合。
  • max_depth: 控制了树的最大深度。该参数可以显式的限制树的深度。

针对更快的训练速度

  • 通过设置 bagging_fraction 和 bagging_freq 参数来使用 bagging 方法
  • 通过设置 feature_fraction 参数来使用特征的子抽样
  • 使用较小的 max_bin
  • 使用 save_binary 在未来的学习过程对数据加载进行加速

获取更好的准确率

  • 使用较大的 max_bin (学习速度可能变慢)
  • 使用较小的 learning_rate 和较大的 num_iterations
  • 使用较大的 num_leaves (可能导致过拟合)
  • 使用更大的训练数据
  • 尝试 dart

缓解过拟合

  • 使用较小的 max_bin
  • 使用较小的 num_leaves
  • 使用 min_data_in_leaf 和 min_sum_hessian_in_leaf
  • 通过设置 bagging_fraction 和 bagging_freq 来使用 bagging
  • 通过设置 feature_fraction 来使用特征子抽样
  • 使用更大的训练数据
  • 使用 lambda_l1, lambda_l2 和 min_gain_to_split 来使用正则
  • 尝试 max_depth 来避免生成过深的树

xgboost&lightgbm调参指南的更多相关文章

  1. xgboost 完全调参指南

    http://www.2cto.com/kf/201607/528771.html xgboost: https://www.analyticsvidhya.com/blog/2016/03/comp ...

  2. sklearn逻辑回归(Logistic Regression,LR)调参指南

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  3. 【集成学习】lightgbm调参案例

    lightgbm使用leaf_wise tree生长策略,leaf_wise_tree的优点是收敛速度快,缺点是容易过拟合. # lightgbm关键参数 # lightgbm调参方法cv 代码git ...

  4. 论XGBOOST科学调参

    XGBOOST的威力不用赘述,反正我是离不开它了. 具体XGBOOST的原理可以参见之前的文章<比XGBOOST更快--LightGBM介绍> 今天说下如何调参. bias-varianc ...

  5. LightGBM调参笔记

    本文链接:https://blog.csdn.net/u012735708/article/details/837497031. 概述在竞赛题中,我们知道XGBoost算法非常热门,是很多的比赛的大杀 ...

  6. xgboost 参数调优指南

    一.XGBoost的优势 XGBoost算法可以给预测模型带来能力的提升.当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势: 1 正则化 标准GBDT ...

  7. 自动调参库hyperopt+lightgbm 调参demo

    在此之前,调参要么网格调参,要么随机调参,要么肉眼调参.虽然调参到一定程度,进步有限,但仍然很耗精力. 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参. hyperopt 需要自己 ...

  8. LightGBM 调参方法(具体操作)

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  9. xgboost使用调参

    欢迎关注博主主页,学习python视频资源 https://blog.csdn.net/q383700092/article/details/53763328 调参后结果非常理想 from sklea ...

随机推荐

  1. EPP状态码

    服务器状态代码由您的域的注册表设置 EPP状态码 RDAP状态映射 这是什么意思? 你应该做点什么吗? addPeriod 加期 该宽限期是在域名初始注册后提供的.如果注册服务商在此期间删除了域名,则 ...

  2. uWSGI 漏洞复现(CVE-2018-7490)

    uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换.WSGI是一种Web服务器网关接口.它是一 ...

  3. Instant Messaging for Business: Your 10 Best Options

    Instant Messaging for Business: Your 10 Best Options By Iaroslav Kudritskiy It's probably not a surp ...

  4. C#规范整理·异常与自定义异常

    这里会列举在C#中处理CLR异常方面的规范,帮助大家构建和开发一个运行良好和可靠的应用系统. 前言   迄今为止,CLR异常机制让人关注最多的一点就是"效率"问题.其实,这里存在认 ...

  5. [转帖]电源ac和dc有什么区别_dc ac分别代表什么

    电源ac和dc有什么区别_dc ac分别代表什么 发表于 2017-10-28 17:18:58 电源设计应用 +关注 http://m.elecfans.com/article/571712.htm ...

  6. [转帖]Google Chrome 解决 “您的连接不是私密连接”

    Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持 自己搭建了 k8s的 dashboard 结果 chrome 最新版本的打不开了.. 百度了下 园友的解决方案很完美 这里面转 ...

  7. 1.3.1 Lock接口及其实现

    1.锁的本质 2.Lock接口使用ReentrenLock 3.读写锁使用 4.读写锁实现 Lock接口方法 有点意思的是lockInterruptibly(), 只要没有获取到锁就会一直等待,直到某 ...

  8. kubernetes--资源清单

    ⒈资源含义 k8s中所有的内容都被抽象为资源,资源实例化之后,叫做对象. ⒉资源分类 名称空间级别 仅在此名称空间下生效,k8s的系统组件是默认放在kube-system名称空间下的,而kubectl ...

  9. windows下memcache扩展安装和搭建

    ### windows下memcache扩展安装和搭建 背景:在做微信公众号的开发时,token的有效期为7200秒,所以需要对token进行保存,在这选择了memcache作为缓存工具 memcac ...

  10. PHP学习之PHP trait解析

    自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait. 众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制.trait为了减少单继承语言的限制, ...