1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 机器学习sklearn-随机森林

机器学习sklearn-随机森林

时间:2020-08-21 16:22:31

相关推荐

机器学习sklearn-随机森林

目录

1 集成学习

2 随机森林分类器

2.1 随机森林分类器函数及其参数

2.2 构建随机森林

2.3 在交叉验证下比较随机森林和决策树

2.4 绘制n_estimators的学习曲线

3 随机森林回归器

3.1 随机森林分类器函数及其参数

3.2 用随机森林回归填补缺失值

4 机器学习调参的基本思想

4.1 相关概念

4.2 实例

1 集成学习

集成学习通过构建并结合多个学习器来完成学习任务,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。

集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现

多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器 (base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。

装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结 果。装袋法的代表模型就是随机森林。 提升法中,基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树。

要获得好的集成,个体学习器应该“好而不同”,即个体学习器不仅要有一定的准确性,而且学习器之间应该具有差异。

2 随机森林分类器

2.1 随机森林分类器函数及其参数

随机森林分类器的参数有许多和决策树的参数一致。其中控制基评估器的参数如下。

其他相关参数:

n_estimators:这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。random_state:随机森林的本质是一种装袋集成算法(bagging),装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。在刚才的红酒例子中,我们建立了25棵树,对任何一个样本而言,平均或多数表决原则下,当且仅当有13棵以上的树判断错误的时候,随机森林才会判断错误。单独一棵决策树对红酒数据集的分类准确率在0.85上下浮动,假设一棵树判断错误的可能性为0.2(ε),那20棵树以上都判断错误的可能性是: 其中,i是判断错误的次数,也是判错的树的数量,ε是一棵树判断错误的概率,(1-ε)是判断正确的概率,共判对25-i次。 所以随机森林判断错误的几率非常小,这让随机森林在红酒数据集上的表现远远好于单棵决策树。 sklearn中的分类树DecisionTreeClassififier自带随机性,所以随机森林中的树天生就都是不一样的,决策树从最重要的特征中随机选择出一个特征来进行分枝,因此每次生成的决策树都不一样,这个功能由参数random_state控制。 随机森林中其实也有random_state,用法和分类树中相似,只不过在分类树中,一个random_state只控制生成一棵树,而随机森林中的random_state控制的是生成森林的模式,而非让一个森林中只有一棵树。 当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的,这是 用”随机挑选特征进行分枝“的方法得到的随机性。并且我们可以证明,当这种随机性越大的时候,袋装法的效果一般会越来越好。用袋装法集成时,基分类器应当是相互独立的,是不相同的。 但这种做法的局限性是很强的,当我们需要成千上万棵树的时候,数据不一定能够提供成千上万的特征来让我们构筑尽量多尽量不同的树。因此,除了random_state。我们还需要其他的随机性。bootstrap & oob_score:要让基分类器尽量都不一样,一种很容易理解的方法是使用不同的训练集来进行训练,而袋装法正是通过有放回的随机抽样技术来形成不同的训练数据,bootstrap就是用来控制抽样技术的参数。 在一个含有n个样本的原始训练集中,我们进行随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本放回原始训练集,也就是说下次采样时这个样本依然可能被采集到,这样采集n次,最终得到一个和原始训练集一样大的,n个样本组成的自助集。由于是随机采样,这样每次的自助集和原始数据集不同,和其他的采样集也是不同的。这样我们就可以自由创造取之不尽用之不竭,并且互不相同的自助集,用这些自助集来训练我们的基分类器,我们的基分类器自然也就各不相同了。bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常,这个参数不会被我们设置为False。 有放回抽样也会有自己的问题。由于是有放回,一些样本可能在同一个自助集中出现多次,而其他一些却可能被忽略,一般来说,自助集大约平均会包含63%的原始数据。 因为每一个样本被抽到某个自助集中的概率为(逆向思维,减去某个样本永远不会被抽到概率): 当n足够大时,这个概率收敛于1-(1/e),约等于0.632。因此,会有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。除了我们最开始就划分好的测试集之外,这些数据也可以被用来作为集成算法的测试集。也就是说,在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。当然,这也不是绝对的,当n和n_estimators都不够大的时候,很可能就没有数据掉落在袋外,自然也就无法使用oob数据来测试模型了。 如果希望用袋外数据来测试,则需要在实例化时就将oob_score这个参数调整为True,训练完毕之后,我们可以用随机森林的另一个重要属性:oob_score_来查看我们的在袋外数据上测试的结果。

2.2 构建随机森林

随机森林是无法被可视化的。为了更加直观地体会随机森林的效果,我们来进行一个随机森林和单个决策树效益的对比。使用红酒数据集。

在红酒数据集上,随机森林的效果比决策树更好。

from sklearn.ensemble import RandomForestClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_winewine=load_wine()Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)#实例化clf=DecisionTreeClassifier()rfc=RandomForestClassifier()clf=clf.fit(Xtrain,Ytrain)rfc.fit(Xtrain,Ytrain)score_c=clf.score(Xtest,Ytest)score_r=rfc.score(Xtest,Ytest)print("Single Tree:{}".format(score_c))print("Random Forest:{}".format(score_r))

