集成学习的目的是同个几个若分类器以提升或者并行投票的方式得到一个强的集成分类器。
一、简单集成
可以用 moons 数据集制造数据对这个数据分别用Logistic
、decisionTree
和 svm
进行分类, 再用VotingClassifier
集成这几个分类器
用 make_moons
生成随机数据后:
def Vot_clf(voting_type):
log_clf = LogisticRegression()
tree_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
svm_clf = SVC(kernel = 'linear' ,probability = True)
return VotingClassifier([('lr', log_clf),
('tree', tree_clf),
('svc', svm_clf)],
voting = voting_type)
如果所有分类器都能预测类别的概率,那就可以让sklearn
以最高的类概率来预测这个类, 平均在所有的分类器上,该方法为软投票。
这种方法,经常会比硬投票表现的更好,因为他给与搞自信的投票权权重更大。
由于SVC
一般不会输出概率, 所以需要对修改超参数 probability = True
。这样会使得SVC
使用交叉验证去预测类别概率,降低训练速度,但会添加
predict_proba()方法
比较弱分类器和集成分类器的效果
def Acc_of_clf(x, y, x_t, y_t, voting_type):
log_clf = LogisticRegression()
tree_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
svm_clf = SVC(kernel = 'linear' ,probability = True) # 用以软投票
vot_clf = Vot_clf(voting_type)
for clf in (log_clf, tree_clf, svm_clf, vot_clf):
clf.fit(x, y)
print(clf.__class__.__name__, "准确率%.4f" %(clf.score(x_t, y_t)))
def plot_moom(m_x, m_y):
x_1 = [ m_x[i][0] for i in range(len(m_x))]
x_2 = [ m_x[i][1] for i in range(len(m_x))]
plt.scatter(x_1, x_2, c = m_y)
if __name__ == '__main__' :
x, y, x_t, y_t = get_moons_data()
Acc_of_clf(x, y, x_t, y_t,'soft')
plot_moom(x, y)
plt.show()
"""
hard:
LogisticRegression 准确率0.8700
DecisionTreeClassifier 准确率0.8600
SVC 准确率0.8700
VotingClassifier 准确率0.8700
soft:
LogisticRegression 准确率0.8700
DecisionTreeClassifier 准确率0.8600
SVC 准确率0.8700
VotingClassifier 准确率0.8800
"""
由上述的结果中可以看出集成分类器的效果更佳
二、Bagging
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
if __name__ == '__main__' :
x, y, x_t, y_t = get_moons_data()
dec_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
bag_clf = BaggingClassifier(dec_clf, #大小为[n_samples,n_features]
n_estimators=500, ## 500个基分类器
max_samples=100, ##
bootstrap=True, ## Fasle 即为Pasting
n_jobs=-1)
bag_clf.fit(x, y)
y_prd = bag_clf.predict(x_t)
plt.subplot(121)
plot_moom(x_t,y_t); plt.title("The real Class")
plt.subplot(122)
plot_moom(x_t, y_prd); plt.title("The predicted Class")
plt.show()
从圈起来的地方还是可以看出Bagging的分类具有一定优势。
对于Bagging 来说,一些实例可能会被一些分类器重复采样,但是其他的可能不被采用。算法默认为(boostrap = True)
即有放回的采样m个实例,其中m是训练集的大小,这就说明仅仅63%的样本进入了分类器,剩余的37%未被采用,这些实例叫做Out of Bag
(每个分类器的37%均不同),因此可以拿分类器的oob
来评估集成本身。
if __name__ == '__main__' :
x, y, x_t, y_t = get_moons_data()
dec_clf = DecisionTreeClassifier(random_state = 42,max_depth = 3)
bag_clf = BaggingClassifier(dec_clf, #大小为[n_samples,n_features]
n_estimators=500, ## 500个基分类器
max_samples=100, ##
bootstrap=True, ## Fasle 即为Pasting
n_jobs=-1, oob_score=True)
bag_clf.fit(x, y)
print('Out-of-Bag 分值为:%.4f'% bag_clf.oob_score_)
##预测
y_prd = bag_clf.predict(x_t)
print('模型准确率为:%.4f' % accuracy_score(y_t, y_prd))
Out-of-Bag 分值为:0.8875
模型准确率为:0.8600
随机切片与子空间
BaggingClassifier
支持采样实例和特征——随机切片
max_sample
和bootstrap
是针对样本max_features
和bootstrap_features
是针对特征
当处理的样本维度较多的时候 特征的采样就较为重要了。
当保留所有的训练样本(比如bootstrap = True
和 max_sample = 1.0
), 但切片特征(booststap_features = True
并且/或者 max_features 小于 1.0
)的时候——随机子空间。
采集特征导致更多的预测多样性, 用高偏差换低方差。