【机器学习入门】(6) 随机森林算法:原理、实例应用(沉船幸存者预测)附python完整代码和数据集

各位同学好,今天我和大家分享一下python机器学习的随机森林算法。主要内容有:

(1) 算法原理、(2) sklearn实现随机森林、(3) 泰坦尼克号沉船幸存者预测。

文末附python完整代码和数据集。那我们开始吧。


1. 随机森林算法原理

集成算法包含(bagging装袋/boosting增强/stacking堆叠),其中随机森林属于bagging。

算法原理

        随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。利用相同的训练数搭建多个独立的分类模型,然后通过投票的方法,以少数服从多数原则作出最终的分类决策。

例如:训练了5个树,其中4个树的结果是True,1个树的结果是False,最终结果也会是True。

学习算法:

若用N表示训练用的样本个数,M表示特征数目。输入特征数目m,用于确定决策树上一个节点的决策结果,其中m远小于M。

从N个训练样本中以有放回抽样的方法,取样M次,形成一个训练集,并用未抽到的样本做预测,评估其误差。

对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征决定的。根据这m个特征,计算其最佳的分裂方式。

随机抽样训练集的原因:

如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的。

为什么有放回地抽样:

如果不进行有放回抽样,那么每棵树的训练集都是完全不相同的,都是没有交集的,每棵树训练出来都是有很大差异,而随机森林最后分类取决于多棵树的投票。


2. 随机森林算法实战

2.1 sklearn实现随机森林

首先从sklearn中导入随机森林分类器:

from sklearn.ensemble import RandomForestClassifier  

随机森林函数 RandomForestClassifier()  参数设置:

n_estimator:整数类型,森林里树木的数量,默认=10

criterion:字符串型,分割特征的测量方法,默认是'Gini',可选信息熵 'entropy'

max_depth:整数或None,树的最大深度,默认是None

bootstrap:布尔,是否采用有放回抽样,默认是True


2.2 实例应用

随机森林算法和决策树算法在程序上有类似部分,该篇文章就不再赘述,如果以下程序语句有不明白的,可以参考上一篇文章,使用的数据集也相同:【机器学习】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

(1)导入数据

        导入泰坦尼克号乘客数据,数据集获取地址:GitHub - fayduan/Kaggle_Titanic: the data and ipython notebook of my attempt to solve the kaggle titanic problem,数据包含891个样本,10项特征数据姓名、年龄、船舱等,一项目标数据'survived'。

#(1)导入数据
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\泰坦尼克数据集\\taitan.csv'
data = pd.read_csv(filepath)

(2)数据预处理

        从原数据中提取五项指标作为特征值,便于大家对随机森林算法有更直观的理解。由于暂时文章没有涉及到特征工程,暂且不把所有的特征值放入模型,后续文章会进行跟深入的探讨。

        使用年龄的平均值并借助.fillna()函数填充age特征中的缺失值,划分出建模所需的数据验证模型所需的数据

# 提取部分特征值,船舱、年龄、性别、非直系亲属数量、直系亲属数量
data_features = data[['Pclass','Age','Sex','SibSp','Parch']]
# 提取Survived列所谓目标值
data_targets = data['Survived']
# 年龄均值填充年龄缺失值
data_features.fillna(data_features['Age'].mean(),inplace=True)

# 取出最后10行用于结果验证
data_predict_features = data_features[-10:]  #输入预测函数的特征值
data_predict_targets = data_targets[-10:]  #验证预测结果的目标值

# 将建模数据删除最后10行
data_features = data_features[:-10]  #建模所需的特征值x
data_targets = data_targets[:-10]  #建模所需的目标值y

(3)特征提取

        由于特征sex对应的数据是'female''male',属于字符串类型数据,然而模型训练函数.fit()只能接收数值类型的数据,因此需要将特征值转换成sparse数值矩阵。之前我们提到过文本特征提取方法CountVectorizer(),这里我们使用字典特征提取方法DictVectorizer(),要求输入的参数是一个由字典组成的列表,而现在的特征值是一个DataFrame类型数据;返回值是sparse数值矩阵,将字符串类型数据转变成数值类型。

