随机森林理解及Python调包实现

随机森林算法原理 = 决策树 + bagging原理 + 随机

  • 随机森林和决策树一样既可以做分类又可以做回归(更多用来做分类问题)
  • 随机森林是使用集成学习的思想将多颗决策树集成一种学习器的算法,中间利用到bagging的投票思想,少数服从多数进行集成学习
  • 随机森林的随机思想体现在两方面:第一是在随机的抽取样本,假如有N个样本记录,那么对于每一颗决策树(随机森林的子树数量是由使用者自己决定的,子树数量越高效果越好,一般我们选择在处理器可以承受的情况下选择较大的子树)都进行有放回的取出N个样本。(这里面的值肯定会有重叠,但是没关系)
    第二是随机的选取每颗子树所能选取的最大的特征数,一般我们选择的特征数要小于总特征数。在sk-learn库中,一般有平方根、log2。

随机森林优缺点
优点:

  • 适用于高维,不需要对数据进行降维
  • 对缺失值不敏感
  • 可以很好的处理数据类别不平衡的问题

缺点:

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合
  • 对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。

Python调包实现分类与回归(数据集都来自sk-learn库)

  • 回归
#随机森林回归
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston

boston_house = load_boston()

boston_feature_name = boston_house.feature_names
boston_features = boston_house.data
boston_target = boston_house.target

##随机森林模型,参数选取生成50颗子树,处理器使用不限,每颗子树使用的最大特征数为sqrt(所有特征数),
model = RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
           max_features='sqrt', max_leaf_nodes=None,
           min_impurity_decrease=0.0, min_impurity_split=None,
           min_samples_leaf=1, min_samples_split=2,
           min_weight_fraction_leaf=0.0, n_estimators=50, n_jobs=-1,
           oob_score=False, random_state=None, verbose=0, warm_start=False)
rgs = model.fit(boston_features, boston_target)
rgs = rgs.predict(boston_features)

#评估平方根损失
error = 0.0
for i in range(len(boston_target)):
    error += (rgs[i] - boston_target[i])**2
print(error**0.5)
  • 分类
#随机森林分类器
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)


train, test = df[df['is_train'] == True], df[df['is_train'] == False]

features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=-1,n_estimators=50,max_features='sqrt')
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)

preds = iris.target_names[clf.predict(test[features])]
preds_desc = pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])


#评估错误率
test_label = list(test['species'])
error = 0
for i in range(len(preds)):
    if preds[i] != test_label[i]:
        error += 1

print(error/len(preds))

随机森林参数调优