#随机森林也可以做回归和分类,而且效果比决策树是要好的,我们来学习一下随机森林吧:

初体验,大部分参数与决策树一致:

'''
1.随机森林:
随机森林属于一种集成算法,与我们之前关注的决策树有着很大的关系:
从字面上看我们就知道要建立的是很多颗树,但是之前我怀疑过,就是建立很多颗树顶多也就是找到最好的一颗,对数据的预测也不会有很大的提升吧;

但是我错了:装袋法:他不是找最好的一棵树,而是非常民主的平均,对于回归来说是这样的,分类就更形象了,少数服从多数,虽然可能会错,但是好处也是不言而喻的。
三种方式:袋装法bagging,提升法boosting,stacking
后面继续加深学习的:梯度提升树GBDT,Xgboost

2.参数:
与决策树基本一致,新增n_estimators:指的是森林中决策树的个数;
rfc.estimators_ 查看随机森林中树的状况。
bootstrap = True 代表有放回的抽样
obb_score = True 代表用袋外数据做测试集;袋外数据就是袋装法又放回取数据的时候没有被取到的数据,n样本个数,n_estimators足够大袋外数据大约是37%。

.oob_score_ 查看利用袋外数据预测的结果;
.feature_importances_ 查看重要的特征
查看信息的重要程度:rfc.feature_importances_

3.接口:
返回每个测试样本所在的叶子节点的索引:apply(xtest)
返回样本的分类或者回归的结果:predict(xtest)
显示预测的准确率:score(xtest,ytesyt)
训练数据:fit(xtest,ytest)
返回被分给某个标签的概率:大于0.5的被选择:rfc.predict_proba(xtest)

'''

1.随机森林(分为分类随机森林及回归随机森林):非常好用,及其常用,要弄明白

①算法概念:
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的;随机森林运行快速的一个原因是他一棵树只选部分特征进行建立。

②.算法思路:
每棵决策树都是一个分类器,那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging (Bagging的特点“随机采样”)思想,回归就用平均值;当然还会有更加复杂的方式,比如梯度提升树。

