一、内容
1、随机森林算法原理
2、数据模型的建立
二、算法原理
随机森林算法是在决策树算法上的延生,是应用最广泛的算法之一,即可以用于分类也可以用于回归;
2.1 随机森领算法的优点:
1,可以用于回归和分类任务
2,容易查看模型的输入特征的相对重要性
3,易于使用,直观易懂
4,不会容易出现过拟合
5,对于分布不均的数据也能很好的做出预测
2.2 集合算法
所谓集合算法,就是利用统计学采样原理,训练出成千上百个不同的算法模型,当需要预测是,
使用这些模型分别对样本进行预测,然后采用少数服从多数的原则,决定样本类别;
集合算法的优势:
1,可以避免决策树这种容易出现过拟合的现象
2,可以降低噪声干扰,提高模型的准确性和稳定性。
同时,也会增加计算量。
另外,在聚合算法的基础上对特征应用聚合算法,每次训练时,不使用全部特征,而是随机的使用一部分特征进行训练。选择一部分特征的原因是,确保所有的特征都可以对预测结果产生影响(例如在决策树上,使用了所有特征,有些特征影响比较大,可能会掩盖影响比较小的特征,造成过拟合),避免某一部分特征影响特别大;同时,这样也会建立非常多的子模型,因此,也就建立非常多的树。
大致的流程可分为:
1、有放回的采样
2、采样特征
3、构建决策树
4、重复t次
5,综合多颗决策树的预测结果,作为随机森林的预测结果
即,回归问题:平均值;分类问题:少数服从多数
该模型有两个重要的参数:决策树的个数t、构建单颗决策树使用的特征数量;
2.3 特征的重要性
通过查看使用该特征减少了森林种所有树多少的不存度,来衡量特征的重要性;
它在训练后自动计算每个特征的得分,并对结果进行标准化,以使所有特征的重要性总和等于1。
三、数据模型的建立
3.1 sklearn内置的随机森林函数种的超参数
3.1.1 “n_estimators”,表示算法在进行最大投票或采取预测平均值之间建立的树数量;一般来说,树的数量越多,性能越好,预测也越稳定,但也会减慢计算速度;
3.1.2 “max_features”,单个树中可拥有的特征最大数量
3.1.3 “min_sample_leaf”,决定了叶子的数量
3.1.4 “n_jobs”,允许使用的处理器数量,若为1,则只能使用一个,若为-1则表示没有限制。
3.2 训练数据
数据预处理流程和《Python机器学习笔记(2)——决策树》一致,本篇显示流程,详细解释见:https://www.cnblogs.com/xiaojy2021/articles/15425864.html
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 数据预处理
data = pd.read_csv("datasets/tt/train.csv")
data=data[[['Survived', 'Pclass', 'Sex', 'Age', 'SibSp','Parch','Fare','Embarked']]]
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Sex']=data['Sex'].apply(lambda x : 1 if x == 'male' else 0)
data['p1']=np.array(data['Pclass'] == 1).astype(np.int32)
data['p2']=np.array(data['Pclass'] == 2).astype(np.int32)
data['p3']=np.array(data['Pclass'] == 3).astype(np.int32)
del data['Pclass']
data['e1']=np.array(data['Pclass'] == 'S').astype(np.int32)
data['e2']=np.array(data['Pclass'] == 'C').astype(np.int32)
data['e3']=np.array(data['Pclass'] == 'Q').astype(np.int32)
del data['Embarked']
ata_train=data[[ 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'p1', 'p2', 'p3','e1', 'e2', 'e3']].values
data_target=data['Survived'].values.reshape(len(data),1)
# 训练数据
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100,n_jobs=2)
model.fit(x_train, y_train.ravel())
model.score(x_test, y_test)
>>>`0.8044692737430168`
# 每个特征重要性
for futh, imp in zip(['Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'p1', 'p2', 'p3', 'e1', 'e2', 'e3'], model.feature_importances_):
print(futh, ': ', imp)
>>>
Sex : 0.23788130036487062
Age : 0.26432992813568623
SibSp : 0.047943862085997165
Parch : 0.0402757078113585
Fare : 0.2708496232265642
p1 : 0.026324629106501036
p2 : 0.014143416779033085
p3 : 0.05846314709384881
e1 : 0.016942122043335093
e2 : 0.01476977181828939
e3 : 0.008076491534515862
## 预测结果
model.predict(x_test[0].reshape(1, -1))
>>> `array([0], dtype=int64)`
3.3 交叉验证
from sklearn.model_selection import GridSearchCV
n_estimators = range(80,130)
param_grid = {'n_estimators': n_estimators}
model = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
model.fit(data_train, data_target.ravel())
model.best_params_
>>>`{'n_estimators': 87}`
model.best_score_
>>>`0.8181818181818182`
本文从博客园(点击查看原文)转载而来。不代表烟海拾贝立场,如若转载,请注明出处:https://somirror.com/5482.html