2.3 在交叉验证下比较随机森林和决策树

经过对比,可以发现随机森林的效果确实好于决策树,只有少部分情况下,两者的准确率相同,其他时刻,随机森林都优于决策树。

from matplotlib import colorsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.datasets import load_wineplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号wine=load_wine()Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)#实例化rfc=RandomForestClassifier(n_estimators=20) #设定基评估器数量clf=DecisionTreeClassifier()#进行交叉验证rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=15)clf_s=cross_val_score(clf,wine.data,wine.target,cv=15)#绘图plt.figure(figsize=(20,8),dpi=80)plt.plot(range(1,16),clf_s,color='blue',label="DecisionTreeClassifier")plt.plot(range(1,16),rfc_s,color='red',label="RandomForestClassifier")plt.xlabel('交叉验证次数')plt.ylabel('准确度')plt.legend(loc='best')plt.show()

2.4 绘制n_estimators的学习曲线

from matplotlib import colorsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.datasets import load_wineplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号wine=load_wine()Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)score=[]for i in range(100):rfc=RandomForestClassifier(n_estimators=i+1)rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10).mean()score.append(rfc_s)print("最高准确率{} 对应次数{}".format(max(score),score.index(max(score))))plt.figure(figsize=(20,8),dpi=80)plt.plot(range(1,101),score)plt.xlabel('基评估器数量')plt.ylabel('准确度')plt.show()

3 随机森林回归器

3.1 随机森林分类器函数及其参数

criterion:

回归树衡量分枝质量的指标,支持的标准有三种: 1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失。 2)输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差。 3)输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失。

3.2 用随机森林回归填补缺失值

在sklearn中,我们可以使用sklearn.impute.SimpleImputer来轻松地将均值,中值,或者其他最常用的数值填补到数据中,在这个案例中,我们将使用均值,中指,0,和随机森林回归来填补缺失值,并验证四种状况下的拟合状况,找出对使用的数据集来说最佳的缺失值填补方法。 任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为,特征矩阵和标签之前存在着某种联系。实际上,标签和特征是可以相互转换的,比如说,在一个“用地区,环境,附近学校数量”预测“房价”的问题中,我们既可以用“地区”,“环境”,“附近学校数量”的数据来预测“房价”,也可以反过来,用“环境”,“附近学校数量”和“房价”来预测“地区”。而回归填补缺失值,正是利用了这种思想。

对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵。那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分。

特征T不缺失的值对应的其他n-1个特征 + 本来的标签:X_train

特征T不缺失的值:Y_train

特征T缺失的值对应的其他n-1个特征 + 本来的标签:X_test

特征T缺失的值:未知,我们需要预测的Y_test

