sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)
n_estimators:
森林中数的个数。
这个属性是典型的模型表现与模型效率成反比的影响因子,即便如此,应该尽可能提高这个数字
,以让模型更准确更稳定。
criterion :
度量分裂的标准。
可选值:“mse”
,均方差(mean squared error);“mae”
,平均绝对值误差(mean absolute error)
支持的标准是基尼杂质的“gini(基尼)”
和信息增益的“entropy(熵)”
。注意:此参数是特定于树的。
max_features :
寻找最佳分裂点时考虑的特征数目。
可选值,int
(具体的数目),float
(数目的百分比),string(“auto”, “sqrt”,“log2”)
.
这一属性是对单个树来设置的,通常来讲,这个值越大单棵树可以考虑的属性越多,则模型的表现就越好
。但是这也不是肯定的,不过有一点是肯定的,增加这个值会导致算法运行速度变慢,所以需要我们考虑去达到一个平衡。
max_depth :
树的最大深度
integer或者None。树的最大深度,如果None,节点扩展直到所有叶子是纯的或者所有叶子节点包含的样例数小于min_samples_split
min_samples_split :
分裂内部节点需要的最少样例数,默认值是2。
int(具体数目),float(数目的百分比)
min_samples_leaf :
叶子节点上应有的最少样例数,默认值是1。
int(具体数目),float(数目的百分比)。
更少的节点数使得模型更容易遭受noise data的影响。
max_leaf_nodes :
最大叶子节点数。
以”最优优先方式”(best-first fashion),最优节点定义为:纯度的相对减少.如果None则不限制叶子节点个数;[float]
min_impurity_split :
树增长提前结束的阈值。
对于当前节点,大于这个阈值将分裂,否则就看做叶子节点; [float]
min_impurity_decrease :
一个阈值,表示一个节点分裂的条件是:如果这次分裂纯度的减少大于等于这这个值.
bootstrap :
构建数是不是采用有放回样本的方式(bootstrap samples); [True/False]
oob_score :
交叉验证相关的属性。
n_jobs :
设定fit和predict阶段并列执行的任务个数,如果设置为-1表示并行执行的任务数等于计算级核数; [integer, optional (default=1)]
random_state :
如果是int数值表示它就是随机数产生器的种子.如果指定RandomState实例,它就是随机产生器的种子.如果是None,随机数产生器是np.random所用的RandomState实例; [int, RandomState instance or None, optional (default=None)]
RandomizedSearchCV
这个函数可以帮助我们在候选集组合中,随机地选择几组合适的参数来建模,并且求其交叉验证后的评估结果。以此来大致地找到一个最合适的参数。
from sklearn.model_selection import RandomizedSearchCV
criterion=['mse','mae']
n_estimators = [int(x) for x in np.linspace(start = 1000, stop = 1500, num = 10)]
max_features = ['auto','sqrt']
max_depth = [int(x) for x in np.linspace(10, 30, num = 5)]
max_depth.append(None)
min_samples_split = [9, 10, 11]
min_samples_leaf = [2, 3, 5]
bootstrap = [True, False]
random_grid = {'criterion':criterion,
'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
#构建模型
clf= RandomForestRegressor()
clf_random = RandomizedSearchCV(estimator=clf,
param_distributions=random_grid,
n_iter = 10,
cv = 3,
verbose=2,
random_state=42,
n_jobs=1)
#回归
clf_random.fit(X_train, y_train)
print (clf_random.best_params_)
print(clf_random.best_score_)
RandomizedSearchCV 参数说明:
estimator:
RandomizedSearchCV 这个方法是一个通用的,并不是专为随机森林设计的,所以我们需要指定选择的算法模型是什么。
distributions:
参数的候选空间,就是我们用字典格式给出的参数候选值。
n_iter:
随机寻找参数组合的个数,比如在这里我们赋值了 100,代表接下来要随机找 100 组参数的组合,然后在其中找到最好的一组。
scoring:
模型的评估方法,即按照该方法去找到最好的参数组合。
cv:
几折交叉验证。
random_state:
随机种子,为了使得咱们的结果能够一致,排除掉随机成分的干扰,一般我们都会指定成一个值。
n_jobs:
多进程训练,如果是 -1 就会用所有的 CPU。
调用sklearn中joblib
包
import joblib
#save model
joblib.dump(rf, 'model/rf.pkl')
#load model
rf = joblib.load('model/rf.pkl')