一、集成学习介绍
基础集成技术:最大投票法(max voting)、平均法(averaging)、加权平均法(weighted average)
高级集成技术:堆叠(stacking)、混合(Blending)
1.例子买车:
1.问别人哪种车好
2.上网查询其价格
3.4S店去问
4.综合各种信息买到自己想要的车
最大投票方法通常用于分类问题。这种技术中使用多个模型来预测每个数据点。每个模型预测都被视为一次“投票”。大多数模型得到的预测被用作最终预测结果。
model1 = tree.DecisionTreeClassifier()
model2 = KneighborsClassifier()
model3 = LogisticRegression()
model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)
pred1 = model1.predict(x_test)
pred2 = model2.predict(x_test)
pred2 = model3.predict(x_test)
final_pred = np.array([])
for i in range(0,len(x_test)):
final_pred = np.append(final_pred,model([pred1[i],pred2[i],pred3[i]))
平均法类似于最大投票技术,这里对每个数据点的多次预测进行平均。在这种方法中,我们从所有模型中取平均值作为最终预测。平均法可用于在回归问题中进行预测或在计算分类问题的概率时使用。
finalpred = (pred1+pred2+pred3)/3
加权平均法是平均法的扩展。为了所有模型分配不同的权重,定义每个模型的预测重要性。
finalpred = pred1*0.3+pred2*0.3+pred3*0.4
二 、 高级集成技术
1.模型的堆叠(stacking)
2.模型的融合(blending)
堆叠是一种集成学习技术,它使用多个模型(例如决策树、knn或svm)的预测来构建新模型。该模型用于对测试集进行预测。
以下是简单堆叠集成法的逐步解释:
第一步:把训练集分成10份:
第二步:基础模型(假设是决策树)在其中9分上进行拟合,并对第10份进行预测。
第三步:对训练集上的每一份如此做一遍。
第四步:然后将基础模型(此处是决策树)拟合到整个训练集上。
第五步:使用此模型,在测试集上进行预测。
第六步:对另一个基础模型(比如knn)重复上述的2-4步,产生对训练集合测试集的另一组预测。
第七步:训练集的预测被用作构建新模型的特征
第八步:该新模型用于对测试预测集(test prediction,上图的右下角)进行最终的预测。
示例代码
我们首先定义一个函数来对n折的训练集合测试集进行预测。此函数返回每个模型对训练集和测试集的预测。
def stacking(model,train,y,test,n_fold):
folds = StratifiedKFold(n_splits=n_fold,random_state=1)
test_pred = np.empty((test.shape[0],1),float)
train_pred = np.empty((0,1),float)
for train_indices,val_indices in folds.split(train,y.values):
x_train,x_val = train.iloc[train_indices],train.iloc[val_indices]
y_train,y_val = y.iloc[train_indices],y.iloc[val_indices]
model.fit(X=x_train,y=y_train)
train_pred=np.append(train_pred,model.predict(x_val))#取train的1/n来得到下一层的输入
test_pred=np.append(test_pred,model.predict(test))#得到的是这个测试集的新特征
return test_pred.reshape(-1,1),train_pred
现在我们将创建两个基本模型:决策树和knn。
model1 = tree.DecisionTreeClassifier(random_state=1)
test_pred1,train_pred1 = Stacking(model=model1,n_fold=10,train=x_train,test=x_test,y=y_train)
train_pred1 = pd.DataFrame(train_pred1)
test_pred1 = pd.DataFrame(test_pred1)
model2 = KNeighborsClassifier()
test_pred2,train_pred2 = Stacking(model=model2,n_fold=10,train=x_train,test=x_test,y=y_train)
train_pred2 = pd.DataFrame(train_pred2)
test_pred2 = pd.DataFrame(test_pred2)
创建第三个模型,逻辑回归,在决策树和knn模型的预测之上。
df = pd.concat([train_pred1,train_pred2]),axis=1)
df_test = pd.concat([test_pred1,test_pred2],axis=1)
model = LogisticRegression(random_state=1)
model.fit(df,y_train)
model.score(df_test,y_test)
为了简化上面的解释,我们创建的堆叠模型只有两层。决策树和knn模型建立在零级,而逻辑回归模型建立在第一级。其实可以随意的在堆叠模型中创建多个层次。