这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用。 那如果数据中除了特征T之外,其他特征也有缺失值怎么办? 答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少)。 填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。遍历所有的特征后,数据就完整,不再有缺失值了。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pandas.core.frame import DataFramefrom sklearn.datasets import load_bostonfrom sklearn.impute import SimpleImputerfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import cross_val_scoreboston=load_boston()# print(boston)# print(boston.data.shape)#存放完整的数据集,之后会对数据集进行缺失处理再填补,进而和原数据集作比较x_full,y_full=boston.data,boston.target #存放原始数据及特征n_samples=x_full.shape[0]#记录完整样本个数n_features=x_full.shape[1]#记录完整特征个数#为完整数据放入缺失值#确定缺失值的比例,这里我们假设为50%rng=np.random.RandomState(0)#确定一种随机模式missing_rate=0.5n_missing_samples=int(np.floor(n_samples*n_features*missing_rate))#向下取整,结果缺失数据总数 # print(n_missing_samples)#生成的缺失值要分布在数据的各行各列中miss_features=rng.randint(0,n_features,n_missing_samples) #3个参数依次为下限 上限 个数miss_samples=rng.randint(0,n_samples,n_missing_samples)#如果取出的随机数小于样本量 可以采用choice方法#missing_samples = rng.choice(n_samples,n_missing_samples,replace=False) #从左到右参数为最大值 所需要随机取数的个数 不会重复 保证数据更加分散#创造缺失的数据#拷贝原始完整数据后进行操作x_missing=x_full.copy()y_missing=y_full.copy()#将完整数据中一部分以缺失值替代x_missing[miss_samples,miss_features]=np.nan#转换为dataframe方便进行后续操作x_missing=DataFrame(x_missing)# print(x_missing)#使用均值填补缺失值imp_mean=SimpleImputer(missing_values=np.nan,strategy='mean')#实例化x_missing_mean = imp_mean.fit_transform(x_missing) #fit_transform 训练+导出predict#查看填补是否完成# print(pd.DataFrame(x_missing_mean).isnull().sum())#使用中值填补缺失值imp_median=SimpleImputer(missing_values=np.nan,strategy='median')#实例化x_missing_median = imp_median.fit_transform(x_missing) #fit_transform 训练+导出predict#查看填补是否完成# print(pd.DataFrame(x_missing_median).isnull().sum())#使用0进行填补imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0)x_missing_0 = imp_0.fit_transform(x_missing)#查看填补是否完成# print(pd.DataFrame(x_missing_0).isnull().sum())#使用随机森林填补缺失值x_missing_reg=x_missing.copy()#复制需要利用回归填补缺失值的矩阵#找出缺失值从小到大对应特征值排列的顺序 本质是找索引 从缺失最多的开始填充 sortindex=np.argsort(x_missing_reg.isnull().sum(axis=0)).values #argsort返回索引 利用values把数据取出#遍历填充缺失值for i in sortindex:#构建新特征矩阵(没有被选中去填充的特征+原始标签)和新标签(被选中去填充的特征)df=x_missing_regfillc=df.iloc[:,i] #新的特征矩阵df=pd.concat([df.iloc[:,df.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()]#被选中要填充的特征中,不存在的那些值 我们需要的不是ytest的值,而是其索引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_reg.loc[x_missing_reg.iloc[:,i].isnull(),i]=Ypredict #先利用iloc找出为nan的行索引# print(x_missing_reg.isnull().sum())#对所有数据进行建模,取得MSE结果X = [x_full,x_missing_0,x_missing_mean,x_missing_median,x_missing_reg]mse = []std = []for x in X:estimator = RandomForestRegressor()scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error', cv=5).mean()#使用负的均方误差打分mse.append(scores * -1)#将结果转正print(*zip(['x_full','x_missing_0','x_missing_mean','x_missing_median','x_missing_reg'],mse))#越小越好#绘图x_labels = ['Full data','Zero Imputation','Mean Imputation','Median Imputation','Regressor Imputation']colors = ['r', 'g', 'b','black', 'orange']plt.figure(figsize=(20, 8),dpi=80)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')ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1)#限定范围 x轴为mse取值ax.set_yticks(np.arange(len(mse)))#设置y刻度ax.set_xlabel('MSE')ax.set_yticklabels(x_labels)#更改y的刻度plt.show()

4 机器学习调参的基本思想

4.1 相关概念

模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升某个模型评估指标,比如对于随机森林来说,我们想要提升的是模型在未知数据上的准确率(由score或oob_score_来衡量)。找准了这个目标,我们就需要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做泛化误差(Genelization error)。