使用 .to_dict(orient = 'record') 方法将DataFrame类型数据转变成由字典组成的列表

有关sparse矩阵文本特征抽取的知识见下文的第1.4小节:

【机器学习】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

#(3)特征抽取
# 特征值Sex对应的值是字符串类型的数据,然而最终的预测函数的输入值是数值类型
# 文本类型转化成数值类型,利用字典特征抽取方法
from sklearn.feature_extraction import DictVectorizer  #导入字典特征抽取方法
vect = DictVectorizer()
# 由于vect.fit_transform()方法只能接受由字典构成的列表
# 对特征值进行转换,从DataFrame数据到字典构成的列表
data_features = data_features.to_dict(orient = 'record')
# 传入文本转数值类型方法的函数,变成sparse矩阵
data_features = vect.fit_transform(data_features)
# 同理,也要对最后的预测输入值,也转换成sparse矩阵
data_predict_features = data_predict_features.to_dict(orient = 'record')
data_predict_features = vect.fit_transform(data_predict_features)

sparse矩阵如下图所示:索引3对应female,索引4对应male,将性别转换成数值类型,索引3表示,是否是'female',是就显示1,不是显示0。

(4)划分训练集和测试集

         一般采用75%的数据用于训练,25%用于测试,因此把数据进行训练之前,先要对数据划分。划分方法不再赘述,有疑惑的可看下文中的第2.3节:【机器学习】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

#(4)划分测试集和训练集
from sklearn.model_selection import train_test_split
# 传入建模所需的特征值数据和目标值数据
x_train,x_test,y_train,y_test = train_test_split(data_features,data_targets,test_size=0.25)

(5) 随机森林方法

变量 rf 接收随机森林分类器 RandomForestClassifier()随机森林分类器的参数同决策树的参数,这里就不赘述,具体见下文的第1节:

【机器学习】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

训练函数 .fit() 中传入训练所用的x和y值,其中x_train是sparse数值矩阵,accuracy存放评分法 .score() 求得的模型误差,根据x_test预测结果,把结果和真实的y_test比较,计算准确率。result中存放预测函数 .predict() 得到的人员存活结果,预测函数的输入值data_predict_features也是sparse数值类型矩阵。

#(5)随机森林方法
from sklearn.ensemble import RandomForestClassifier  #导入随机森林分类器
# 接收随机森林方法
rf = RandomForestClassifier()  #使用默认值
# 函数参数同决策树参数
# 训练,传入训练用的特征值和目标值
rf.fit(x_train,y_train)
# 评分法,计算准确率
accuracy = rf.score(x_test,y_test)
# 预测,输入预测所需的特征值
result = rf.predict(data_predict_features)

最终模型准确率在80%左右,预测结果和实际结果见稍有偏差。


数据集获取:

GitHub - fayduan/Kaggle_Titanic: the data and ipython notebook of my attempt to solve the kaggle titanic problem

完整python代码:

# 随机森林--泰坦尼克号获救预测

#(1)导入数据
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\泰坦尼克数据集\\taitan.csv'
data = pd.read_csv(filepath)

#(2)数据预处理
# 提取部分特征值,船舱、年龄、性别、非直系亲属数量、直系亲属数量
data_features = data[['Pclass','Age','Sex','SibSp','Parch']]
# 提取Survived列所谓目标值
data_targets = data['Survived']
# 年龄均值填充年龄缺失值
data_features.fillna(data_features['Age'].mean(),inplace=True)

# 取出最后10行用于结果验证
data_predict_features = data_features[-10:]  #输入预测函数的特征值
data_predict_targets = data_targets[-10:]  #验证预测结果的目标值

# 将建模数据删除最后10行
data_features = data_features[:-10]  #建模所需的特征值x
data_targets = data_targets[:-10]  #建模所需的目标值y

