在上一篇中,我们讲解了随机森林算法的原理,这篇我们进行python代码实战。
首先看看sklearn中随机森林实现的注意点:
在 sklearn中,随机森林的函数模型是:
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)
总的来说,调参对随机森林来说,不会发生很大的波动,相比神经网络来说,随机森林即使使用默认的参数,也可以达到良好的结果。
max_features:随机森林允许单个决策树使用特征的最大数量。
(1)Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。
(2)sqrt :此选项是每颗子树可以利用总特征数的平方根个。例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个
(3)log2 :max_features=log2(n_features).
(4)0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。
增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。但是,可以肯定,你通过增加max_features会降低算法的速度。因此,你需要适当的平衡和选择最佳max_features。
n_estimators:子树的数量
在利用最大投票数或平均值来预测之前,你想要建立子树的数量。较多的子树可以让模型有更好的性能,但同时让你的代码变慢。你应该选择尽可能高的值,只要你的处理器能够承受的住,默认是10,使你的预测更好更稳定,一般至少100。
max_depth: 树的最大深度
(default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。
min_samples_split:默认为2,含义:分割内部节点所需的最少样本数量
min_samples_leaf:叶子节点包含最少的样本数,默认为1
bootstrap=True:是否有放回的采样。
min_impurity_decrease:默认0,一个节点将会被分裂,如果分裂之后,杂质度的减少效果高于这个值。
min_weight_fraction_leaf:default=0,能成为叶子节点的条件是:该节点对应的实例数和总样本数的比值,至少大于这个min_weight_fraction_leaf值
max_leaf_nodes:(默认None) 最大叶子节点数,以最好的优先方式生成树,最好的节点被定义为杂质相对较少,即纯度较高的叶子节点
min_impurity_split:树增长停止的阀值。一个节点将会分裂,如果他的杂质度比这个阀值;如果比这个值低,就会成为一个叶子节点。
class_weight=None:各个label的权重。list or dicts, "balanced"
对于多分类问题,可以按照分类结果 y 的可能取值的顺序给出一个list或者dict值,用来指明各类的权重."balanced"模式,使用 y 值自动调整权重,该模式类别权重与输入数据中的类别频率成反比。
oob_score:默认False,是否使用袋外样本来估计该模型大概的准确率
criterion:
”gini”or“entropy”(default=”gini”)是计算属性的gini(基尼不纯度)还是entropy(信息增益),来选择最合适的节点。
splitter:
”best” or “random”(default=”best”), 随机选择属性还是选择不纯度最大的属性,建议用默认。
n_jobs:
这个参数告诉引擎有多少处理器是它可以使用。“-1”意味着没有限制,而“1”值意味着它只能使用一个处理器,具体写数字 n 表示使用 n 个。并行job个数在集成算法中非常重要,尤其是bagging。
random_state:
此参数让结果容易复现。一个确定的随机值将会产生相同的结果,在参数和训练数据不变的情况下。
本次实战使用泰坦尼克号数据。
首先导入相关模块并且读取数据:
# 导入pandas用于数据分析。
import pandas as pd
# 利用pandas的read_csv模块直接从互联网收集泰坦尼克号乘客数据。
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
观察数据:
# 观察一下前几行数据,可以发现,数据种类各异,数值型、类别型,甚至还有缺失数据。
titanic.head()
各个字段名解释:
Pclass => 乘客等级(1/2/3等舱位)
Survived => 是否存活
Name => 乘客姓名
Age => 年龄
Embarked => 登船港口
Home.dest => 住址,目的地
Room =>房间号
Ticket => 船票信息
Boat => 救生船
Sex => 性别
查看数据信息:
# 使用pandas,数据都转入pandas独有的dataframe格式(二维数据表格),直接使用info(),查看数据的统计特性。
titanic.info()
主要展示数据字段空值情况和数据字段类型:
选择包含部分特征的数据:
# 机器学习有一个不太被初学者重视,并且耗时,但是十分重要的一环,特征的选择,这个需要基于一些背景知识。
# 根据我们对这场事故的了解,sex, age, pclass这些都很有可能是决定幸免与否的关键因素。
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 对当前选择的特征进行探查。
X.info()
缺失值填补:
# 借由上面的输出,我们设计如下几个数据处理的任务:
# 1) age这个数据列,只有633个,需要补完。
# 2) sex 与 pclass两个数据列的值都是类别型的,需要转化为数值特征,用0/1代替。
# 首先我们补充age里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略。
X['age'].fillna(X['age'].mean(), inplace=True)#采用平均数填补
# 对补完的数据重新探查。
X.info()
此时已经没有缺失值了:
划分训练集与测试集:
# 由此得知,age特征得到了补完。
# 数据分割。
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 33)
特征处理:
# 我们使用scikit-learn.feature_extraction中的特征转换器,详见3.1.1.1特征抽取。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
# 转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一列特征,数值型的则保持不变。
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print(vec.feature_names_)
# 同样需要对测试数据的特征进行转换。
X_test = vec.transform(X_test.to_dict(orient='record'))
使用单一决策树建模:
# 使用单一决策树进行模型训练以及预测分析。
# 从sklearn.tree中导入决策树分类器。
from sklearn.tree import DecisionTreeClassifier
# 使用默认配置初始化决策树分类器。
dtc = DecisionTreeClassifier()
# 使用分割到的训练数据进行模型学习。
dtc.fit(X_train, y_train)
# 用训练好的决策树模型对测试特征数据进行预测。
dtc_y_pred = dtc.predict(X_test)
评估单一决策树模型效果:
# 从sklearn.metrics导入classification_report。
from sklearn.metrics import classification_report
# 输出单一决策树在测试集上的分类准确性,以及更加详细的精确率、召回率、F1指标。
print('The accuracy of decision tree is', dtc.score(X_test, y_test))
print(classification_report(dtc_y_pred, y_test))
使用随机森林建模:
# 使用随机森林分类器进行集成模型的训练以及预测分析。
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc_y_pred = rfc.predict(X_test)
评估随机森林模型效果:
# 输出随机森林分类器在测试集上的分类准确性,以及更加详细的精确率、召回率、F1指标。
print('The accuracy of random forest classifier is', rfc.score(X_test, y_test))
print(classification_report(rfc_y_pred, y_test))
这就是随机森林代码实现部分,你学会了么?