|
20鱼币
这次我需要完成一个自己书写集成类学习的方法,但是由于bagging的方法需要生存n个分类器,所以需要训练n次麻。clf.fit(x_train,y_train) 我需要每次都生成一个新的分类器么? dt = DecisionTreeClassifier(**best_para_DT )
还是每次我只要在函数初始化的时候输入一个clf 然后只要不停的调用fit(x,y) 而不需要每次新生成 dt = DecisionTreeClassifier(**best_para_DT ) 就可以了
- class Bagging_DT(object):
- '''
- 算法步骤:
- 1. 随机k次抽取m百分比数据
- 2. 每次生成一个分类器,最终生成k个分类器
- 3. 结果由k个分类器取平均值产生
- '''
- def __init__(self , k , best_para ):
- self.k = k #int
- self.best_para = best_para # model 的实例对象,
- def fit(self, x, y):
- x = np.array(x)
- y = np.array(y)
- leg = len(x)
- self.clf_set = []
- for i in range(self.k):
- dt = DecisionTreeClassifier(**best_para_DT ) #将最好的参数输入
- rand_series = np.random.randint(leg, size = leg) #有放回的生成随机数
- dt.fit(x[rand_series], y[rand_series]) #训练svm
- self.clf_set.append(dt) #训练好的svm模型放入
- return self.clf_set
- def predict(self,x):
- results = []
- x = np.array(x)
- for clf in self.clf_set:
- clf_result = clf.predict(x)
- results.append(clf_result)
- #结果返回的是平均值
- res_score = np.mean( np.array(results) , axis= 0)
- res_clf = res_score.copy() #返回的是平均值
- res_score[res_score >= 0.5 ]= 1
- res_score[res_score < 0.5 ]= 0
- return res_score ,res_clf
- # DT bagging 的实现
- bag_DT = Bagging_DT(10000, best_para_DT)
- model_DT = bag_DT.fit(x_train_DT , y_train_DT )
- pred_DT , pred_score_DT = bag_DT.predict(x_val_DT)
- scc_DT = accuracy_score(y_val_DT , pred_DT)
- print(f"决策森林对应的正确率为{scc_DT:.3f}")
- auc_DT = roc_auc_score (y_val_DT , pred_score_DT)
- print(f"决策森林对应的auc为{auc_DT:.3f}")
复制代码
|
|