XGBoost实战与调参优化
本篇主要内容包括XGBoost的入门教学、调参优化,将之前自己遇到的问题细心的整理一遍;XGBoost参数繁多,所以如果要调参,就一定要知道每个参数的作用于意义,因此本人十分建议在实战之前对XGBoost的理论分析有一定的了解,博主在之前写过一篇XGBoost原理与实例,里面详细的介绍了XGBoost的基本原理,有兴趣的小伙伴可以先去那里观摩一番,之后再看本篇有事半功倍的效果哦!!
现简要说明下XGboost的优势:
- 正则化
- 标准的GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的
- 实际上,XBGoost以"正则化提升(regularized boosting)"技术而闻名
- 并行处理
- XGBoost可以实现并行处理,相比GBM有了速度的飞跃
- 不过,Boosting算法是顺序处理的,它怎么能并行呢?每一棵树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一棵树呢?相关解答可以参考这里
- XGBoost也支持Hadoop实现
- 高度的灵活性
- XGBoost允许用户自定义优化目标和评价标准
- 它对模型增加了一个全新的维度,所以我们的处理不会受到任何限制
- 缺失值处理
- XGBoost内置处理缺失值的规则
- 用户需要提供一个和其他样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。
- XGboost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值的处理方法
- 剪枝
- 当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法
- XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂
- 这种做法的优点是:当一个负损失(如-2)后面有一个正损失(如+10)的时候,GBM会在-2处停下来,因为它遇到了一个负值。但是XGboost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂
- 内置交叉验证
- XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数
- 而GBM使用网格搜索,只能检测有限个值
- 在已有的模型基础上继续
- XGBoost可以在上一轮的结果上继续训练。这个特性在某些特定的应用上市一个巨大的优势
- sklearn中的GBM的实现也有这个功能,两种算法在这一点上师一致的
一、XGBoost入门教学
1、XGBoosst的参数定义
XG’boost的作者将参数归纳成三种类型,分别是:
- 通用参数(Genreal parameters ):与我们所使用的booster相关,通常是树模型或线性模型,宏观上对函数进行调控。
- Booster参数(Booster parameters):根据你所选择的的booster,控制每一次迭代的参数。
- 学习任务函数(Learning task parameters):根据你的任务情况,选择不同的模型可能会有不同的参数,但它们都是控制训练任务的表现。
1.1通用参数(Genreal parameters ):
booster[default=gbtree]:
- gbtree:基于树的模型
- gblinear:线性模型
Verbosity[default=1]:
- 当这个参数的值为1时,输出模型的很多信息,这有助于帮助我们更好的理解模型,所以最好为1.
- 当这个参数为0时等价于
Silent=1
,不会输出任何信息。
nthread[默认为最大可用线程数(如果未设置)]
:- 用于运行XGBoost的并行线程数
1.2Booster参数(Booster parameters)
:
在实际使用XGboost中,gbtree
模型的性能与表现远远好于linear
模型,因此我们主要讨论下Tree Booster模型的参数。
eta[default=0.3]:
- 在
sklearn
中称为learning_rate
- 在每次迭代之后,可以直接得到每个叶子结点的权重,而使权值显小来提升模型的鲁棒性,可以防止过拟合。
- 最佳值范围:[0.01,0.2]
- 在
gamma[default=0]:
- 也称
min_split_loss
- 在树的叶节点进行进一步划分时所需的最小损失的减少值,在划分时最小损失值大于
Gamma
时,才会划分这个点,Gamma
指定了节点分裂所需的最小损失函数下降值 Gamma
值越大,算法就越保守,因此这个值是需要调节的。- 范围:[0,∞\infty∞]
- 也称
max_depth[default=6]:
- 树的最大深度,增加这个值将使模型更为复杂、并容易过拟合
- 可以使用
cv
函数调优 - 最佳值范围 :[3,10]
min_child_weight[default=1]:
- 子节点的所有样本hessian
h
的和的最小值,如果在树的划分过程中样本的h
之和的最小值小于min_child_weight
,那么不对该结点进行进一步的划分 min_child_weight
越大,算法越是保守- 这个参数需要使用
cv
函数调优
- 子节点的所有样本hessian
max_delta_step[default=0]:
- 这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守
- 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的
- 将其设置为1-10可能有助于控制更新
subsmaple[default=1]:
- 假设设置为0.5,意味着xgboost将在树的增长之前随机抽取一半的数据用于训练
- 可以防止过拟合
- 在每次提升迭代时都会采样一次
- 最佳值范围:[0.5,1]
colsample_bytree:
- 建立每一棵树的时候对样本的列(特征)进行采样,用于建立下一颗树
- 可以防止过拟合
- 在每次提升迭代时都会采样一次
- 最佳值范围:[0.5,1]
colsample_bylevel:
- 建立每一棵树的时候,对每一层的样本的列(特征)进行采样
- 可以防止过拟合
- 在每次提升迭代时都会采样一次
- 最佳值范围:[0.5,1]
lambda[default=1]:
- 也称
reg_lambda
- 权重的L2正则化项(与Ridge regression类似)
- 增加这个值可以使模型更为保守
- 也称
alpha[default=1]:
- 也称
reg_alpha
- 权重的L1正则化项(与Lasso regression类似)
- 可以产生稀疏矩阵,加快算法收敛速度
- 也称
scale_pos_weight[default=1]:
- 控制正负权重的平衡,对于不平衡类很有用
1.3学习任务函数(Learning task parameters):
objective[default=reg:linear]:
reg:linear:
线性回归reg:logistic:
逻辑回归binary:logistic:
二分类的逻辑回归,返回预测的概率(不是类别)multi:softmax:
使用softmax目标函数让XGBoost解决多分类问题,我们需要输入类别的个数multi:softprob:
与SoftMax相同,但输出一个ndata×nclass的向量,该向量可以进一步整形为ndata×nclass矩阵。结果包含属于每个类的每个数据点的预测概率。rank:pairwise:
使用lambdamart在最小化成对损失的情况下执行成对排名
base_score:
- 所有实例的初始预测得分,全局偏差
- 对于足够的迭代次数,更改此值不会产生太大的影响
eval_metric:
- 验证数据的评估指标,将根据目标分配默认指标(回归的RMSE,分类的误差,排名的平均精度)
seed[default=0]:
- 随机数的种子
2、XGBoost基本操作演示
本文采用的数据集下载地址为pima-indians-diabetes,并使用Python3语言。使用XGBoost训练模型一般有2种方法,一种是单纯的使用XGBoost内置函数训练,另一种是与sklearn结合使用,当然在调参过程中要两种兼用才能有最好效果。
建议观看本文的同时也许参考XGboost参数地址,因为本文重要的是实战,不是讲解参数含义。
2.1 单纯使用XGBoost的内置函数训练模型
单纯使用XGBoost训练的模型必须要将数据集转换成DMatrix
,我们看下DMatrix
的说明:
xgboost.DMatrix
- 在XGBoost上使用的数据矩阵
DMatrix
是XGBoost使用的内部数据结构,它针对内存效率和培训速度进行了优化。可以从numpy.array
构造DMatrix
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.cross_validation train_test_split
导入训练模型所必要的库,第四行是为了将数据集划分为训练集与测试集两部分
dataset = pd.read_csv('/Users/dd/VScode_program/Machine_leaarning/pima-indians-diabetes.csv',header=None)
dataset.rename.(columns={8:'label'},inplace=True)
dataset.head(n=5)
上面很简单,导入数据集,将最后的一列的标签更改为label
train, test = train_test_split(dataset,test_size=0.2,random_state=7)
feature_name = [x for x in train.columns if x not in ['label']]
dtrain = xgb.DMatrix(train[feature_name],label=train['label'])
dtest = xgb.DMatrix(test[feature_name],label=test['label'])
划分数据集,提取特征名字,将训练集与测试集转换成DMatrix
格式,下面看看DMatrix
的常用函数
dtrain.num_col()#获得矩阵的列数
dtrain.num_row()#获得矩阵的行数
dtrain.dtrain.get_label()#获得矩阵的标签
#自定义参数
params = {'booster':'gbtree','objective':'binary:logistic','eval_metric':'auc','gamma':0.1,'min_child_weight':1,'max_depth':5,'lambda':2,'subsample':0.7,'colsample_bytree':0.7,'colsample_bylevel':0.7,'eta':0.01,'tree_method':'exact','seed':7,'nthread':4}
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
model1 = xgb.train(params,dtrain,600,watchlist)
watchlist
是一个观察列表,它的作用是在训练的过程中也会打印出各种信息,由于在参数定义中我们定义'eval_metric':'auc'
,所以会打印出测试集与训练集的AUC
#模型保存
model1.save_model('xgb_model1')
#模型加载
model1 = xgb.Booster()
model1.load_model('xgb_model1')
保存之后有利于我们在下次使用这个模型的时候不用重新训练模型,避免不必要的跑程序,大大缩短时间,当然,在实际应用中,所保存的模型一般是已经调参好的模型
下面开始对测试集进行预测
test['pre'] = model1.predict(dtest)
test.to_csv('test_result_by_xgb_model1.csv',index=None,header=None)
我们看下结果,返回预测值为样本标签为1的概率
当然你也可以使用:
test['pred_out_trans'] = model1.predict(dtest,output_margin=True)
来返回没有经过sigmoid函数转化的值
我们可以通过get_score()
函数查看各个特征在这个模型中的重要性
#'weight':在所有树分裂过程中,使用该特征分裂的次数
model1.get_score(importance_type='weight')
#'gain':在所有树分裂过程中,使用该特征分裂的平均增益
model1.get_score(importance_type='gain')
#'cover':在所有树分裂过程中,使用该特征分裂的平均覆盖率
model1.get_score(importance_type='cover')
还有total_gain、total_cover,这里不再重复了
我们也可以用XGBoost自带的绘图函数画出各个特征的重要性,但前提是需要安装matplotlib
import matplotlib.pyplot as plt
xgb.plot_importance(model1)
若安装了graphviz,那么可以画出树图
from graphviz import Digraph
xgb.plot_tree(model1)
可能是图比较大,不是很清晰,这里不上传效果图了。
现在来看下XGBoost的交叉验证函数CV
的使用,该函数返回评估历史记录
我们依旧使用上面的自定义参数params,来看下交叉验证的作用
params = {'booster':'gbtree','objective':'binary:logistic','eval_metric':'auc','gamma':0.1,'min_child_weight':1,'max_depth':5,'lambda':2,'subsample':0.7,'colsample_bytree':0.7,'colsample_bylevel':0.7,'eta':0.01,'tree_method':'exact','seed':7,'nthread':4}cv_result = xgb.cv(params,dtrain,numnum_boost_round=3000,nfold=5,stratified=True,metrics='auc',early_stopping_rounds=60,as_pandas=True,seed =7,callbacks=[xgb.callback.early_stop(60),xgb.callback.print_evaluation(period=1,show_stdv=True)])
我们自定义的迭代次数为3000,如果在60轮内auc
都没有提升的话就停止,因此我们看到在第107次时停止了,还打印出了auc
信息。因此,cv
的一个重要使用是在调参的过程中找到最佳的迭代次数。
以上单纯的使用XGBoost的入门就介绍完了,下面介绍xgboost与sklearn结合使用的方法。
2.2 XGboost与sklearn结合使用
Scikit-Learn也有XGBoost接口用于训练模型,只是参数稍有些不同,比如说XGBoost中的eta
与sklearn中的learning_rate
是对等的,还有就是训练的数据在sklearn中是不需要转化成DMatrix
的,sklearn可以直接训练csv
格式的数据集。
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.cross_validation import train_test_split
from xgboost.sklearn import XGBClassifier
第5行就是XGBoost的sklearn接口
dataset = pd.read_csv('/Users/dd/VScode_program/Machine_leaarning/pima-indians-diabetes.csv',header=None)
dataset.rename(columns={8:'label'},inplace=True)
train, test = train_test_split(dataset,test_size=0.2,random_state=7)
feature_name = [x for x in train.columns if x not in ['label']]
与之前的一样,只是少了将数据集转换为矩阵
model2 = XGBClassifier(learning_rate=0.1,n_estimators=500,max_depth=3,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=0,min_child_weight=1.1,subsample=0.8,colsample_bytree=0.8,colsample_bylevel=0.8,reg_lambda=1,random_state=7)
定义XGBoost分类器参数
xgb_model2 = model2.fit(train[feature_name],train['label'],eval_set=[ (train[feature_name], train['label'])],eval_metric='auc',early_stopping_rounds=60)
采用sklearn的fit
函数训练模型,评估方式为AUC,eval_set
也可以写成eval_set=[ (train[feature_name], train['label']),(test[feature_name], test['label'])]
,这样就会打印出训练集与测试集的AUC
在fit中若有参数early_stopping_rounds
,则会有三个返回参数分别为:best_iteration
、best_score
、best_ntree_limit
.
使用feature_importances_
也会返回每个特征的重要性
当然我们也可以将特征的重要性用图表示出来
使用evals_result()
以字典的形式也会返回每次迭代的评估结果
#返回类别预测值
test['preds'] = xgb_model2.predict(test[feature_name])
#返回正类别的概率值
test['pred_pro'] = xgb_model2.predict_proba(test[feature_name])
至此,XGBoost的入门就结束了,下面我们看看XGBoost是怎么调参的?
二、XGBoost调参一般方法
XGBoost的调参步骤一般为:
- 选择较高的学习率(learning_rate)。一般情况下,学习率的值为0.1,但是,对于不同的问题,学习率一般会在0.01~0.3之间波动。选择对应于此学习率的理想决策树数量,我们可以用
CV
来得到理想的决策树数量。 - 对于给定的学习率和决策树数量,进行决策树特定的单数调优(max_depth,min_child_weight,gamma,subsample,colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,下面会有举例说明。
- XGBoost的正则化参数调优。(lambda、alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
- 降低学习率,增大决策树的数量,我们可以用XGBoost中的
CV
函数来这一步的工作。
导入所需要的库
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.cross_validation import train_test_split
from xgboost.sklearn import XGBClassifier
import matplotlib.pyplot as plt
from sklearn.grid_search import GridSearchCV
from sklearn import cross_validation,metrics
数据集的整理
dataset = pd.read_csv('/Users/dd/VScode_program/Machine_leaarning/pima-indians-diabetes.csv',header=None)
dataset.rename(columns={8:'label'},inplace=True)
train, test = train_test_split(dataset,test_size=0.2,random_state=7)
feature_name = [x for x in train.columns if x not in ['label']]
dtrain = xgb.DMatrix(train[feature_name],label=train['label'])
dtest = xgb.DMatrix(test[feature_name],label=test['label'])
第一步、确定学习率和tree_base参数调优
为了确定boosting
参数,我们要先给出其他参数一个初始值。一般按照如下方法取值:
max_depth
=3:这个参数一般是在1~10之间。min_child_weight
=1:若我们的数据上一个极不平衡的分类问题,我们最好选取一个比较小的值。gamma
=0:起始值可以选比较小的值,在0.1~0.2之间就可以。这个参数以后也是需要调整的。subsample,colsample_bytree
=0.8:这个是最常见的初始值了。典型值的范围一般在0.5~0.9之间。scale_pos_weight
=1:若类别极不平衡时的设置。
要知道,上面的参数值只是一个初始的估计值,后继需要调优。这里把学习率设置成0.1,然后用XBGoost的CV函数确定最佳的决策树数量。
xgb1 = XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=5000,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=0,min_child_weight=1,subsample=0.8,colsample_bytree=0.8,seed=7)
设置CV
参数
cv_result = xgb.cv(xgb1.get_xgb_params(),dtrain,num_boost_round=xgb1.get_xgb_params()['n_estimators'],nfold=5,metrics='auc',early_stopping_rounds=50,callbacks=[xgb.callback.early_stop(50),xgb.callback.print_evaluation(period=1,show_stdv=True)])
我们看到最佳的迭代次数(决策树的数量)为33时最佳.所以更改为
xgb1 = XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=33,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=0,min_child_weight=1,subsample=0.8,colsample_bytree=0.8,seed=7)
然后训练模型、测试集预测、获得AUC得分
xgb_bst1 = xgb1.fit(train[feature_name],train['label'])
test['pred'] = xgb_bst1.predict(test[feature_name])
metrics.roc_auc_score(test['label'],test['pred'])
第二步、确定max_depth和min_weight参数
我们先对这两个参数调优,因为它们对最终结果有很大的影响。首先,我们先大范围的粗调,然后再小范围的细调,接下来使用高负荷的栅格搜索了(gird search)
param_grid = {'max_depth':[1,2,3,4,5],'min_child_weight':[1,2,3,4,5]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
比较发现深度应该是最好的,但min_child_weight
的最优可能值还会大一些,所以我们有必要单独对min_child_weight
做一次栅格搜索
先将max_depth
=2
param_grid = {'min_child_weight':[5,6,7,8,9,10]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
第三步、gamma参数调优
此时的分类器参数为:
xgb1 = XGBClassifier(max_depth=2,learning_rate=0.1,n_estimators=33,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=0,min_child_weight=9,subsample=0.8,colsample_bytree=0.8,seed=7)
param_grid = {'gamma':[1,2,3,4,5,6,7,8,9]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
发现又有了提升,我们可以在精细的调调它的值,比如说
param_grid = {'gamma':[i/10.0 for i in range(10,30)]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
发现得分有了提升,至此找到了最佳的gamma
=2.1
第四步、调整subsample与colsample_bytree参数
我们现在的模型为:
xgb1 = XGBClassifier(max_depth=2,learning_rate=0.1,n_estimators=33,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=2.1,min_child_weight=9,subsample=0.8,colsample_bytree=0.8,seed=7)
param_grid = {'subsample':[i/10.0 for i in range(5,11)],'colsample_bytree':[i/10.0 for i in range(5,11)]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
发现初始值就是最佳的
第五步、调整正则化参数
param_grid = {'reg_lambda':[i/10.0 for i in range(1,11)]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
我们发现而低了,所以应该在细分一点,那么就留给以后的自己做吧!嘻嘻!
最后我们使用较低的学习率以及使用更多的决策树,可以用CV
来实现这一步骤
xgb1 = XGBClassifier(max_depth=2,learning_rate=0.01,n_estimators=5000,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=2.1,min_child_weight=9,subsample=0.8,colsample_bytree=0.8,seed=7,)
所以最佳的决策树数量为504,最终模型如下:
xgb1 = XGBClassifier(max_depth=2,learning_rate=0.01,n_estimators=504,silent=False,objective='binary:logistic',booster='gbtree',n_jobs=4,gamma=2.1,min_child_weight=9,subsample=0.8,colsample_bytree=0.8,seed=7)
至此,你可以看到模型的表现有了大幅提升,调整每个参数带来的影响更加清楚了。
在文章的末尾,我想分享两个重要的思想
- 仅仅靠参数的调整和模型的小幅优化,想要让模型的表现有个大幅度提升是不可能的。
- 要想让模型的表现有一个质的飞跃,需要依靠其他的手段,诸如,特征工程(feature egineering) ,模型组合(ensemble of model),以及堆叠(stacking)等。
XGBoost实战与调参优化相关推荐
- 人工智能框架实战精讲:Keras项目-英文语料的DNN、Word2Vec、CNN、LSTM文本分类实战与调参优化
Keras项目-英文语料的文本分类实战 一.机器学习模型 1.1 数据简介 1.2 数据读取与预处理 1.3 数据切分与逻辑回归模型构建 二.全连接神经网络模型 2.1 模型训练 2.2 模型结果展示 ...
- XGBoost 重要参数(调参使用)
XGBoost 重要参数(调参使用) 数据比赛Kaggle,天池中最常见的就是XGBoost和LightGBM. 模型是在数据比赛中尤为重要的,但是实际上,在比赛的过程中,大部分朋友在模型上花的时间却 ...
- 如何使用hyperopt对xgboost进行自动调参
本教程重点在于传授如何使用Hyperopt对xgboost进行自动调参.但是这份代码也是我一直使用的代码模板之一,所以在其他数据集上套用该模板也是十分容易的. 同时因为xgboost,lightgbm ...
- 机器学习算法总结之XGBoost(下) 实战与调参
写在前面 XGBoost原理已在前一篇有过说明:机器学习算法总结之XGBoost(上) 本文思路与之前一篇GBDT调参( 基于scikit-learn的梯度提升树GBDT调参学习)思路相同,先遍历xg ...
- 使用贝叶斯优化工具实践XGBoost回归模型调参
0. 关于调参 0.1. 超参数 在机器学习的上下文中,超参数(hyper parameters)是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据.通常情况下,需要对超参数进行优化,给学 ...
- XgBoost使用及调参教程
Kaggle比赛利器XGBboost 数据,决定了机器学习的上限,而算法,只是逼近这个上限. 简介 如果你的机器学习集成模型表现得不是那么尽如人意,那就使用XGBoost吧.XGBoost算法现在已经 ...
- 视觉模型精度如何更上一层楼?百度技术专家实战演示调参技巧
作者 | 王金许 责编 | 欧阳姝黎 出品 | CSDN(ID:CSDNnews) 随着计算机视觉的应用场景拓展得愈加广泛,与此同时,AI开发者对企业级视觉模型开发的精度与推理速度也更加关 ...
- 【Yolact训练自己的数据从实战到调参】
100%完美运行,期间踩过许多坑,数据集的坑.代码的坑都有.现在做一下总结,也希望后来者能快速上手,避免浪费不必要的时间. 文章目录 一.训练自己的数据与预测 1.训练自己的数据train.py 1. ...
- Darknet官方文档(含Yolo-V2和V3在win和Linux训练测试步骤、计算mAP、调参优化等)
GitHub原文:https://github.com/AlexeyAB/darknet#how-to-compile-on-linux Yolo-v3 and Yolo-v2 for Windows ...
最新文章
- python写出表白_用Python写一个简单的表白-Go语言中文社区
- 年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关
- windows codeblocks clang 3.7.0
- 【风控模型】神经网络DNN算法构建信用评分卡模型
- 用顺序栈实现十进制向二进制转化
- python指定变量类型_Python#160;变量类型_python教程
- Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene
- 使用RN开发App,引入图标失效问题的解决
- Java面试题--shiro
- 北京环球度假区宣布首批21家旅游渠道官方授权合作伙伴
- 浅析计算机用户身份识别技术,浅谈网络安全之身份认证技术
- gromacs 安装_GROMACS简介与安装
- 逆向app - 简单apk工具的安装
- 2018年专业技术人员权益保护-测试题答案
- Echarts 漏斗图
- MySQL中的auto_increment
- 均值,期望,方差,标准差,协方差
- 今天nba预测分析_NBA情报预测分析_NBA足球俱乐部 - 全球体育网
- 适合零基础学习者的Java学习路线图到底长啥样?一篇文章带你学会Java
- 微信公众号可以改名称了,只限个人订阅号!
热门文章
- Deno + Oak 构建酷炫的 Todo API
- 面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题
- ​​​​​​​ Centos7.6上用Cockpit安装oVirt
- Spring Security MVC登录注销示例教程
- 从厕所排队引发的产品设计方案思考
- Windows环境下多个tomcat启动方法
- CCF 201503-2 数字排序
- 现在以及未来 互联网名词记录
- 【Java】兔子问题
- 【Python】基本统计值计算