社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习实战(12)—— 随机森林代码实现

人工智能爱好者社区 • 5 年前 • 586 次点击  

👇点击关注公众号👇

第一时间获取人工智能干货内容


在上一篇中,我们讲解了随机森林算法的原理,这篇我们进行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))



这就是随机森林代码实现部分,你学会了么?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/114742