本文正在参与「金石方案 . 瓜分6万现金大奖」
一.随机森林
1.1随机森林的构建
bootstrap参数代表的是bootstrap sample,也便是“有放回抽样”的意思,指每次从样本空间中可以重复抽取同一个样本(由于样本在第一次被抽取之后又被放回去了)
假设,原始样本是”苹果,”西瓜,”香蕉,桃子],那么经过bootstrap sample 重构的样本就可能是[西瓜,”西瓜,香蕉”,桃子],还有可能是[‘苹果,西瓜,桃子’,桃子],bootstrap sample生成的数据集和原始数据集在数据量上是彻底相同的,但由于进行了重复采样,因此其中有一些数据点会丢掉。
1.2 红酒数据集之随机森林
1.使用红酒数据集:
from sklearn.datasets import load_wine
wine = load_wine()
X=wine.data
y=wine.target
2.随机森林
from sklearn.model_selection import train_test_split
3.切分数据集:测验集30%
X_train, X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)
4.随机森林
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=25, random_state=3)
5.模型练习及评估
model.fit(X_train,y_train)
print('Trainscore:%f'%(model.score(X_train, y_train) ) )
print('Test score:%f '%(model.score(X_test,y_test) ) )
运转成果如下:
6.增加归一化:
按列归一化,使用 zero-score 零均值归一化算法
wine_X = X.copy()
for i in range(X.shape[1]):
column_X = X[:, i]
wine_X[:, i] = (column_X - column_X.mean())/column_X.std()
运转成果:
发现成果相同,说明随机森林,数据的归一化对其影响不大。
1.3加利福尼亚的房价数据之随机森林
1.加利福尼亚的房价数据:
from sklearn.datasets import fetch_california_housing
import pandas as pd
housing = fetch_california_housing()
X = housing.data
y = housing.target
df=pd.DataFrame()
for i in range(8):
df[housing["feature_names"][i]]=X[:,i]
df["target"]=y
df.to_csv("fetch_california_housing.csv",index=None)
pd.set_option('display.max_column', None)
df.describe()
2.进行数据归一化
wine_X = X.copy()
for i in range(X.shape[1]):
column_X = X[:, i]
wine_X[:, i] = (column_X - column_X.mean())/column_X.std()
3.随机森林
from sklearn.model_selection import train_test_split
4.切分数据集:测验集30%
X_train, X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)
5.模型练习及评估
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=25, random_state=3)
model.fit(X_train,y_train)
print('Trainscore:%f'%(model.score(X_train, y_train) ) )
print('Test score:%f '%(model.score(X_test,y_test) ) )
运转成果如下:
1.4为什么要生成bootstrap sample数据集?
这是由于经过重新生成数据集,可以让随机森林中的每一棵决策树在构建的时分,会彼此之间有些差异。再加上每棵树的节点都会去挑选不同的样本特征,经过这两步动作之后,可以彻底必定随机森林中的每棵树都不相同。
1.5 bootstrap sample数据集
模型会基于新数据集建立一棵决策树,在随机森林傍边,算法不会让每棵决策树都生成最佳的节点,而是会在每个节点上随机地挑选一些样本特征,然后让其中之一有最好的拟合体现。可以用max_features这个参数来操控所挑选的特征数量最大值的,在不进行指定的情况下,随机森林默认自动挑选最大特征数量。 假设把max_features设置为样本悉数的特征数n_features就意味着模型会在悉数特征中进行挑选,这样在特征挑选这一步,就没有随机性可言了。而假如把max_features的值设为1,就意味着模型在数据特征上彻底没有挑选的地步,只能去寻找这1个被随机选出来的特征向量的阈值了。 max_eatures的取值越高,随机森林里的每一棵决策树就会“长得更像”,它们由于有更多的不同特征可以挑选,也就会更简单拟合数据;反之,假如max_features取值越低,就会迫使每棵决策树的姿态愈加不同,而且由于特征太少,决策树们不得不制作更多节点来拟合数据。
n_estimators这个参数操控的是随机森林中决策树的数量。在随机森林构建完结之后,每棵决策树都会独自进行猜测。假如是用来进行回归剖析的话,随机森林会把所有决策树猜测的值取平均数;假如是用来进行分类的话,在森林内部会进行-“投票“-,每棵树猜测出数据类别的概率,比如其中一棵树说,“这瓶酒80%归于class_l”,别的一棵树说“这瓶酒60%归于class_2″,随机森林会把这些概率取平均值,然后把样本放入概率最高的分类傍边。
关于超大数据集来说,随机森林会比较耗时,不过我们可以用多进程并行处理的方法来解决这个问题。实现方法是调理随机森林的njobs 参数,记得把njobs参数数值设为和CPU内核数一致,比如你的CPU内核数是2,那么njobs参数设为3或许更大是没有意义的。当然假如你搞不清楚自己的CPU究竟就多少内核,可以设置njobs=-1,这样随机森林会使用CPU的悉数内核,速度就会极大提升了。
可以发现随机森林所进行的分类要愈加细腻一些,对练习数据集的拟合更好。可以自己试试调理n_estimator参数和random_state参数,看看分类器的体现会有怎样的变化。
1.6 随机森林的优势和缺乏
在机器学习范畴,无论是分类还是回归,随机森林都是使用最广泛的算法之一
- 优势
1.不需要过于在意参数的调理
2.不要求对数据进行预处理
3.集成了决策树的所有优点,而且可以补偿决策树的缺乏
4.支持并行处理
- 缺乏
1.关于超高维数据集、稀少数据集等,随机森林模型拟合优度欠安,线性模型要比随机森林的体现更好一些
2.随机森林相对更耗费内存,速度也比线性模型要慢
1.7 决策树