③优缺点:
优点:
a. 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合
b. 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力
c. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化
d. 可生成一个Proximities=(pij)矩阵,用于度量样本之间的相似性: pij=aij/N, aij表示样本i和j出现在随机森林中同一个叶子结点的次数,N随机森林中树的颗数
e. 在创建随机森林的时候,对generlization error使用的是无偏估计
f. 训练速度快,可以得到变量重要性排序(两种:基于OOB误分率的增加量和基于分裂时的GINI下降量
g. 在训练过程中,能够检测到feature间的互相影响
h. 容易做成并行化方法
i. 实现比较简单

④.代码实例1(分类随机森林):
数据位置:泰坦尼克数据

# coding=gb2312                    #加入编码格式

from sklearn.ensemble import RandomForestClassifier
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
'''
随机森林泰坦尼克号进行预测生死:
就是多个决策树。
'''

#1.读取数据:pd
titan = pd.read_csv("./Kaggle_Titanic-master/train.csv")

# print(titan)
#2.选择特征值,并对缺失值进行处理:
x = titan.loc[:,["Pclass","Age","Sex"]]
y = titan.loc[:,"Survived"]

# print(x,y)
#缺失值处理:
x["Age"].fillna(x["Age"].mean(),inplace=True)

#分割数据集为:训练集,测试集

x_tain,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
#3.进行特征工程:pd转换成字典,特征抽取
dict = DictVectorizer(sparse=False)

x_tain = dict.fit_transform(x_tain.to_dict(orient = "records")) #orient = "records"一行行转化成字典
print(dict.get_feature_names())

x_test = dict.transform(x_test.to_dict(orient = "records"))

#4.随机森林进行数据的预测:
rf = RandomForestClassifier()

param = {"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,15,25,30]}

#网格搜索与交叉验证:
gc = GridSearchCV(rf,param_grid=param,cv=2)
gc.fit(x_tain,y_train)

#预测准确率:
print("预测准确率:",gc.score(x_test,y_test))

#查看选择的参数模型:
print("查看选择的参数模型:",gc.best_params_)

结果:相对于决策树要好一些了,不过速度也是真的不快:

Python 随机森林和回归模型共有参数 python随机森林回归预测_数据

代码实例2(回归随机森林):
可以看看我二手房价格的分析

代码实例3(填补缺失值):思路就是特征也可以做标签,标签也可以做特征,一个大循环下来就填补缺失值完成了;然后查看不同填充方式和原数据预测得出的MSE,可以看出随机森林和原数据的趋势基本一致:

#用随机森林填补缺失值:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston


#导入数据集:
dataset = load_boston()

#shape[0]:表示矩阵的行数;shape[1]:表示矩阵的列数
x_full,y_full = dataset.data,dataset.target
n_samples = x_full.shape[0]
n_features = x_full.shape[1]

#为数据放入缺失值:
'''
np.floor 返回不大于输入参数的最大整数。 即对于输入值 x ,将返回最大的整数 i ,使得 i <= x。 注意在Python中,向下取整总是从 0 舍入。
np.ceil 函数返回输入值的上限,即对于输入 x ,返回最小的整数 i ,使得 i> = x。
np.around 返回四舍五入后的值,可指定精度。
numpy.where(condition[, x, y])根据条件 condition 从 x 和 y 中选择元素,当 condition 为 True 时,选 x,否则选 y。
'''
#生成确实数据的数量:
rng = np.random.RandomState(0)
missing_rate = 0.5 #缺失一半的数据
n_missing_samples = int(np.floor(n_samples*n_features*missing_rate))

'''
random.randint(a,b[,c])
#用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b。c是步幅。
 rng.randint(0,n_features,n_missing_samples) 上下限之间取出n_missing_samples个整数。

'''
#生成缺失数据的位置:
missing_features = rng.randint(0,n_features,n_missing_samples)
missing_samples = rng.randint(0,n_samples,n_missing_samples)


#进行缺失值的填补:

from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor

#拷贝一份数据进行处理,不影响原始数据:
x_missing_1 = x_full.copy()
y_missing_1 = y_full.copy()

x_missing_1[missing_samples,missing_features] = np.nan
x_missing_1 = pd.DataFrame(x_missing_1)

#1.使用均值进行填补:
imp_mean = SimpleImputer(missing_values=np.nan,strategy="mean")
x_missing_mean = imp_mean.fit_transform(x_missing_1)
print(pd.DataFrame(x_missing_mean).isnull().sum())

#2.使用0进行填充:
#拷贝一份数据进行处理,不影响原始数据:
x_missing_2 = x_full.copy()
y_missing_2 = y_full.copy()

x_missing_2[missing_samples,missing_features] = np.nan
x_missing_2 = pd.DataFrame(x_missing_2)

imp_0 = SimpleImputer(missing_values=np.nan,strategy="constant")
x_missing_0 = imp_0.fit_transform(x_missing_2)
print(pd.DataFrame(x_missing_0).isnull().sum())

#3.使用随机森林进行填充:
#拷贝一份数据进行处理,不影响原始数据:
x_missing_3 = x_full.copy()
y_missing_3 = y_full.copy()
x_missing_3[missing_samples,missing_features] = np.nan
x_missing_3 = pd.DataFrame(x_missing_3)

sortindex = np.argsort(x_missing_3.isnull().sum(axis=0)).values



# print(sortindex)   #[ 6 12  8  7  9  0  2  1  5  4  3 10 11]

for i in sortindex:
    #构建我们新的特征矩阵及标签:
    df_1 = x_missing_3
    fillc = df_1.iloc[:,i]
    df = pd.concat([df_1.iloc[:,df_1.columns != i],pd.DataFrame(y_full)],axis=1)

    #在新的特征矩阵中,对含有缺失值的列,进行0的填补:
    df_0 = SimpleImputer(missing_values=np.nan,strategy="constant",fill_value=0).fit_transform(df)

    #找出我们的训练集和测试集:
    ytrain = fillc[fillc.notnull()]
    ytest = fillc[fillc.isnull()]
    xtrain = df_0[ytrain.index,:]
    xtest = df_0[ytest.index,:]

    #随机森连填补缺失值:
    rfc = RandomForestRegressor(n_estimators=100)
    rfc = rfc.fit(xtrain,ytrain)
    ypredict = rfc.predict(xtest)
    x_missing_3.loc[x_missing_3.iloc[:,i].isnull(),i] = ypredict

print(x_missing_3)

X = [x_full,x_missing_mean,x_missing_0,x_missing_3]

mse = []

from sklearn.model_selection import cross_val_score
for x in X:
    estimator = RandomForestRegressor(random_state=0,n_estimators=100)
    scores = cross_val_score(estimator,x,y_full,scoring="neg_mean_squared_error",cv=10)
    mse.append(scores*-1)

x_labels = ["Full data","mean Iputation","Zero Imputation","Regressor Iputation"]
colors = ["r","g","b","orange"]

plt.figure(figsize=(12,6))
ax = plt.subplot(111)
for i in np.arange(len(mse)):
    ax.barh(i,mse[i],color=colors[i],alpha=0.6,align="center")
ax.set_title("Imputation Techniques with Boston Data")
'''
matplotlib.pyplot.gca().set_xlim(初始值,末值) 与 matplotlib.pyplot.xticks()的区别
第一个是设置坐标轴的范围,第二个是设置精度及精度的范围:
'''
ax.set_xlim(left=np.min(mse)*0.9,right=np.max(mse)*1.1)
ax.set_yticks(np.arange(len(mse)))
ax.set_xlabel("MSE")
ax.invert_yaxis()
ax.set_yticklabels(x_labels)
plt.show()

Python 随机森林和回归模型共有参数 python随机森林回归预测_随机森林_02


以上就是我对随机森林的一些使用,互相学习。

持续更新,,,