当模型在未知数据(测试集或者袋外数据)上表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)影响。看下面这张图,它准确地描绘了泛化误差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,模型就会欠拟合,拟合能力就不够,所以误差也会大。只有当模型的复杂度刚刚好的才能够达到泛化误差最小的目标。 对树模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂。所 以树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,所以随机森林也是天生复杂度高的模型。随机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左边移动,防止过拟合。当然了,调参没有绝对,也有天生处于图像左边的随机森林,所以调参之前,我们要先判断,模型现在究竟处于图像的哪一边。 泛化误差的背后其实是“偏差-方差困境”。偏差:模型的预测值与真实值之间的差异。方差:反映的是模型每一次输出结果与模型预测值的平均水平之间的误差。偏差衡量模型是否预测得准确,偏差越小,模型越“准”;而方差衡量模型每次预测的结果是否接近,即是说方差越小,模型越“稳”;一个好的模型,要对大多数未知数据都预测得即是说,当偏差和方差都很低的时候,模型的泛化误差就小,在未知数据上的准确率就高。 方差和偏差是此消彼长的,不可能同时达到最小值。 模型复杂度大的时候,方差高,偏差低。偏差低,就是要求模型要预测得“准”。模型就会更努力 去学习更多信息,会具体于训练数据,这会导致,模型在一部分数据上表现很好,在另一部分数据上表现却很糟糕。模型泛化性差,在不同数据上表现不稳定,所以方差就大。而要尽量学习训练集,模型的建立必然更多细节, 复杂程度必然上升。所以,复杂度高,方差高,总泛化误差高。相对的,复杂度低的时候,方差低,偏差高。方差低,要求模型预测得“稳”,泛化性更强,那对于模型来说,它就不需要对数据进行一个太深的学习,只需要建立一个比较简单,判定比较宽泛的模型就可以了。结果就是,模型无法在某一类或者某一组数据上达成很高的准确度,所以偏差就会大。所以,复杂度低,偏差高,总泛化误差高。我们调参的目标是,达到方差和偏差的完美平衡!虽然方差和偏差不能同时达到最小值,但他们组成的泛化误差却可以有一个最低点,而我们就是要寻找这个最低点。对复杂度大的模型,要降低方差,对相对简单的模型,要降低偏差。随机森林的基评估器都拥有较低的偏差和较高的方差,因为决策树本身是预测比较”准“,比较容易过拟合的模型,装袋法本身也要求基分类器的准确率必须要有50%以上。所以以随机森林为代表的装袋法的训练过程旨在降低方差,即降低模型复杂度,所以随机森林参数的默认设定都是假设模型本身在泛化误差最低点的右边。 我们在降低复杂度的时候,本质其实是在降低随机森林的方差,随机森林所有的参数,也都是朝着降低方差的目标去。1)模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点2)模型太复杂就会过拟合,模型太简单就会欠拟合3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动我们一直以来调参,都是在学习曲线上轮流找最优值,盼望能够将准确率修正到一个比较高的水平。然而我们现在了解了随机森林的调参方向:降低复杂度,我们就可以将那些对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些能最大限度让复杂度降低的参数。对 于那些不单调的参数,或者反而会让复杂度升高的参数,我们就视情况使用,大多时候甚至可以退避。

4.2 实例

查看n_estimators的学习曲线。

在确定好的范围,进一步细化学习曲线。

由于每一次训练集测试集划分的情况不同,所以可能出现细化后的表现不如之前,但是总体而言,细化后的曲线可以提供更为精确的参数选择范围。确定了基评估器的数量后,进一步使用网格搜索查找其他合适参数。

我们将使用网格搜索对参数一个个进行调整。为什么我们不同时调整多个参数呢?原因有两个:1)同时调整多个参数会运行非常缓慢,2)同时调整多个参数,会让我们无法理解参数的组合是怎么得来的,所以即便网格搜索调出来的结果不好,我们也不知道从哪里去改。在这里,为了使用复杂度-泛化误差方法(方差-偏差方法),我们对参数进行一个个地调整。调整max_depth

在调制了max_depth后,模型精确度上升,所以模型在泛化复杂度右边。

