目录
1、什么是集成学习
集成学习是一种将多个单独的学习模型组合成一个更强大的模型的技术。其目的是将多个模型(KNN、逻辑回归、SVM等)的预测结果,通过投票(少数服从多数)来提高整体预测的准确性和稳定性。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.linear_model import LogisticRegression
log_clf = LogisticRegression() #逻辑回归
log_clf.fit(X_train, y_train)
log_clf.score(X_test, y_test)
#0.864
from sklearn.svm import SVC
svm_clf = SVC() #SVM分类器
svm_clf.fit(X_train, y_train)
svm_clf.score(X_test, y_test)
#0.896
from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier(random_state=666) #决策树分类器
dt_clf.fit(X_train, y_train)
dt_clf.score(X_test, y_test)
#0.864
# 3个分类器的预测结果
y_predict1 = log_clf.predict(X_test)
y_predict2 = svm_clf.predict(X_test)
y_predict3 = dt_clf.predict(X_test)
#手动完成集成学习
y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype='int')
# >= 2 代表至少有2个模型,至多有3个模型认为预测结果等于1,此时,y_predict的结果就为1,否则为0(少数服从多数)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict) #查看预测准确度
#0.904
#由此可见,使用集成学习提升了我们机器算法的准确度
#使用sklearn中的集成学习Voting Classifier 接口
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('svm_clf', SVC()),
('dt_clf', DecisionTreeClassifier(random_state=666))],
voting='hard') #传入参数hard,即少数服从多数
voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test)
#0.904
2、Soft Voting Classifier
在某些情况下,少数服从多数是不合理的,比如在一个选拔比赛中,专业评委票的权重和普通人票的权重是不一样的,因此更加合理的投票方式应该占有一定的权值。
voting_clf2 = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('svm_clf', SVC(probability=True)),
('dt_clf', DecisionTreeClassifier(random_state=666))],
voting='soft') #参数改成soft
voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)
3、Bagging 和 Pasting
在集成学习中,从投票的角度看,即使有很多机器学习方法,但是仍然不够多。因此,我们可以创建更多的子模型,及集成更多子模型的意见,并且子模型之间要具备差异性,即是每个子模型只看样本数据的一部分。而这也分成两种方式:
- 放回取样(Bagging):每个子模型从m个样本中看抽取n个样本后又放回去,下一个子模型又从m个样本中抽取n个样本;
- 不放回样本(Pasting):每个子模型从m个样本中取样的样本是不会重复的。
一般来说,放回取样(Bagging)是更常用的,因为可以每次训练较多的样本,并且具有随机性。
代码示例:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500, max_samples=100,
# n_estimators参数表示集成几个子模型,max_samples参数表示每个子模型抽取多少样本数据
bootstrap=True) #bootstrap参数表示BaggingClassifier是放回取样(True)还是不放回取样(False)
bagging_clf.fit(X_train, y_train)
bagging_clf.score(X_test, y_test)