本文主要目的是通过一段及其简单的小程序来快速学习python 中sklearn的RandomForest这一函数的基本操作和使用,注意不是用python纯粹从头到尾自己构建RandomForest,既然sklearn提供了现成的我们直接拿来用就可以了,当然其原理十分重要,下面最简单介绍:
集成学习是将多个模型进行组合来解决单一的预测问题。它的原理是生成多个分类器模型,各自独立地学习并作出预测。
这些预测最后结合起来得到预测结果,因此和单独分类器的结果相比,结果一样或更好。
bagging就是一种集成学习用来提高学习算法准确度的方法主要思想:
1.给定一个弱学习算法,和一个训练集;
2.单个弱学习算法准确率不高;
3.将该学习算法使用多次,得出预测函数序列,进行投票;
4.最后结果准确率将得到提高.
随机森林是Bagging的一个拓展变体,是集成学习的一个分支,因为它依靠于决策树的集成。
更详细的介绍可以去官网查看
随机森林有两种算法(红字就是主要区别)
RandomForest algorithm :
样本提取时允许replacement(a bootstrap sample),在随机选取的部分(而不是全部的)features上进行划分,与原论文的vote方法不同,scikit-learn通过平均每个分类器的预测概率(averaging their probabilistic prediction)来生成最终结果。
Extremely Randomized Trees :
有两个class,分别处理分类和回归,默认使用所有样本,但划分时features随机选取部分。
随机森林算法既可以应运到分类RandomForestClassifier(随机森林分类)、又可以用于回归问题RandomForestRegressor(随机森林回归),下面将分别给与代码
RandomForestClassifier:
代码:
#RandomForestClassifier import math import matplotlib as mpl import warnings import numpy as np from sklearn.model_selection import cross_val_score from sklearn.datasets import make_blobs from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import ExtraTreesClassifier from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split #忽略一些版本不兼容等警告 warnings.filterwarnings("ignore") #源数据产生具体看https://blog.csdn.net/ichuzhen/article/details/51768934 n_features=2 #每个样本有几个属性或特征 x,y = make_blobs(n_samples=300, n_features=n_features, centers=6) x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7) #核心代码 #传统决策树、随机森林算法、极端随机树关于区别:https://blog.csdn.net/hanss2/article/details/53525503 #关于其中参数的说明请看http://www.jb51.net/article/131172.htm clf1 = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0) clf2 = RandomForestClassifier(n_estimators=10,max_features=math.sqrt(n_features), max_depth=None,min_samples_split=2, bootstrap=True) clf3 = ExtraTreesClassifier(n_estimators=10,max_features=math.sqrt(n_features), max_depth=None,min_samples_split=2, bootstrap=False) ''' #交叉验证 scores1 = cross_val_score(clf1, x_train, y_train) scores2 = cross_val_score(clf2, x_train, y_train) scores3 = cross_val_score(clf3, x_train, y_train) print('DecisionTreeClassifier交叉验证准确率为:'+str(scores1.mean())) print('RandomForestClassifier交叉验证准确率为:'+str(scores2.mean())) print('ExtraTreesClassifier交叉验证准确率为:'+str(scores3.mean())) ''' clf1.fit(x_train, y_train) clf2.fit(x_train, y_train) clf3.fit(x_train, y_train) #区域预测 x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围 x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围 x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]# 生成网格采样点行列均为200点 area_smaple_point = np.stack((x1.flat, x2.flat), axis=1) # 将区域划分为一系列测试点去用学习的模型预测,进而根据预测结果画区域 area1_predict = clf1.predict(area_smaple_point) # 所有区域点进行预测 area1_predict = area1_predict.reshape(x1.shape) # 转化为和x1一样的数组因为用plt.pcolormesh(x1, x2, area_flag, cmap=classifier_area_color) # 时x1和x2组成的是200*200矩阵,area_flag要与它对应 area2_predict = clf2.predict(area_smaple_point) area2_predict = area2_predict.reshape(x1.shape) area3_predict = clf3.predict(area_smaple_point) area3_predict = area3_predict.reshape(x1.shape) mpl.rcParams['font.sans-serif'] = [u'SimHei'] #用来正常显示中文标签 mpl.rcParams['axes.unicode_minus'] = False #用来正常显示负号 classifier_area_color = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF']) #区域颜色 cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) #样本所属类别颜色 #绘图 #第一个子图 plt.subplot(2,2,1) plt.pcolormesh(x1, x2, area1_predict, cmap=classifier_area_color) plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark) plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark) plt.xlabel('data_x', fontsize=8) plt.ylabel('data_y', fontsize=8) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title(u'DecisionTreeClassifier:传统决策树', fontsize=8) plt.text(x1_max-9, x2_max-2, u'$o---train ; x---test$') #第二个子图 plt.subplot(2,2,2) plt.pcolormesh(x1, x2, area2_predict, cmap=classifier_area_color) plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark) plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark) plt.xlabel('data_x', fontsize=8) plt.ylabel('data_y', fontsize=8) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title(u'RandomForestClassifier:随机森林算法', fontsize=8) plt.text(x1_max-9,x2_max-2, u'$o---train ; x---test$') #第三个子图 plt.subplot(2,2,3) plt.pcolormesh(x1, x2, area3_predict, cmap=classifier_area_color) plt.scatter(x_train[:,0], x_train[:,1], c=y_train,marker='o', s=50, cmap=cm_dark) plt.scatter(x_test[:,0],x_test[:,1], c=y_test,marker='x', s=50, cmap=cm_dark) plt.xlabel('data_x', fontsize=8) plt.ylabel('data_y', fontsize=8) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title(u'ExtraTreesClassifier:极端随机树', fontsize=8) plt.text(x1_max-9, x2_max-2, u'$o---train ; x---test$') #第四个子图 plt.subplot(2,2,4) y=[] scores1 = cross_val_score(clf1, x_train, y_train) y.append(scores1.mean()) scores2 = cross_val_score(clf2, x_train, y_train) y.append(scores2.mean()) scores3 = cross_val_score(clf3, x_train, y_train) y.append(scores3.mean()) x=[0,1,2] plt.bar(x,y,0.4,color="green") plt.xlabel("0--DecisionTreeClassifier;1--RandomForestClassifier;2--ExtraTreesClassifie", fontsize=8) plt.ylabel("平均准确率", fontsize=8) plt.ylim(0.9, 0.99) plt.title("交叉验证",fontsize=8) for a, b in zip(x, y): plt.text(a, b, b, ha='center', va='bottom', fontsize=10) plt.show()
RandomForestRegressor:
代码:
#随机森林回归 import matplotlib as mpl import numpy as np import warnings import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.ensemble import ExtraTreesRegressor #忽略一些版本不兼容等警告 warnings.filterwarnings("ignore") #产生心状坐标 t = np.arange(0,2*np.pi,0.1) x = 16*np.sin(t)**3 x=x[:, np.newaxis] y = 13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t) y[::7]+= 3* (1 - np.random.rand(9)) #增加噪声,在每数2个数的时候增加一点噪声 #传统决策树线性回归,随机森林回归,极端森林回归 rf1=DecisionTreeRegressor() rf2=RandomForestRegressor(n_estimators=1000) #一般来说n_estimators越大越好,运行结果呈现出的两种结果该值分别是10和1000 rf3=ExtraTreesRegressor() #三种算法的预测 y_rf1 =rf1.fit(x,y).predict(x) y_rf2 =rf2.fit(x,y).predict(x) y_rf3 =rf3.fit(x,y).predict(x) #为了后面plt.text定位 x1_min, x1_max = x[:].min(), x[:].max() x2_min, x2_max = y[:].min(), y[:].max() mpl.rcParams['font.sans-serif'] = [u'SimHei'] #用来正常显示中文标签 mpl.rcParams['axes.unicode_minus'] = False plt.scatter(x, y, color='darkorange', label='data') plt.hold('on') plt.plot(x, y_rf1, color='b', label='DecisionTreeRegressor') plt.plot(x, y_rf2, color='g', label='RandomForestRegressor') plt.plot(x, y_rf3, color='r', label='ExtraTreesRegressor') plt.xlabel('data_x') plt.ylabel('data_y') plt.title('python_machine-learning_RandomForest(n_estimators=1000)-----心状学习') plt.legend() plt.text(x1_max-4, x2_max-1, u'$o---Sample-Point$') plt.show()
运行结果:
更多算法可以参看博主其他文章,或者github:https://github.com/Mryangkaitong/python-Machine-learning