1.集成算法(ensemble )
1.集成评估器
bagging | 多个相互独立的评估器,对其预测进行平均或多数表决原则来决定评估器的结果 |
boosting | 基评估器相关,按顺序一一构建,结合若评估器构成强评估器 |
2.RandomForestClasifier
1.决策树思想
2.基评估器参数
3.n_estimators
控制树木的数量,对模型精确度影响是单调增的,但有决策边界,过大会影响训练时间
super=[] for i in range(200): rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1) rfc_score = cross_val_score(rfc,wine.data,wine.target,cv=10).mean() super.append(rfc) print(max(super),super.index(max(super))) plt.figure(figsize=[20,5]) plt.plot(range(1,201),superpa) plt.show()
结果显示到一定极限不再单增
4.决策树和随机森林的关系
rfc_l = [] clf_l = [] for i in range(10): clf = DecisonTreeClassifier() clf_score = cross_val_score(clf,wine.data,wine.target,cv=10).mean() clf_l.append(clf_score) rfc = RandomForestClassifier(n_estimator=10) rfc_score = cross_val_score(rfc,wine.data,wine_target,cv=10).mean() rfc_l.append(rfc_score) plt.plot(range(1,11),rfc_l,label="Random Forest") plt.plot(range(1,11),clf_l,label="Decision Tree") plt.legend() plt.show()
结果显示单个决策树的准确率越高,随机森林的准确率也越高
5.random_state
rfc = RandomForestClassifier(n_estimators=20,random_state=2) rfc = rfc.fit(Xtrain, Ytrain) #随机森林的重要属性之一:estimators,查看森林中树的状况 rfc.estimators_[0].random_state for i in range(len(rfc.estimators_)): print(rfc.estimators_[i].random_state)
生成不同的决策树的random_state,使每棵树不一样,如果没有随机性的话将会和
决策树相同,但仍然有局限性
6.bootstrap&oob_score
bootstrap可以在采取不同的训练集使每棵树使不同的,增强随机性
bootstrap | 采用有放回的随机抽样方法,默认值为True |
oob_score | 有放回的抽样技术,当n过大会使约37%的数据无法被采集到,所以避免浪费使用这些数据用作测试集,但需将参数设置为True,此时无需划分训练集测试集 |
rfc = RandomForestClassifier(n_estimators=25,oob_score=True) rfc = rfc.fit(wine.data,wine.target) #重要属性oob_score_ 用于查看始终未被抽取到掉落在袋外的被当作测试集的测试结果 rfc.oob_score_
7.其他重要属性和接口
rfc.estimators_ rfc.estimators_[i] #用于查看随机随林中树的random_state rfc.oob_score_ #查看袋口外测试集的结果 rfc.feature_importances_ #查看每一特征的权重 rfc.apply(Xtest) #输入测试集查看每个样本所在叶子节点的索引 rfc.predict(Xtest) #输入测试集查看每个样本的标签 rfc.predict_proba(Xtest) #(每一测试样本分到哪一结果的概率,根据这个给出相应的标签,如0.7--》1 #.而在袋装法中,这一个数值来自于sklearn的平均概率)
3.RandomForestRegressor
与回归树原理相同,同样多出了n_estimators参数
4.用回归森林填补缺失值案例
x_missing = x_full.copy() y_missing = y_full.copy() x_missing_reg = x_missing.copy() #得到填充值的桥梁,用数据上处理的话填完0就找不到缺失值了 sortindex = np.argsort(x_missing_reg.isnull().sum(axis=0)).values #按列求空值数量,排序并取出对应索引,values变成数组形式 for i in sortindex: #先取多的进行填补 #构建新矩阵 df = x_missing_reg fillc = df.iloc[:,i] #矩阵1 需填补的列 df = pd.concat([df.iloc[:,df.columns != i],pd.Dataframe(y_full),axis=1) #在新矩阵中进行填补 矩阵二无缺失值的无填补的列 df_0 = SimpleImputer(missing_values = np.nan ,strategy = 'constant' ,fill_values=0).fit_transform(df) #训练集和测试集 X_train = df_0[fillc.notnull(),:] Y_train = fillc[fillc.notnull()] X_test = df_0[fiilc.isnull(),:] Y_test = fillc[fillc.isnull()] # 填补缺失值 rfc = RandomForestRegressor(n_estimators = 100) rfc = rfc.fit(X_train,Y_train) Ypredict = rfc.predict(Xtest) #补回原始矩阵 x_missing_reg.loc[x_missing_reg.iloc[:,i].isnull(),i] = Ypredict
5.调参中的泛化误差思想
模型的复杂度和泛化误差的关系
偏差、方差
6.bagging vs boosting