Python机器学习笔记(3)——随机深林-RandomForestClassifier

一、内容

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`
posted @ 2021-10-27 09:47  xiaojy  阅读(318)  评论(0编辑  收藏  举报