#(3)特征抽取
# 特征值Sex对应的值是字符串类型的数据,然而最终的预测函数的输入值是数值类型
# 文本类型转化成数值类型,利用字典特征抽取方法
from sklearn.feature_extraction import DictVectorizer  #导入字典特征抽取方法
vect = DictVectorizer()
# 由于vect.fit_transform()方法只能接受由字典构成的列表
# 对特征值进行转换,从DataFrame数据到字典构成的列表
data_features = data_features.to_dict(orient = 'record')
# 传入文本转数值类型方法的函数,变成sparse矩阵
data_features = vect.fit_transform(data_features)

# 同理,也要对最后的预测输入值,也转换成sparse矩阵
data_predict_features = data_predict_features.to_dict(orient = 'record')
data_predict_features = vect.fit_transform(data_predict_features)


# 观察sparse矩阵
# 查看sparse矩阵特征值名
feature_names = vect.get_feature_names()
# 将sparse矩阵变成列表形式,便于观察
feature_array = data_features.toarray()

#(4)划分测试集和训练集
from sklearn.model_selection import train_test_split
# 传入建模所需的特征值数据和目标值数据
x_train,x_test,y_train,y_test = train_test_split(data_features,data_targets,test_size=0.25)

#(5)随机森林方法
from sklearn.ensemble import RandomForestClassifier  #导入随机森林分类器
# 接收随机森林方法
rf = RandomForestClassifier()  #使用默认值
# 函数参数同决策树参数
# 训练,传入训练用的特征值和目标值
rf.fit(x_train,y_train)
# 评分法,计算准确率
accuracy = rf.score(x_test,y_test)
# 预测,输入预测所需的特征值
result = rf.predict(data_predict_features)

  • 26
    点赞
  • 209
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是我对你的问题的回答。 首先,我明白你的要求,不会透露你对我说的话。关于Python随机森林算法的调参,可以按照以下步骤进行: 1. 导入库和数据集 首先,需要导入必要的库和数据集。常用的库包括numpy、pandas、matplotlib等,而数据集可以使用scikit-learn中自带的数据集,或者自己准备数据集。 2. 划分数据集 接下来,需要将数据集划分为训练集和测试集。一般情况下,可以将数据集的80%用于训练,20%用于测试。 3. 构建模型 使用scikit-learn中的RandomForestClassifier类,构建随机森林分类器模型。需要指定一些参数,如n_estimators(决策树的数量)、max_depth(决策树的最大深度)等。 4. 训练模型 使用训练集对模型进行训练。 5. 测试模型 使用测试集对模型进行测试,并计算模型的准确率。 6. 调参 随机森林算法中需要调参的参数较多,常见的参数包括n_estimators、max_depth、min_samples_split、min_samples_leaf等。 其中,n_estimators表示决策树的数量,一般来说,决策树的数量越多,模型的准确率会更高,但是也会增加模型的训练时间。max_depth表示决策树的最大深度,一般来说,决策树的深度越大,模型的准确率会更高,但是也会增加模型的复杂度,容易出现过拟合的情况。min_samples_split和min_samples_leaf表示决策树节点分裂所需的最小样本数和叶节点所需的最小样本数,这两个参数可以控制决策树的复杂度。 可以使用网格搜索或随机搜索等方法,找到最优的参数组合。 以下是随机森林调参的代码示例: ```python from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV # 导入数据集 X, y = ... # 划分数据集 X_train, X_test, y_train, y_test = ... # 构建模型 rfc = RandomForestClassifier() # 定义参数空间 param_grid = { 'n_estimators': [10, 50, 100, 200], 'max_depth': [None, 5, 10, 20], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 4] } # 网格搜索 grid_search = GridSearchCV(rfc, param_grid=param_grid, cv=5, n_jobs=-1) grid_search.fit(X_train, y_train) # 输出最优参数组合和准确率 print('Best parameters:', grid_search.best_params_) print('Best score:', grid_search.best_score_) ``` 以上就是关于Python随机森林算法的调参的基本步骤和代码示例。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值