这次我需要完成一个自己书写集成类学习的方法,但是由于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}")
|