调整max_featuresmax_features是唯一一个即能够将模型往左(低方差高偏差)推,也能够将模型往右(高方差低偏差)推的参数。我们需要根据调参前,模型所在的位置(在泛化误差最低点的左边还是右边)来决定我们要将max_features往哪边调。 现在模型位于图像右侧,我们需要的是更低的复杂度,因此我们应该把max_features往更小的方向调整,可用的特征越少,模型才会越复杂。max_features的默认最小值是sqrt(n_features),因此我们使用这个值的两倍作为调参范围的最大值。调整min_samples_leaf对于min_samples_split和min_samples_leaf,一般是从他们的最小值开始向上增加10或20 面对高维度高样本量数据,如果不放心,也可以直接+50,对于大型数据,可能需要200~300的范围 如果调整的时候发现准确率无论如何都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度

此时min_samples_split反而让准确率下降,所以不设置改参数。

调整random_state

对准确率有所提升。

调整完毕,总结出模型的最佳参数

完整代码如下

from sklearn.datasets import load_breast_cancerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import cross_val_scoreimport matplotlib.pyplot as pltimport pandas as pdimport numpy as npdata = load_breast_cancer()#初步估计# scorel = []# for i in range(0,200,10):#rfc=RandomForestClassifier(n_estimators=i+1)#score=cross_val_score(rfc,data.data,data.target,cv=10).mean()#scorel.append(score)# print(max(scorel),(scorel.index(max(scorel))*10)+1)# plt.figure(figsize=[20,8],dpi=80)# plt.plot(range(1,201,10),scorel)# plt.show()#细化估计# scorel = []# for i in range(25,36):#rfc=RandomForestClassifier(n_estimators=i+1)#score=cross_val_score(rfc,data.data,data.target,cv=10).mean()#scorel.append(score)# print(max(scorel),([*range(25,36)][scorel.index(max(scorel))])) #在30-39范围内 取最大值对应的索引# plt.figure(figsize=[20,8],dpi=80)# plt.plot(range(25,36),scorel)# plt.show()#调整max_depth# param_grid = {'max_depth':np.arange(1, 20, 1)}# 一般根据数据的大小来进行一个试探,乳腺癌数据很小,所以可以采用1~10,或者1~20这样的试探# 但对于像digit recognition那样的大型数据来说,我们应该尝试30~50层深度(或许还不足够# 更应该画出学习曲线,来观察深度对模型的影响# rfc = RandomForestClassifier(n_estimators=32)# GS = GridSearchCV(rfc,param_grid,cv=10)# GS.fit(data.data,data.target)# print(GS.best_params_,GS.best_score_)#调整max_features#现在模型位于图像右侧 我们需要更低的复杂度#max_features的默认最小值是sqrt(n_features),因此我们使用这个值的两倍作为调参范围的最大值。# param_grid = {'max_features':np.arange(1,10,1)}# rfc = RandomForestClassifier(n_estimators=32,max_depth=11)# GS = GridSearchCV(rfc,param_grid,cv=10)# GS.fit(data.data,data.target)# print(GS.best_params_,GS.best_score_)#调整min_samples_leaf#对于min_samples_split和min_samples_leaf,一般是从他们的最小值开始向上增加10或20#面对高维度高样本量数据,如果不放心,也可以直接+50,对于大型数据,可能需要200~300的范围#如果调整的时候发现准确率无论如何都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度# param_grid={'min_samples_leaf':np.arange(1, 1+10, 1)}# rfc = RandomForestClassifier(n_estimators=32,max_depth=11,max_features=7)# GS = GridSearchCV(rfc,param_grid,cv=10)# GS.fit(data.data,data.target)# print(GS.best_params_,GS.best_score_)#调整random_state# param_grid={'random_state':np.arange(20,150)}# rfc = RandomForestClassifier(n_estimators=32,max_depth=11,max_features=7)# GS = GridSearchCV(rfc,param_grid,cv=10)# GS.fit(data.data,data.target)# print(GS.best_params_,GS.best_score_)#确定最终参数rfc = RandomForestClassifier(n_estimators=39,max_depth=11,max_features=7,random_state=66)score = cross_val_score(rfc,data.data,data.target,cv=10)print(score)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。